C pointeurs et tableaux / opérateur ‘sizeof’

Duplication possible: différence de pointeur de stack pour le pointeur et le tableau de caractères

Pour illustrer ma question:

int main(void){ int myary[20]; int *myaryPtr; myaryPtr = myary; sizeof(myary); // Will it return 80? Correct? sizeof(myaryPtr); // Will it return 4? Correct? return 0; } 

Tout d’abord, mon hypothèse est-elle correcte?

Et en supposant que mon hypothèse soit correcte, quelle est l’explication détaillée? Je comprends que mon tableau de 20 éléments compte 80 octets, mais le nom myary n’est-il pas simplement un pointeur sur le premier élément du tableau? Donc, ne devrait-il pas être aussi 4?

Oui, votre hypothèse est correcte, en supposant qu’un int et un pointeur ont tous deux 4 octets de long sur votre ordinateur.

Et non, les tableaux ne sont pas des pointeurs. Le nom du tableau se désintègre parfois en pointeur dans certains contextes, mais ce n’est pas la même chose. Une section entière de la FAQ comp.lang.c est consacrée à ce sharepoint confusion commun.

La taille du tableau n’est pas stockée en mémoire dans les deux cas, que vous le int myArr[20] comme étant int myArr[20] ou int* myArrPtr .

Ce qui se passe, c’est que sizeof() est remplacé (par le compilateur) par une valeur constante .

Par conséquent, étant donné que myArr été spécifié avec une taille fixe avant la compilation, le compilateur sait à quel point la quantité de mémoire allouée est importante. Avec myArrPtr , vous pouvez allouer dynamicment différentes tailles de tableau, de sorte que seule la taille du type soit stockée.