Curso C/C++: Punteros

Punteros en C


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).

Operadores especiales de los punteros


Asignación


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).

Operaciones con punteros


Punteros-Arrays


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).

Funciones de stdlib.h malloc() y free()


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: