Para referenciar una variable se necesita un entero sin signo que almacene la dirección de memoria de donde empieza. a el tipo de dato que almacena esta dirección se le conoce como puntero.
operaciones con punteros
int *puntero = NULL ;Esto es una Declaración de un puntero a entero que que se llama puntero y apunta a null o a anda o como se quiera decir
*puntero = &integer;Ahora tenemos el puntero de antes que en vez de apuntar a null apunta a la dirección de &integer
Explicare como funciona internamente una matriz unidimensional y luego lo extrapolaré al caso general.
Una matriz unidimensional es una dirección de memoria estática a el tipo de dato declarado que además reserva tanta memoria como se indique en el corchete.
La manera de acceder a la dirección de memoria es usar
&matriz[0]el operador indirección del primer elemento, o directamente el nombre de la matriz en nuestro caso
matrizestas dos cosas son lo mismo, y es que el nombre de una matriz es un puntero estático con lo que no se puede modificar.
Si quiero saber cual es la siguiente dirección puedo hacer
matriz +1y si quiero lo que hay dentro de esa dirección puede hacer
* matriz +1o mejor aun
* (matriz +1)(para evitar problemas de prioridad ) que es lo mismo que:
matriz[1]
Vamos a extrapolarlo a más dimensiones, si yo tengo una matriz cuadrada lo que tengo es una matriz monodimensional de direcciones de memoria que apuntan a matrices monodimensionales.
Si yo ahora tengo una matriz declarada como
matriz[4][5],
matrizes una dirección de memoria a esta matriz pero además
matriz[0],
matriz[1]....
matriz[3]es el vector de direcciones de memoria que apuntan a los siguientes vectores. Y estos a su vez es lo mismo que:
*(matriz),
*(matriz +1)...
*(matriz +3).
Además se puede obtener
matriz[0][0]como
*(*(matriz))de manera general
matriz[i][j]como
*(*(matriz +i) +j)también lo es
*(matriz[i] +j)