c / c ++ pointeur sur un tableau vs pointeur sur un pointeur

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.