Punteros

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.

  1. Un puntero necesita saber el tipo de dato al que apunta. (este tipo le da información del tamaño en memoria )
  2. Todos los punteros ocupan lo mismo. (solo almacenan la dirección de la primera casilla de memoria )
  3. Un puntero puede apuntar a "null"
  4. & este es el operador dirección y sirve para obtener la dirección en vez del valor de la variable.
  5. * es el operador indirección, hace lo contrario que el operador dirección, da el valor de una variable que este en ese lugar.

operaciones con punteros

  • Declaración de 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
  • Asignación de puntero
     *puntero = &integer; 
    Ahora tenemos el puntero de antes que en vez de apuntar a null apunta a la dirección de &integer
    También se puede asignar la dirección de un puntero a otro si son del mismo tipo.
  • Comparación se puede ver si dos punteros son el mismo o cual este delante en posición de memoria.
  • sumar restar etc... técnicamente un puntero es un valor y se pueden hacer las operaciones propias de un entero positivo.
    Otra cosa es que tenga sentido , si a un puntero le sumas una unidad te iras a la dirección siguiente esto tiene sentido , pero sumar dos punteros pues puede tener más bien poco , así como restar dos punteros te va a ofrecer la cantidad de espacios que hay en memoria entre ellos y puede ser útil, multiplicar o dividir dos punteros pues más bien poco. estas cosas es mas cuestión de criterio que de poder hacer.

Relación ente punteros y matrices.

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
 matriz 
estas 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 +1 
y si quiero lo que hay dentro de esa dirección puede hacer
 * matriz +1 
o 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] 
,
 matriz 
es 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)