Está en la página 1de 24

PUNTEROS (APUNTADORES)

Integrantes: Eduardo Tigrero Basilio Jhon Byron Linez (Potter)

Concepto de puntero (apuntador)


Un puntero es una variable que contiene una direccin de memoria El tipo de variable que almacena una direccin se denomina puntero Los punteros se rigen por estas reglas bsicas:
h h h h

Un puntero es una variable como cualquier otra; Una variable puntero contiene una direccin que apunta a otra posicin en memoria En esa posicin se almacenan los datos a los que apunta el puntero En posicin almacenan datos los apunta puntero Un puntero apunta a una variable de memoria

Ejemplo 10.2
#include <stdio.h> #include <stdlib.h> i ld dlib h int main () { int i n=75; int*p=&n; printf("n=%d, &n=%p, p=%p\n",n,&n,p); ("& % " & printf("&p=%p\n",&p); system("PAUSE"); return 0; }

Declaracin de punteros
Al igual que cualquier variable, las variables punteros han de ser declaradas antes de utilizarlas. 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 (*) <tipo de dato apuntado>*<identificador de puntero> Float*f; Fl t

Inicializacin de punteros
La inicializacin de un puntero proporciona a ese puntero la direccin del dato correspondiente. Para asignar una direccin de memoria a un puntero se utiliza el operador de referencia &. &valor
Int i; h Int *p; h P=&i; /*asigna la direccin de i a p*/ h *p=50; /*asigna un valor a la direccin de memoria*/
h

Indireccion de punteros
El uso de un puntero para obtener el valor al que apunta, es decir, su dato apuntado se denomina indireccionar el puntero
#include <stdio.h> #include <stdlib.h> char c; int main() { char *pc; pc=&c; for(c='A';c<='Z';c++) printf("%c",*pc); printf("\n"); system("pause"); return 0; } }

Punteros null y void


Un puntero nulo no apunta a ninguna parte, no direcciona ningn dato valido en memoria lid
h

#define NULL 0 Int *ptr=0;

Otra forma de declarar un puntero nulo es asignar un valor de 0


h

Los punteros nulos se utilizan con frecuencia en programas con arrays de punteros 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 especifico. El mtodo es declarar el puntero como puntero void* denominado puntero genrico
h

Void *prt

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; h Int *ptr1=&valor_e; h Int **ptr5=&ptr1;
h

Punteros y Arrays
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 en C. no existen variables de cadena, i d nicamente constantes de cadena

Nombres de arrays como punteros


Un nombre de un array es simplemente un puntero. Supongamos que se tiene la siguiente declaracin de un array: In lista[5]={10,20,30,40,50} Si se manda a visualizar lista[0] se vera 10 y si se manda a visualizar *lista. Como un nombre de un array es un puntero, tambin se vera 10 0 Dado que un nombre de un array contiene la direccin del primer elemento del array, se debe indireccionar el puntero para obtener el valor del elemento

Arrays de punteros
Si se necesita reservar muchos punteros a muchos valores diferentes, se puede declara 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 especifico. La linea siguiente reserva un array de diez variables puntero a de variables a enteros: Int *ptr[10];

Inicializacin de un array de punteros a cadenas


La inicializacin de un array de punteros a cadenas se puede realizar con una declaracin similar a esta; Char * [12]={ f b *nombres_meses[12]={enero,febrero,marzo, abril,mayo,junio,julio,agosto,septiembre, b i b di i b } octubre,noviembre,diciembre};

Punteros de cadenas
Los punteros se pueden utilizar en lugar de ndices de arrays. Considrese la siguiente declaracin de un array de caracteres que contiene las letras del alfabeto; Char alfabeto[27]=ABCDE.z; P=&alfabeto[0] Printf(%c\n,*p);

Aritmtica de punteros
Al contrario que un nombre de un array, que es un puntero constante y no se puede modificar, un puntero es una variable que se puede modificar. d t d Como consecuencia, se pueden realizar ciertas operaciones aritmticas sobre punteros sumar restar entero ; hace apunte A un puntero se le puede sumar o restar un entero n; esto hace que apunte n posiciones adelante, o atrs del actual. Las operaciones no validas son; suma, multiplicacin o divisin entre dos punteros
h h h h

Float m[20]; Float *r; r=m; r++

Punteros constantes frente a punteros a constantes


Un puntero constante es un puntero que no se puede cambiar, pero que los datos apuntados por el puntero pueden ser cambiados. Por otra parte, un puntero a una constante se puede modificar para apuntar a una constante diferente, pero los datos apuntados por el puntero no se pueden cambiar

Punteros constantes
Para crear un puntero constante diferente de un array, se debe utilizar el siguiente formato:
<Tipo de dato>*const<nombre puntero>=<direccin de variable>; h Int x; h Int y; h Int *const p1=&x; h *p1=y, es legal ya que se cambia el contenido de memoria h p1=&y , no es legal ya que se cambia el valor del puntero
h

Punteros a constantes
El formato para definir un puntero a una constante es;
h h h h h h

Const<tipo de dato elemento>*<nombre puntero>=<direccin de constante>; Const int x=25; Const int y=50; Const int *p1=&x; P1=&y, p1 apunta a otra constante *p1=15, crea un error de compilacin * 1 15 d il i

Punteros constantes a constantes


El ultimo caso a considerar es crear punteros constantes a constantes utilizando el formato siguiente;
Const <tipo de dato elemento> *const <nombre puntero>=<direccion de constante>; h Const int x=25; h Const int *const p1=&x; h P1 es un entero constante que apunta a una constante entera x, cualquier intento de modificar p1 o bien *p1 producir un error
h

Punteros como argumentos de funciones


Cuando se pasa una variable a una funcin (paso por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero a una variable a una funcin (paso por direccin) se puede cambiar el valor de la variable
Void func1 (int *s, int t) h { h *s=6; 6 h t=25; h }
h

int i, j; i=5; j=7; 7 func1 (&i, j);

Punteros a funciones
Es posible crear punteros que apunten a funciones. En lugar de direccionar datos, los punteros de funciones apuntan a cdigo ejecutable. Al igual que los datos, las funciones se se almacenan en memoria y tienen direcciones iniciales. En C se pueden asignar las direcciones iniciales de funciones a punteros. Tales funciones se pueden llamar en un modo indirecto, es decir mediante un puntero cuyo valor es igual a la direccin inicial de la funcin en cuestin
h

Ti d F i ( li ) Tipo_de_retorno (*punteroFuncion) (<lista de parametros>);

Cont
Un puntero a una funcin es simplemente un puntero cuyo valor es la direccin del nombre de la funcin. Dado que el nombre es, en si mismo, un puntero; un puntero a una funcin es un puntero a un puntero constante

Inicializacin de un puntero a una funcin


La sintaxis general para inicializar un puntero a una funcin es: punteroFuncion = una funcin
double calculo (int*v; unsigned n); /*prototipo de funcin*/ double int h double (*qf) (int*, unsigned); /*puntero a funcin*/ h Int r[5]={3,5,6,7,1} h double x; h qf=calculo; /*asigna direccin de la funcin*/ h x=qf(r,5); /*llamada a la funcin con el puntero a funcin*/ = (r 5) /*llamada a la f ncin con el p ntero f ncin*/
h

Arrays de punteros de funciones


Ciertas aplicaciones requieren disponer de numerosas funciones, basadas en el cumplimiento de ciertas condiciones. Un mtodo para implementar tal aplicacin es utilizar una sentencia switch con muchos selectores case case. Otra solucin es utilizar un array de punteros de funcin. Se puede seleccionar una funcin de la lista y llamarla La sintaxis general de un array de punteros de funcin es:
h

tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)

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
Strcuct persona *p; /*se crea un puntero de estructura*/ h p=&empleado;
h