Está en la página 1de 21

Apuntadores

Apuntadores o punteros
Es una variable que contiene direcciones de otras

variables Las variables punteros contienen valores que son direcciones de memoria donde se almacenan datos. Un puntero es una variable que contiene una direccin de memoria, y utilizando punteros los programas puede realizar muchas tareas que no sera posible utilizando tipos de datos estndar.

Direcciones en memoria
Cuando una variable se declara, se asocian tres atributos

fundamentales con la misma: su nombre, su tipo y su direccin en memoria.


#include <stdio.h> void main() { int n = 203; printf ( "n = %d\n" ,n) ; printf ("&n = %p\n",&n) ; }

/ * visualiza el valor de n * / / * visualiza direccin de n * /

Ejemplo
#include <stdio.h> void main() { int n = 75; int *p = &n; printf(n=%d, &n=%p, p=%p\n",n,&n,p); printf ("&p = %p\n",&p); }

Declaracin de punteros
La declaracin de una variable puntero debe indicar al

compilador el tipo de dato al que apunta el puntero; para ello se hace preceder a su nombre con un asterisco (*)
int* ptrl; //Puntero a un tipo de dato entero char* ptr2; //Puntero a un tipo de dato char float *f; //Puntero a un tipo de dato float

Inicializacin (iniciacin) de punteros


Esttica
La inicializacin de un puntero proporciona a ese

puntero la direccin del dato correspondiente. Despus de la inicializacin, se puede utilizar el puntero para referenciar los datos direccionados. Para asignar una direccin de memoria a un puntero se utiliza el operador de referencia &
Dinmica
Este mtodo utiliza las funciones de asignacin de memoria malloc(), calloc(), realloc() y free()

Indireccin de punteros
Despus de definir una variable puntero, el siguiente

paso es inicializar el puntero y utilizarlo para direccionar algn dato especfico en memoria. El uso de un puntero para obtener el valor al que apunta, es decir, su dato apuntado se denomina indireccionar el puntero (desreferenciar el puntero); para ello, se utiliza el operador de indireccin *.
int edad; int* p_edad; p_edad= &edad; *p_edad= 50;

Ejemplo
#include <stdio.h> char c; int main(){ char *pc; pc = &c; for(c = 'A'; c <='Z'; c++) printf("%c", *pc) ; return 0; }

Puntero NULL
Un puntero nulo no apunta a ninguna parte en

particular, es decir, (un puntero nulo no direcciona ningn dato vlido en memoria). Un puntero nulo se utiliza para proporcionar a un programa un medio de conocer cuando una variable puntero no direcciona a un dato vlido. Para declarar un puntero nulo se utiliza NULL
char *p = NULL;

Puntero void
En C se puede declarar un puntero de modo que apunte a

cualquier tipo de dato, es decir, no se asigna a un tipo de dato especfico. El mtodo es declarar el puntero como un puntero void *, denominado puntero genrico.
void *ptr;
//declara un puntero void, puntero genrico

El puntero ptr puede direccionar cualquier posicin en

memoria, pero el puntero no est unido a un tipo de dato especfico. De modo similar, los punteros void pueden direccionar una variable float, una char, o una posicin arbitraria o una cadena.

Punteros a punteros
Un puntero puede apuntar a otra variable puntero.

Este concepto se utiliza con mucha frecuencia en programas complejos de C. Para declarar un puntero a un puntero se hace preceder a la variable con dos asteriscos (**) .
int valor_e = 100; int *ptrl = &valor_e; int **ptr5 = &ptrl; valor_e = 95; *ptrl= 105; **ptr5 = 99;

Ejemplo
char c = 'z'; char* pc = &c; char** ppc = &pc; char*** pppc = &ppc; ***pppc = 'm'; //cambia el valor de c a 'm

Punteros y Arrays
Los arrays y punteros estn fuertemente relacionados

en el lenguaje C. Se pueden direccionar arrays como si fueran punteros y punteros como si fueran arrays. La posibilidad de almacenar y acceder a punteros y arrays, implica que se pueden almacenar cadenas de datos en elementos de arrays. Sin punteros eso no es posible, ya que no existe el tipo de dato cadena (string) en C. No existen variables de cadena. nicamente constantes de cadena.

Nombres de arrays como punteros


Un nombre de un array es simplemente un puntero. Suponiendo

que se tiene la siguiente declaracin de un array:


int lista[5] = {10,20,30,40,50};

Si se manda visualizar lista[0] se ver 10

Pero, qu suceder si se manda visualizar *lista? Como un nombre de un array es un puntero, tambin se ver 10. Por lo tanto:

lista lista lista lista lista

+ + + + +

0 1 2 3 4

apunta apunta apunta apunta apunta

a a a a a

lista[0] lista[l] lista[2] lista[3] lista[4]

Ejercicio
Realizar un programa en lenguaje C que:
Pida 10 elementos y los guarde en un arreglo, utilizando

punteros que invierta los elementos de dicho arreglo e imprimirlos en pantalla.

Analizar
int x[6]={1,2,3,4,5,6}; int y[6],i; for (i=0; i<6; i++) y[i]=x[i];

for (i=0; i<6; i++) *(y+i)=*(x+i);

Arrays de punteros
Si se necesita reservar muchos punteros a muchos

valores diferentes, se puede declarar un array de punteros. Un array de punteros es un array que contiene como elementos punteros, cada uno de los cuales apunta a un tipo de dato especfico
int *ptr[lO];//reserva un array de 10 punteros a enteros int *ptr1[ ] ;//Array de punteros a int int (*ptr2)[ ] ;//Puntero a un array de elementos int int * (*ptr3)[];//Puntero a un array de punteros a int

Aritmtica de punteros
A un puntero se le puede sumar o restar un entero n; esto hace

que apunte n posiciones adelante, o atrs de la actual. Una variable puntero puede modificarse para que contenga una direccin de memoria n posiciones adelante o atrs.
float m[201; float *r; r = m; r++; //contiene la direccin del elemento siguiente

Operaciones no vlidas con punteros


No se pueden sumar dos punteros. No se pueden multiplicar dos punteros. No se pueden dividir dos punteros.

Arreglos como parmetros


Cuando un arreglo es pasado como parmetro

actualmente se esta pasando el puntero a la base del arreglo. Por lo tanto, los arreglos son pasados efectivamente como parmetros por referencia. Ejemplos
int F1 (int tamao, int data []) int F1(int tamao, int *data )
// son equivalentes

Arreglos como parmetros


Si se desea prevenir cualquier intento de cambiar los

valores de un arreglo debemos utilizar la palabra reservada const.


int F1(int tamao, const int data [])

Punteros a estructuras
Un puntero tambin puede apuntar a una estructura. Se puede declarar un puntero a una estructura tal como se declara un

puntero a cualquier otro objeto y se declara un puntero estructura tal como se declara cualquier otra variable estructura: especificando un puntero en lugar del nombre de la variable estructura.

struct persona { char nombre [30]; int edad; int altura; int peso; }; struct persona empleado={"Amigo, Pepe", 47, 182, 85); struct persona *p;//se crea un puntero de estructura p = &empleado;

También podría gustarte