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?
Réponses
Trop de publicités?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.
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 */
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.
Un tableau déclaré comme ceci
int a[10];
alloue de la mémoire pour 10 int
s. 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' int
s. 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
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]);