Si la expresión type name[count]
está escrita en alguna función, entonces le indica al compilador de C que asigne en los sizeof(type)*count
bytes del marco de la pila y calcule la dirección del primer elemento de la matriz.
Si la expresión type name[count]
se escribe fuera de todas las definiciones de funciones y estructuras, entonces le indica al compilador de C que asigne en los sizeof(type)*count
bytes del segmento de datos y calcule la dirección del primer elemento en la matriz.
name
en realidad es un objeto constante que almacena la dirección del primer elemento en la matriz y cada objeto que almacena una dirección de alguna memoria se llama puntero, por lo que esta es la razón por la que se trata name
como un puntero en lugar de una matriz. Tenga en cuenta que solo se puede acceder a las matrices en C a través de punteros.
Si count
es una expresión constante que se evalúa a cero, entonces le dice al compilador de C que asigne cero bytes en el marco de la pila o en el segmento de datos y devuelva la dirección del primer elemento de la matriz, pero el problema al hacerlo es que el primer elemento de la matriz de longitud cero no existe y no puede calcular la dirección de algo que no existe.
Esto es racional ese elemento no. count+1
no existe en la count
matriz de longitud, por lo que esta es la razón por la que el compilador de C prohíbe definir la matriz de longitud cero como variable dentro y fuera de una función, porque ¿cuál es el contenido de name
entonces? Que direccionname
almacena exactamente?
Si p
es un puntero, entonces la expresión p[n]
es equivalente a*(p + n)
Donde el asterisco * en la expresión derecha es la operación de desreferencia del puntero, lo que significa acceder a la memoria apuntada p + n
o acceder a la memoria cuya dirección está almacenada p + n
, donde p + n
es la expresión del puntero, toma la dirección p
y agrega a esta dirección el número n
multiplica el tamaño del tipo de puntero p
.
¿Es posible agregar una dirección y un número?
Sí, es posible, porque la dirección es un entero sin signo comúnmente representado en notación hexadecimal.