Punteros: diferencia entre matriz y puntero

¿Cuál es la diferencia entre a, & a, dirección del primer elemento a [0]? De manera similar, p es un puntero a un entero pero asignado como una dirección de matriz. ¿Ese puntero [] haría la aritmética del puntero y obtendría el valor según el tipo de datos? Además, ¿qué valor * espera? ¿Debería ser un puntero?

#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; 

Tenga en cuenta que en el caso de matrices (en la mayoría de los casos), digamos array a , ADDRESS_OF a es igual que ADDRESS_OF primer elemento de la matriz.ie, ADDRESS_OF(a) es lo mismo que ADDRESS_OF(a[0]) . & es el operador ADDRESS_OF y, por lo tanto, en el caso de una matriz a , &a y &a[0] son todos iguales.

Ya he enfatizado que en la mayoría de los casos, el nombre de una matriz se convierte en la dirección de su primer elemento; una excepción notable es cuando es el operando de sizeof, que es esencial para que funcione el malloc. Otro caso es cuando un nombre de matriz es el operando del operador & address-of. Aquí, se convierte en la dirección de toda la matriz . ¿Cual es la diferencia? Incluso si piensa que las direcciones serían de alguna manera “iguales”, la diferencia fundamental es que tienen diferentes tipos. Para una matriz de n elementos de tipo T, la dirección del primer elemento tiene el tipo ‘puntero a T’; la dirección de toda la matriz tiene el tipo ‘puntero a la matriz de n elementos de tipo T’; claramente muy diferente.

Aquí hay un ejemplo de esto:

 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 */ 

Para obtener más información, puede consultar The C Book.

En C, los punteros y matrices son muy similares. En su ejemplo, la única diferencia entre a y p es que sizeof a es 4 * (sizeof int) y sizeof p es el tamaño de un puntero, probablemente 4 u 8 según su plataforma. Aparte de eso, C realmente no diferencia entre punteros y matrices. Entonces a [0], * a, p [0] y * p son todos iguales. En algunos casos, incluso 0 [p] es válido. Solo hace aritmética de puntero.