258 votes

Est le nom du tableau un pointeur en C?

Est un tableau du nom d'un pointeur en C? Si non, quelle est la différence entre un tableau de nom et un pointeur de variable?

312voto

Thomas Padron-McCarthy Points 13131

Un tableau est un tableau et un pointeur est un pointeur, mais dans la plupart des cas tableau les noms sont convertis à des pointeurs. Un terme souvent utilisé, c'est qu'ils désintégration de pointeurs.

Voici un tableau:

int a[7];

un contient de l'espace pour sept entiers, et vous pouvez mettre une valeur dans l'un d'eux avec une affectation, comme ceci:

a[3] = 9;

Voici un pointeur:

int *p;

p ne contient pas d'espaces pour les entiers, mais il peut pointer vers un espace pour un entier. On peut par exemple régler le point à l'un des endroits dans le tableau a, comme la première:

p = &a[0];

Ce qui peut être déroutant, c'est que vous pouvez écrire ceci:

p = a;

Ce n'est pas de copier le contenu du tableau dans un dans le pointeur p (quoi que cela signifie). Au lieu de cela, le nom de la matrice a est converti en un pointeur sur son premier élément. De sorte que la cession ne porte la même que la précédente.

Maintenant, vous pouvez utiliser p d'une manière similaire à un tableau:

p[3] = 17;

La raison pour que cela fonctionne est que la matrice de l'opérateur de déréférencement en C, les "[ ]", est définie en termes de pointeurs. x[y] signifie: démarrer avec le pointeur de x, l'étape y des éléments de l'avant après que le pointeur pointe, et ensuite, prendre ce qui est là. En utilisant l'arithmétique des pointeurs de la syntaxe, x[y] peut aussi être écrite *(x+y).

Pour que cela fonctionne avec un tableau normal, comme notre une, le nom de l' un dans a[3] doit d'abord être converti en un pointeur vers le premier élément dans une). Puis nous avons étape 3 éléments de l'avant, et de prendre ce qui est là. En d'autres termes: l'élément à la position 3 dans le tableau. (Qui est le quatrième élément dans le tableau, puisque le premier est numéroté 0.)

Donc, en résumé, les tableaux de noms dans un programme C sont (dans la plupart des cas) convertis à des pointeurs. Une exception est lorsque nous utilisons le sizeof opérateur sur un tableau. Si l' un a été converti en un pointeur à ce concours, sizeof(a) donnerait la taille d'un pointeur et pas de le tableau réel, ce qui serait plutôt inutile, donc dans ce cas un des moyens le tableau lui-même.

47voto

pmg Points 52636

Lorsqu'un tableau est utilisé comme une valeur, son nom représente l'adresse du premier élément.
Quand un tableau n'est pas utilisé comme valeur de son nom représente la totalité de l'ensemble.

int arr[7];

/* arr used as value */
foo(arr);
int x = *(arr + 1); /* same as arr[1] */

/* arr not used as value */
size_t bytes = sizeof arr;
void *q = &arr; /* void pointers are compatible with pointers to any object */

32voto

John Bode Points 33046

Si une expression de type tableau (comme le nom du tableau) apparaît dans une expression plus grande et il n'est pas l'opérande de l' & ou sizeof opérateurs, alors le type de la matrice d'expression est convertie à partir de "N-élément de tableau de T" à "pointeur de T", et la valeur de l'expression est l'adresse du premier élément du tableau.

En bref, le nom du tableau n'est pas un pointeur, mais dans la plupart des contextes, il est traité comme s' il s'agissait d'un pointeur.

5voto

Grumdrig Points 6233

Un tableau déclaré comme ceci

int a[10];

alloue de la mémoire pour 10 ints. Vous ne pouvez pas modifier a mais vous pouvez faire de l'arithmétique des pointeurs avec a.

Un pointeur comme ce alloue la mémoire pour le pointeur p:

int *p;

Il n'alloue pas d' ints. Vous pouvez la modifier:

p = a;

et à l'utilisation tableau des indices que vous pouvez avec un:

p[2] = 5;
a[2] = 5;    // same
*(p+2) = 5;  // same effect
*(a+2) = 5;  // same effect

4voto

Michael Buen Points 20453

Le nom du tableau par lui-même donne un emplacement de mémoire, de sorte que vous pouvez traiter le nom du tableau comme un pointeur:

int a[7];

a[0] = 1976;
a[1] = 1984;

printf("memory location of a: %p", a);

printf("value at memory location %p is %d", a, *a);

Et d'autres chouettes trucs que vous pouvez faire pour pointeur (par exemple en ajoutant/soustrayant un décalage), vous pouvez également le faire à un tableau:

printf("value at memory location %p is %d", a + 1, *(a + 1));

De langage, si C ne pas exposer le tableau en tant que juste une sorte de "pointeur"(manière affectée, c'est juste un emplacement de mémoire. Il ne peut point arbitraire de l'emplacement dans la mémoire, ni ne peut être contrôlée par le programmeur). Nous avons toujours besoin de ce code:

printf("value at memory location %p is %d", &a[1], a[1]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X