Punteros C y arrays / operador ‘sizeof’

Posible duplicado: diferencia de puntero de stack para puntero y matriz de char

Para ilustrar mi pregunta:

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

En primer lugar, ¿mi suposición es correcta?

Y luego, asumiendo que mi suposición es correcta, ¿cuál es la explicación detallada? Entiendo que mi matriz de 20 elementos tiene 80 bytes, ¿pero no es el nombre myary simplemente un puntero al primer elemento de la matriz? Entonces, ¿no debería ser también 4?

Sí, su suposición es correcta, suponiendo que un int y un puntero tienen una longitud de 4 bytes en su máquina.

Y no, las matrices no son punteros. El nombre de la matriz a veces se descompone en un puntero en ciertos contextos, pero no son lo mismo. Hay una sección completa de las preguntas frecuentes comp.lang.c dedicada a este punto común de confusión.

El tamaño de la matriz no se almacena en la memoria en ningún caso, ya sea que lo declare como int myArr[20] o int* myArrPtr .

Lo que sucede es que sizeof() se reemplaza (por el comstackdor) con un valor constante .

Por lo tanto, como myArr se especificó con un tamaño fijo antes de la comstackción, el comstackdor sabe qué tan grande es la cantidad de memoria asignada. Con myArrPtr , puede asignar dinámicamente diferentes tamaños de matriz, por lo que solo se almacena el tamaño del tipo .