Los punteros vienen siendo variables que contienen una dirección de memoria, que suele sel la posición de otra variable de memoria. En este caso, se suele decir que la primera apunta a la segunda.
Para definir punteros, realizaremos el mismo método que usabamos para definir variables normales, pues los punteros son variables. La sintaxis es:
tipo *nombre;
- Tipo: es el tipo de variables a las que puede apuntar.
- Nombre: nombre del puntero (de la variable).
Vamos a ver como asignamos el valor de un puntero a otro puntero:
int valor; int *punt1, *punt2; punt1 = &valor; punt2 = punt1; De esta forma, puntero 1 y puntero 2 (punt1 y punt2) apuntan a valor, ya que punt1 apunta a valor y punt2 tiene el mismo valor que punt1.
Hay una cosa en particular sobre la asignación de punteros que cabe decir: en el caso de la asignación de punteros a arrays, se asigna al primer elemento del array o vector, en el ejemplo:
int vector[20], *punt1; punt1=vector;
El puntero tendría el valor del primer elemento del vector. Si por ejemplo quisiésemos acceder al 10 elemento, tendríamos que escribir vector[9] o *(punt1+9).
Como todos los datos, podemos estructurar un puntero en un vector o array. Por ejemplo, para declarar un array puntero de 20 elementos enteros, sería:
int *punt[20];
Podemos asignarle una dirección de variable entera a un elemento del array, por ejemplo el 10, para ello haríamos:
punt[9] = &variab;
Por último, podemos encontrar el valor de la variable de la siguiente forma:
*punt[9]; (que es lo mismo que mirar esa posición, que es la que le hemos asignado con anterioridad a la variable).
La función malloc() asigna memoria variable de forma dinámica a un puntero
La función free() devuelve la memoria variable ya asignada a un puntero
Considero que sería bueno ver un ejemplo de malloc() ya que es relativamente dificil entenderlo: