Taille des tableaux et des pointeurs

Voici mon exemple de code

#include void main() { int arr[]={1,2,3,4,5,6}; char *ptr,a; a='c'; ptr=&a; int *ptr1,a1; a1=4; ptr1=&a1; printf("%d %d %d",sizeof(arr), sizeof(ptr1), sizeof(ptr)); } 

Maintenant, pour autant que je sache, size me dira la taille requirejse pour stocker la variable, la sortie de celle-ci est maintenant

24 4 4

Pourquoi est la taille de arr=24 , après tout c’est juste un pointeur et il devrait avoir la taille = 4?

Merci.

“… après tout c’est juste un pointeur …”? Non, Array n’est pas un pointeur. Array est un object tableau: un bloc de mémoire continu solide qui stocke les éléments du tableau, sans aucun type de pointeur impliqué. Dans votre cas, le tableau a 6 éléments de taille 4 chacun. C’est pourquoi votre sizeof évaluée à 24.

L’idée fausse commune selon laquelle les tableaux sont des pointeurs a été démystifiée des millions de fois, mais elle continue à apparaître de temps en temps. Lisez la FAQ, revenez si vous avez des questions à ce sujet.

http://c-faq.com/aryptr/index.html

PS Comme l’a bien noté @ Joachim Pileborg dans sa réponse, le sizeof n’est pas une fonction. C’est un opérateur.


Un autre contexte dans lequel les tableaux se comportent différemment des pointeurs est l’opérateur unaire & opérateur (l’opérateur “adresse de”). Lorsque unary & est appliqué à un pointeur de type int * produit un pointeur de type int ** . Quand unary est appliqué à un tableau de type int [10] produit un pointeur de type int (*)[10] . Ce sont deux types très différents.

 int *p = 0; int a[10] = { 0 }; int **p1 = &p; /* OK */ int **p2 = &a; /* ERROR */ int (*p3)[10] = &a; /* OK */ 

C’est une autre source populaire de questions (et d’erreurs): parfois, les gens s’attendent à & produire un pointeur int ** lorsqu’ils sont appliqués à un tableau int [10] .

Si vous avez un tableau, sizeof renvoie la taille du tableau (notez qu’il s’agit de la taille en octets du tableau et non du nombre d’éléments du tableau), sinon il renvoie la taille du type ou de l’expression.

Toutefois, si vous transmettez le tableau à une fonction, le tableau se dégrade en un pointeur et les informations de taille sont perdues.

De plus, techniquement, sizeof n’est pas une fonction, c’est un mot clé spécial dans le langage, et peut également être utilisé sans parenthèses lorsqu’il est utilisé avec des expressions.

Les tableaux ne se décomposent pas en pointeurs à l’intérieur de sizeof ; sizeof(arr) renvoie la taille totale allouée pour le tableau qui, dans ce cas, est 6 * sizeof(int) .

De Wikipedia

Lorsque sizeof est appliqué au nom d’un tableau, le résultat est la taille en octets de l’ensemble du tableau. (Il s’agit de l’une des rares exceptions à la règle selon laquelle le nom d’un tableau est converti en un pointeur sur le premier élément du tableau.)

L’opérateur sizeof() ne vous donne pas le nombre d’éléments d’un tableau, il vous donne le nombre d’octets qu’une chose occupe en mémoire. Par conséquent:

 #include  int main() { char s[] = { 1, 2, 3, 4, 5, 0 }; int xs[] = { 1, 2, 3, 4, 5, 0 }; printf( "sizeof( s ) = %d\n", sizeof( s ) ); printf( "sizeof( xs ) = %d\n", sizeof( xs ) ); return 0; } sizeof( s ) = 6 sizeof( xs ) = 24