2010-06-10 6 views

Répondre

3

Du fait des déclarations en C suivent les règles de priorité de l'opérateur (par exemple abonnement tableau est évalué avant indirection), vous aurez besoin de parens pour déclarer des pointeurs sur les types de tableaux. Dans de nombreux cas d'utilisation

, il n'y a pas vraiment un avantage pratique sur l'utilisation d'une char * ordinaire, sauf qu'il est un moyen de faire respecter la taille du tableau, en particulier lorsqu'il est utilisé comme paramètre de fonction:

void foo(char bar[42]); 

est équivalent à

void foo(char *bar); 

et accepte toute char *, alors que

void foo(char (*bar)[42]); 

n'accepte que les pointeurs vers des tableaux de taille 42.

Comme l'accès aux éléments de bar dans ce dernier cas est lourd, il pourrait être une bonne idée de définir immédiatement un char * équivalent dans le corps de la fonction

char *baz = *bar; 

afin que vous puissiez utiliser souscription directe baz[13] au lieu de (*bar)[13].

3

Un pointeur vers un tableau de 12 caractères.

+0

'char' signifie octet, pas caractère. – dan04

+4

@dan, si vous allez être pédant, vous devriez aussi avoir raison. "Un objet déclaré comme type char est assez grand pour stocker n'importe quel membre du jeu de caractères d'exécution de base." (§6.2.5 de C99) Un 'char' ne peut pas contenir (par exemple) un caractère Unicode arbitraire, mais il peut contenir les caractères de base tels que définis par C. –

+0

@ dan04: Considérant que' char' convertit automatiquement sa valeur dans le caractère correspondant Caractère ASCII, je suis assez sûr que cela qualifie comme un personnage au moins dans un certain sens. – Maulrus

1

a est un pointeur pointant vers array of 12 characters.

+0

'a' n'est pas un pointeur de caractère. –

+0

@didier alors quel genre de pointeur est-il ... si je me trompe – Vijay

+0

C'est un ** pointeur **. Vous pourriez dire un pointeur * array *, mais il est inutile d'ajouter un adjectif au pointeur lorsque vous ajoutez * pointant vers * après. Écrire * le pointeur de caractère * est trompeur. –

15

Si vous êtes confus par une déclaration de C, vous pouvez utiliser le programme cdecl pour l'expliquer:

~$ cdecl 
Type `help' or `?' for help 
cdecl> explain char (*a)[12]; 
declare a as pointer to array 12 of char 
+3

cool, je ne le savais pas! (J'ai mon cahier avec une petite liste de decls étranges que j'ai tendance à oublier) +1 – ShinTakezou

+0

Je ne connaissais pas celui-ci, merci! – Dpp