Je pensais que tableau et pointeur étaient fondamentalement la même chose, jusqu’à ce que je lance ce programme:
int main() { int* a = new int(19); int b[1]; b[0] = 19; printf("*a: %d\na: %p\n &a:%p\n", *a, a, &a); printf("*b: %d\nb: %p\n &b:%p\n", *b, b, &b); delete a; }
la sortie est:
*a: 19 a: 0x7f94524000e0 &a:0x7fff51b71ab8 *b: 19 b: 0x7fff51b71ab4 &b:0x7fff51b71ab4
quelqu’un peut-il s’il vous plaît expliquer pourquoi la sortie de & b est la même chose que b?
Merci! -Erben
Les tableaux et les pointeurs ne sont pas les mêmes. Un pointeur peut se comporter comme un tableau (access par index, par exemple).
&b
est un pointeur sur tout le tableau et b
est un pointeur sur le premier élément. Ils peuvent indiquer une même adresse en mémoire, mais ce sont des choses totalement différentes.
+-------------------------------+ |+-----+-----+-----+-----+-----+| || | | | | || &b---->|| 0 | 1 | 2 | ... | N || || | | | | || |+-----+-----+-----+-----+-----+| +---^---------------------------+ | b
Eh bien, b
est un tableau. Sous la moindre excuse, il se décomposera en un pointeur sur le premier élément de b
. Notez cependant que les expressions b
et &b
ne sont pas équivalentes: b
décompose en un pointeur le premier élément, c’est-à-dire qu’il est de type int*
alors que &b
est un pointeur sur le tableau, c’est-à-dire qu’il est de type int(*)[1]
a
est une variable. Vous allouez de la mémoire en utilisant new
et assignez le résultat à ce pointeur. Vous pourriez décider de stocker quelque chose d’autre plus tard dans votre programme.
b
est différent. Ce n’est pas une variable dans le sens où il ne peut pas stocker différentes adresses. C’est un tableau ayant un emplacement de départ fixe.
Ainsi, b
et &b
sont les mêmes. Mais le contenu de a
et l’adresse réelle de a
sont différents.