• [^] # Re: dans une déclaration de type le * s'applique à l'identifiant de gauche

    Posté par . En réponse au message L'opérateur unaire * me laisse perplexe (pointeurs sur fonctions principalement). Évalué à 3.

    « ptr est de type "int *", soit pointeur sur int. »

    Et bien, justement, non! C'est *ptr qui est du type int. Bon en fait, c'est un peu une question de goût et de couleur, mais cette façon de voir les choses les simplifie grandement quand on passe à des déclarations plus compliquées.

    Dans le cas de déclaration pour un cast ou un argument de fonction, comme (int *), il faut s'imaginer qu'il existe un nom de variable qui a été omis dans l'expression, sachant qu'il ne pourrait de toutes façons n'apparaitre qu'à un seul endroit.

    Je conseille vivement la lecture de la section 5.12 du K&R qui donne moult détails ainsi même qu'un programme pour mieux comprendre les déclaration compliquées. En voici un extrait :

    char **argv; // argv: pointer to char
    int (*daytab)[13]; // daytab: pointer to array[13] of int
    int *daytab[13]; // daytab: array[13] of pointer to int
    void *comp(); // comp: function returning pointer to void
    void (*comp)(); // comp: pointer to function returning void
    char (*(*x())[])(); // x: function returning pointer to array[] of pointer to function returning char
    char (*(*x[3])())[5]; // x: array[3] of pointer to function returning pointer to array[5] of char
    

    Un autre extrait de la section A.8.8 :
    « For example, [example below] name respectively the types "integer", "pointer to integer", "array of 3 pointers to integers", "pointer to an unspecified number of integers", "function of unspecified parameters returning pointer to integer", and "array, of unspecified size, of pointers to functions with no parameters each returning an integer". »

    int
    int *
    int *[3]
    int (*)[]
    int *()
    int (*[])(void)