2010-12-08 23 views

Répondre

0
  1. Pointeur vers un tableau de quinze caractères.
  2. Pointeur de fonction. Prend un pointeur int et renvoie char
  3. Identique à 4
  4. Prototype de fonction. Prend char et retourne int.
+0

3 est plus susceptible d'être un typedef pour un pointeur de fonction (avec le mot-clé 'typedef' actuel laissé), qu'un prototype de fonction. 4 est un prototype de fonction, mais le type de retour est 'int *', pas 'int'. –

+3

3 n'est pas la même chose que 4. 3 est un pointeur de fonction, 4 est une fonction protype. Les parenthèses supplémentaires font beaucoup de différence. – thkala

+1

4 renvoie int pointeur, pas int –

1

Un truc simple pour savoir quel type d'un pointeur à est d'enlever tout le * et voir ce qui reste:

  1. char p[15];
  2. char p(int *a);
  3. int pt(char*);
  4. int pt(char*);

Ce que vous obtenez est une déclaration de variable du type que votre pointeur pointera vers. Ou pas dans le quatrième cas:

int *pt(char*); 

est un prototype de fonction et non une déclaration de pointeur valide.

EDIT:

La raison en est que, sans les parenthèses, l'appel de fonction « opérateur » a la priorité sur le pointeur opérateur de déréférencement. Dans le cas ci-dessus, la déclaration en anglais simple est:

Nous avons une fonction pt(char *), qui renvoie une int *

Alors que

int (*pt)(char *); 

se traduit par:

*pt est une fonction qui prend un char * et renvoie un int.

Ce qui signifie essentiellement que seul pt est un pointeur vers ce type.

2

Règle de base: Commencez à l'identifiant et lisez à droite quand vous le pouvez, à gauche quand vous le devez.

  1. Commencez par l'identificateur *. Dites-le, suivi de "est un". Mettez votre "pied gauche" d'un caractère à sa gauche.
  2. Lire à droite jusqu'à la fin ou ).Mettez votre "pied droit" d'un caractère à droite de l'endroit où se trouve ), si c'est ce que vous avez frappé.
    • Si vous voyez [42] alors que vous lisez à droite, dites "tableau de 42".
    • Si vous voyez un ( à vers la droite, dites "prise de fonction", puis recurse pour dire le type de chaque paramètre (mais omettez les noms des paramètres eux-mêmes), suivi de "et retour".
  3. Sautez maintenant sur votre pied gauche et lisez vers la gauche jusqu'à ce que vous atteigniez le début ou un (. Mettez votre pied gauche d'un caractère à gauche de la ( si c'est ce que vous frappez.
    • Si vous voyez un * ou un & alors que vous lisez vers la gauche, dites "pointeur vers" ou "référence vers".
    • Tout ce que vous voyez d'autre (par exemple, const, int, MyFoo), dites-le simplement.
  4. Si vous atteignez le début, vous avez terminé. Sinon, retournez sur votre pied droit et passez à l'étape 2.

* S'il n'y a pas d'identifiant, imaginez où il faut aller - difficile à savoir, mais il n'y a qu'un seul emplacement légal.

suivant ces règles:

  1. p est un pointeur sur un tableau de 15 carbonisation
  2. p est un pointeur de fonction pointeur prenant en int et le retour de carbonisation
  3. pt est un pointeur de fonction pointeur prenant char et retour int
  4. pt est un pointeur en prenant la fonction de pointeur carboniser et retour int
+0

Alors qu'il est bon d'avoir une règle complète, je dois admettre que mes pieds me font mal après tout ce saut ... :-) – thkala

+0

Et il vaut mieux ne pas porter des pantalons moulants si vous avez une longue déclaration à décoder :) –