Variables estáticas y dinámicas
Las variables pueden clasificarse en:
- Variables estáticas: la memoria se reserva en tiempo de compilación.
- Variables dinámicas: la memoria se reserva en tiempo de ejecución. Para acceder a ellas se usan punteros.
Punteros
Un puntero es una variable que almacena la dirección de memoria de otra variable.
Los dos operadores fundamentales son:
- Operador dirección (
&): obtiene la dirección de memoria de una variable. - Operador indirección (
*): accede al valor almacenado en la dirección apuntada.
int valor;
int *puntero;
puntero=&valor;
valor=5;
*puntero=5;
Nótese la diferencia: puntero=5 modifica la dirección almacenada, mientras que *puntero=5 modifica el valor apuntado.
Declaración e inicialización
Al declarar un puntero sin asignarlo a ninguna variable, es recomendable inicializarlo a NULL para evitar comportamientos indefinidos:
int *puntero = NULL;
Gestión dinámica de memoria
Para reservar y liberar memoria dinámica se usan las funciones malloc() y free() del fichero de cabecera <stdlib.h>:
#include<stdlib.h>
struct fecha {
int dia;
int mes;
int agno;
};
struct fecha *pFecha;
pFecha=(struct fecha *) malloc (sizeof(struct fecha));
if (pFecha==NULL){
printf("No hay suficiente memoria \n");
}
else {
free(pFecha);
};
Paso de parámetros por referencia
Para modificar el valor de una variable desde una función, se pasa su dirección como parámetro:
void circulo (float r, float *p, float *a){
*p=2*Pl*r;
*a=Pl*r*r;
}
Punteros con vectores y cadenas
En C, el nombre de un array es en sí mismo un puntero al primer elemento. Las siguientes asignaciones son equivalentes:
char *p, c, v[5];
c=*p;
p=&c;
p=v;
p=&v[0];
Punteros con matrices
Al pasar una matriz a una función, es necesario indicar también el número de columnas, ya que el puntero no tiene información sobre la estructura de la matriz:
void mifuncion(int *m, int f, int c){
(m+c*2+1)=…
}
Punteros con estructuras
Para acceder a los miembros de una estructura a través de un puntero se puede usar el operador -> o la notación (*puntero).campo:
struct fecha hoy;
struct fecha *phoy;
phoy=&hoy;
hoy.dia=28;
(*phoy).dia=28;
phoy->dia=28;
Las tres últimas líneas son equivalentes.
¡Salud y coding!