C notation pointeur par rapport à la notation de tableau: Lors du passage à la fonction
Ma question est base sur le code suivant:
int myfunct(int ary[], int arysize)
int myfunct2(int *ary, int arysize)
int main(void){
int numary[10];
myfunct(numary, 10)
myfunct2(numary, 10)
return;
}
int myfunct(int ary[], int arysize) {
//Whatever work is done
}
int myfunct2(int *ary, int arysize) {
//Whatever work is done
}
Est-il une raison pour utiliser l'un de ces plus de l'autre? D'élaborer, lorsque concerné avec des tableaux numériques, est-il une raison, on pourrait utiliser la notation pointeur sur tableau de notation. Si l'on utilise la notation pointeur puis à l'intérieur de la fonction de l'arithmétique des pointeurs serait utilisé, etc.. ET si l'on utilise le tableau [] la notation, on peut utiliser le tableau comme d'habitude. Je suis nouveau en programmation et actuellement, je ne vois aucun avantage à l'utilisation de la notation pointeur.
Ma question précise, est-il une raison pour passer d'un tableau numérique d'une fonction à l'aide du pointeur de la notation et, par conséquent, à l'aide du pointeur de manipulations à l'intérieur de la fonction.
OriginalL'auteur SystemFun | 2013-01-12
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de réelle différence fonctionnelle entre les deux notations. En C, lorsque vous passez une variable tableau à une fonction, il se désintègre à un pointeur, indépendamment de la notation. Cependant, à mon avis, le notation pointeur est préférable. Le problème avec
[]
notation en fonction des définitions, c'est que, à mon avis, il est quelque peu trompeur:Omniprésent erreur parmi les novices de programmeurs C est de supposer que
sizeof(array)
vous donnera le nombre d'éléments dans le tableau multiplié parsizeof(int)
, comme il l'aurait fait siarray
ont été d'une variable de tableau déclaré sur la pile. Mais la réalité est quearray
a été pourri à un pointeur, malgré la trompeuse[]
notation, et doncsizeof(array)
va êtresizeof(int*)
.array
est vraiment juste un pointeur vers le premier élément, ou peut-être un pointeur vers un entier affecté n'importe où.Par exemple, que l'on pourrait appeler
foo
comme ceci:Auquel cas le
[]
notation dans la définition defoo
est une sorte de publicité mensongère.oui ............,
Je pensais que vous l'avez compris ma réponse?
ary[0]
est*(ary + 0)
est*ary
, quel que soit le contexte. Si vous pouvez en utiliser un, vous pouvez utiliser les autres (dans des expressions)."En C, lorsque vous passez une variable tableau à une fonction, il se désintègre à un pointeur, indépendamment de la notation". Pas de. Un tableau se désintègre à un pointeur parce que la fonction prend un paramètre de pointeur. "Une omniprésente erreur parmi les novices de programmeurs C est de supposer que sizeof(tableau) vous donnera le nombre d'éléments dans le tableau multiplié par sizeof(int)". Non, si
array
étaient de type tableau, puissizeof(array)
vous donne TOUJOURS le nombre d'éléments de fois la taille du type de composant. Mais iciarray
n'est pas un tableau; il est de type pointeur (int *
).Ce que sont en train de parler? "Un tableau se désintègre à un pointeur parce que la fonction prend un paramètre de pointeur" est la même chose que de dire "quand vous passez une variable tableau à une fonction, il se désintègre à un pointeur". Une fonction ne peut pas très bien prendre un paramètre de tableau maintenant peut-il?
OriginalL'auteur Charles Salvia
Lorsque vous déclarez un paramètre de fonction comme un tableau, le compilateur ignore automatiquement la taille de la matrice (le cas échéant) et la convertit en un pointeur. C'est, cette déclaration:
est 100% équivalent à:
En fait, ce n'est pas sur la notation, mais sur le type réel:
Cela n'a rien à voir avec la façon dont vous accédez à
p
à l'intérieur de la fonction. En outre, la[]
opérateur n'est pas "la notation de tableau".[]
est un pointeur opérateur:est 100% équivalent à:
Si votre question est sur l'intérieur de la fonction, pourquoi votre code d'exemple de tout, mais que?
OriginalL'auteur melpomene
Ces déclarations sont absolument identiques. Pour citer la norme:
Standard C99 section 6.7.5.3 paragraphe 7
OriginalL'auteur newacct
Moderne C qui a de la longueur variable des tableaux depuis C99, la notation de tableau est préférable si est un tableau, je pense. Pour une dimensions des tableaux, vous pouvez faire des choses comme
et pour les deux dimensions
Donc la notation de tableau correspond beaucoup mieux à l'image générale. Un système sophistiqué de compilateur pourrait même ensuite de faire la vérification des limites, mais je ne sais pas du tout qui n'a pas encore.
int array[size]
a le même effet queint *array
encore, c'est à direarray
est toujours un pointeur, et lesize
est redondant, sauf pour servir de documentation. Dans la 2-D cas, le type dearray
estint (*)[size]
.OriginalL'auteur Jens Gustedt
Il vous suffit d'utiliser le tableau de notation pour les tableaux multidimensionnels. (Vous n'avez pas à fournir la taille de la première dimension).
OriginalL'auteur Neil