URL: https://linuxfr.org/forums/programmation-c--2/posts/lop%C3%A9rateur-unaire-me-laisse-perplexe-pointeurs-sur-fonctions-principalement Title: L'opérateur unaire * me laisse perplexe (pointeurs sur fonctions principalement) Authors: Zylabon Date: 2011年08月17日T16:28:15+02:00 Tags: Score: 0 J'ai du mal à me faire une idée de son fonctionnement, j'ai l'impression qu'il s'applique tantôt à ce qu'il y a à sa droite, tantôt à ce qu'il y a à sa gauche. là, l'opérateur s'applique à ce qu'il y a à sa droite : ```c int * ptr_sur_entier,entier; // déclare un pointeur sur int, et un int, donc c'est équivalent à : int (*ptr_sur_entier),entier; ``` pour définir un pointeur sur fonction : ```c int * f(void); // déclare une fonction qui retourne un pointeur sur entier, équivalent à: int * (f(void));// les parenthèses sont implicites dans la déclaration précédente ? int (*p_sur_f)(void); // déclare un pointeur sur fonction typedef int (*pf)(); // déclare le type pf "pointeur sur fonction qui retourne un entier" ``` Dans ce qui précède, l'étoile s'applique en gros à ce qu'il y a à sa droite, mais, les opérateurs de cast : ```c pf * tableau_pointeurs_fonctions = (pf *) malloc( sizeof(pf) * 4) // déclare un pointeur sur 4 pointeurs sur fonction qui retournent un int ``` pourquoi est-ce que l'opérateur de cast s'écrit (pf *) ? Est-ce qu'il y a une définition formelle de l'opérateur * qui explique cette syntaxe,, pf ( * chose_à_caster) n'aurait pas été plus cohérent ? D'autre part, je remarque que dans ce tableau, je peux mettre comme fonctions: ```c int f(); // sans avertissement int g(int, int, int); // sans avertissement int h(int,char); // là j'ai un "attention : assignment from incompatible pointer type" int i(char); // là de même, il y a un lien entre le type de l'argument et le type de retour vu du pointeur vers la fonction ? ``` par contre, si je fais un tableau de pointeurs vers des fonctions de la forme int f(int), je ne peux pas mettre de fonctions sans arguments dedans. Ça déclenche carrément une erreur "too few arguments" Je sais bien que toutes ces affectations n'ont pas de sens, c'est juste pour tenter de comprendre le compilateur (gcc 4.6 en l’occurrence), et à quoi ressemble un tableau de pointeur sur fonctions qui retournent un int en mémoire ? est-ce que les argument des fonctions de ce tableau changent sa représentation ? J'imagine que par ailleurs c'est très dépendant de l’architecture. J'ai essayé de formuler clairement mon interrogation, mais j'ai l'impression que tout m'échappe concernant les pointeurs sur fonctions en C, alors c'est décousu. Sinon... Est-ce qu'il est possible d'avoir plus d'avertissement qu'avec -Wall avec gcc ? Est-ce qu'il y a des compilos moins arrangeants sur les conversions de type, dont les avertissements m'aideraient à comprendre ? Où d'une manière générale un compilo qui donne de meilleures habitudes ? Qu'est-ce que je peux lire ou faire pour mieux comprendre ?