Pointeur / Tableau de syntaxe (char **p, *p[n]) en C/C++
Pour les pointeurs, je suis de se confondre avec les déclarations et les paramètres de la fonction quand utiliser des char ** ou char * ou *tableau[n], etc. Comme si une fonction prend un (*tableau[n]) paramètre dois-je passer à un **type?
J'ai essayer d'utiliser le bouton Droit de la Gauche de la règle et de savoir que p serait un pointeur vers un pointeur vers un char (char **p), et p est un tableau de n pointeurs (*p[n]), mais quelqu'un a dit que *p[n] et **p sont essentiellement équivalentes. Est-ce vrai?
OriginalL'auteur Crystal | 2010-02-21
Vous devez vous connecter pour publier un commentaire.
La lecture C declarators (c'est la partie de la variable avec l' * et []) est assez nuancée. Il y a quelques sites web avec des conseils:
Un
char**
est un pointeur vers (plusieurs) indicateur(s) (éventuellement plusieurs) char(s). Par exemple, il peut être un pointeur vers un pointeur de chaîne, ou un pointeur vers un tableau de pointeurs de chaîne.Un
char*[]
est un tableau de pointeurs sur char. Lorsque vous avez une fonction qui prend comme paramètre, le compilateur C rend "décroissance" dans unchar**
. Cela se produit uniquement à la première couche... donc, en prenant un complexe exemple,char*[4][]
devientchar*(*)[4]
. Lire les liens ci-dessus de sorte que vous pouvez comprendre ce que le diable que cela signifie.Ou vous pouvez faire une (très sensible) chose et faire un tas de typedefs. Je ne fais pas cela, mais jusqu'à ce que vous êtes bon à la lecture de declarators, c'est une bonne idée.
OriginalL'auteur Dietrich Epp
Dans le bon contexte (à savoir, arguments à une fonction), puis les déclarations suivantes sont équivalentes:
Des commentaires similaires s'appliquent à la définition d'une fonction (qui ont un bloc entre accolades à la place du point-virgule).
Dans tout autre contexte, il existe des différences importantes entre les notations. Par exemple:
Le premier dit qu'il y a quelque part un tableau d'une taille contenant 'char *' valeurs. La deuxième dit que quelque part - peut-être - il y a une valeur unique contenant un pointeur vers un pointeur de char. Le troisième dit que quelque part - peut-être - il y a un tableau de 12 pointeurs de caractère.
Cependant, tous les trois listes peuvent être référencées dans un peu de la même manière - en supposant qu'ils ont en réalité été défini et initialisé.
En outre, s'ils sont passés dans une fonction comme ceci:
alors la fonction peut être déclarée comme suit:
Les tableaux (list1, list3) décomposition de la matrice pour le pointeur vers le premier élément du tableau; liste 2, bien sûr, est déjà un pointeur vers un pointeur.
Un détail à noter dans une fonction telles que:
Le compilateur C ne permet pas de considérer que la déclaration différemment à partir de:
ou
En particulier, il ne permet pas de tableau de vérification des limites, et que la fonction est concerné, le 12 peut ainsi être absent.
C99 introduit VLA (variable length array) les types et également introduit une notation de "statique" et une taille dans les limites du tableau. Vous auriez besoin de les lire pour comprendre pleinement.
Il suffit de dire que dans une fonction comme la suite de la taille de la matrice a de l'importance, et il est déterminé au moment de l'exécution. Avec les tableaux à deux dimensions, en général, toutes les dimensions, sauf le premier besoin d'être spécifiée.
Citant la norme (section 6.7.5.3):
OriginalL'auteur Jonathan Leffler
Si
n==0
ensuite, ils font référence à la même mémoire. Tableau d'indexation est en fait un pointeur de plus un décalage.*(p[n])
serait le même que**(p+n)
. Vous pouvez voir par vous-même comment simple c'est en C, cararray[4]
et4[array]
vous donnera la même chose.OriginalL'auteur David Kanarek