Pointeurs – Différence entre tableau et pointeur

Quelle est la différence entre a, & a, Adresse du premier élément a [0]? De la même manière, p est un pointeur sur un entier mais est assigné comme adresse de tableau. Ce pointeur [] ferait-il une arithmétique de pointeur et récupérerait la valeur selon le type de données? De plus, quelle est la valeur * attendue? Cela devrait-il être un pointeur?

#include int main() { int a[]={5,6,7,8}; int *p= a; printf("\nThis is the address of a %u, value of &a %u ,Address of first element %u , Value pointed by a %u",a,&a,&a[0],*a); printf("\nThis is the address at p %u , value at p %u and the value pointed by p %d",&p,p,*p); printf("\n"); } This is the address of a 3219815716, value of &a 3219815716 ,Address of first element 3219815716 , Value pointed by a 5 This is the address at p 3219815712 , value at p 3219815716 and the value pointed by p 5 

 int a[]={5,6,7,8}; int *p= a; 

Notez qu’en cas de tableaux (dans la plupart des cas), disons tableau a , ADDRESS_OF a est identique au premier élément ADDRESS_OF du tableau.ie, ADDRESS_OF(a) est identique à ADDRESS_OF(a[0]) . & est l’opérateur ADDRESS_OF et donc dans le cas d’un tableau, &a et &a[0] sont identiques.

J’ai déjà souligné que dans la plupart des cas, le nom d’un tableau est converti en l’adresse de son premier élément. une exception notable est l’opérande de taille, ce qui est essentiel pour que malloc fonctionne. Un autre cas se présente lorsqu’un nom de tableau est l’opérande de l’opérateur & address-of. Ici, il est converti en l’ adresse du tableau entier . Quelle est la différence? Même si vous pensez que les adresses seraient en quelque sorte «les mêmes», la différence essentielle est qu’elles ont des types différents. Pour un tableau de n éléments de type T, l’adresse du premier élément est de type ‘pointeur sur T’; l’adresse du tableau entier est de type ‘pointeur sur tableau de n éléments de type T’; clairement très différent.

En voici un exemple:

 int ar[10]; int *ip; int (*ar10i)[10]; /* pointer to array of 10 ints */ ip = ar; /* address of first element */ ip = &ar[0]; /* address of first element */ ar10i = &ar; /* address of whole array */ 

Pour plus d’informations, vous pouvez vous référer à The C Book.

En C, les pointeurs et les tableaux sont très similaires. Dans votre exemple, la seule différence entre a et p est que sizeof a est 4 * (sizeof int) et sizeof p est la taille d’un pointeur, probablement 4 ou 8 en fonction de votre plate-forme. En dehors de cela, C ne fait pas vraiment la différence entre les pointeurs et les tableaux. Ainsi, a [0], * a, p [0] et * p sont tous identiques. Dans certains cas, même 0 [p] est valide. Il fait juste des arithmétiques de pointeur