Sunteți pe pagina 1din 27

Apuntadores 2

CLASE 18

Chiste del da

AGENDA
1

APUNTADORES
#include <archivo_cabecera> int main() { int i,j; int *p; p = &i; *p = 5; j = i; return 0; }

Apuntadores

Concepto Apuntador
Caractersticas de un Apuntador: Un puntero es una variable como cualquier otra. EXCEPTO QUE SOLO PUEDE ALMACENAR DIRECCIONES DE OTRAS VARIABLES COMUN Y CORRIENTES. Un puntero APUNTA a una variable en memoria.

MEMORIA

#include <stdio.h> void main() {

DIRECCIONES DE MEMORIA

int y = 25; int z=77; print f ( y = %d\n" , y) ; / * visualiza el valor de y * / printf ("&y = %p\n",& y) ; / * visualiza direccin de y * /
}
1000

1001

y = 25

1002

&y = 1002
y

25
77

1003

1004

z
1005

Apuntadores

Inicializacin de Apuntadores
int i; int *ptr; ptr=&i; /* define una variable i */ /* define un puntero a un entero ptr*/
/* Almacene la direccin de i en ptr */

Se puede acceder al valor de i por medio del apuntador ptr. void main(void) { int var1; int i=3; int *ptr; ptr = &i; var1=*ptr; var1++; *ptr=var1; }

0x5020 var1 0x5021

4 3 4 3

0x5022 i 0x5023

0x5024

..
0x8090

ptr

0x5022

Tipos Especiales

Generalidades Apuntadores
La macro NULL es una macro que representa un valor de CERO Alguna libreras la definen: STDEF. H, STDIO.H, STDLIB.H, STRING.H
La podemos definir #define NULL 0

char *ptr;

char *ptr = NULL;

Se utiliza la palabra reservada VOID en la declaracin de apuntadores, cuando se quiere que el puntero pueda apuntar a cualquier tipo de variables, int , char, float,.
Un puntero puede apuntar a otra variable puntero. Se hace uso del operador * dos veces
char letra = A; char *ptr1 = &letra;

char **ptr2 = &ptr1;

TOME APUNTE PA QUE NO SE DUERMA


Declaracin de apuntadores. Inicializacin de apuntadores. Referenciar (&): Apuntar a una direccin. Desrefereneciar (Indireccin *): Obtencin del valor al que apunta. Punteros a punteros. Punteros void y NULL. Funciones por referencia.

AGENDA
1

ARITMETICA DE PUNTEROS

Aritmtica de punteros
Un puntero es otra variable mas, que la nica diferencia es que est destinada a guardar direcciones de memoria.

Es muy til hacer que un puntero apunte a un elemento en memoria que este antes o despus del dato originalmente apuntado.
Si dato1,2 y 3 estan en posiciones contiguas de memoria, se puede recorrer todas estas posiciones con un apuntador, realizando la suma o la resta a este puntero.

dato1 dato2 dato3

34 21 18 .

ptr

int dato1=34,dato2=21,dato3=18; int *ptr=&dato1; ptr=ptr+1; //Queda apuntando a dato2 ptr++; //Queda apuntando a dato3
ptr--; //Apunta de nuevo a dato2

PUNTEROS Y ARREGLOS

Apuntadores y arreglos
En C se pueden direccionar arreglos como si fueran punteros y viceversa

int arreglo[4] = {2, 3, 10, 8};


int *ptrArr; ptrArr=&arreglo[0];
arreglo[0] 6050 arreglo arreglo[1] 6052

2 3 10

*ptrArr ptrArr

*(ptrArr+1) ptrArr+1

arreglo[2]

6054

*(ptrArr+2) ptrArr+2

arreglo[3]

6056

*(ptrArr+3) ptrArr+3

6058

6050
ptrArr

PUNTEROS Y ARREGLOS

Apuntadores y arreglos
Ejemplo: Imprimir arreglo de caracteres utilizando 4 formas diferentes
#include <stdio.h> int main(void){ char arreglo[5] = {'A','B','C','D','\0'}; char *ptrArr; int i=0; printf(Se recorre cadena usando el indice i\n"); while(arreglo[i]!='\0'){ printf("%c",arreglo[i]); i++; } printf(Se recorre cadena usando Apuntador \n"); ptrArr=arreglo; //Es lo mismo que ptrArr=&arreglo[0]; while(*ptrArr!='\0'){ printf("%c",*ptrArr); ptrArr++; } printf(Se imprime cadena con opcion s printf \n"); printf("%s",arreglo); //Incluya la librera de entrada y salida de datos //Encabezado de la Funcion Main //Declare cadena de caracteres de 5 posiciones e inicialicela. //Declare apuntador a caracteres //Declare variable entera e inicialcela en cero. //Mensaje Forma1 //Realice un ciclo que recorra la CADENA e imprima //carcter a carcter, utilice la vble i como indice del arreglo. //Preferiblemente utilice chequeo de carcter de finalizacin //para saber hasta donde imprimir. //Mensaje Forma2 //Apunte hacia la cadena de caracteres //Realice el ciclo de impresin anterior, pero utilice el apuntador // para acceder a los elementos

//Mensaje Forma3 //Imprima la cadena utilizando la opcion s en la funcion printf

printf(" Se imprime cadena con opcion s printf \n"); //Mensaje Forma4 ptrArr=arreglo; //Es lo mismo que ptrArr=&arreglo[0]; //Apunte a la cadena con el apuntador. printf("%s",ptrArr); //Imprima la cadena utilizando la opcion s en la funcion printf return 0; } //Valor de retorno de la funcion Main //Cierre de la definicin del Main.

AGENDA
1

PUNTEROS Y ARREGLOS

Arreglo de punteros
Un arreglo de caracteres es una coleccin de variables tipo caracter Un arreglo de punteros es .
int *arrPtr[7];
arrEnt[0] arrEnt[1] arrEnt[2]

12 32 7 .

arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3] arrPtr[4] arrPtr[5] arrPtr[6]

&var1 &var2 &var1 &var3 &varX

arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3]

&var1 &var2

NULL
&varX

&var1 &var3

PUNTEROS Y ARREGLOS

Arreglo de punteros
Ejemplo: Declare tres cadenas de caracteres e inicialicelas, declare un arreglo de vectores, y apunte con cada puntero a cada uno de las cadenas.

char cad1[10]={'C', 'A', 'R', 'L', 'O', 'S', '\0'}; char cad2[10] = "MARIA"; char cad3[] = {' L', 'U', 'I', 'S', 'A', '\0'}; char *arrPtr[4]; arrPtr[0]=cad1; //Es lo mismo que &cad1[0] arrPtr[1]=&cad2 [0]; //Es lo mismo que cad2 arrPtr[2]=cad3; //Es lo mismo que &cad3[0] arrPtr[3]=NULL;
while (arrPtr[i] != NULL){ printf("%s",arrPtr[i]); i++; }

arrPtr[0] arrPtr[1] arrPtr[2] arrPtr[3]

&cad1[0] &cad2[0] &cad3[0] NULL

AGENDA
1

REPASO FUNCIONES
in_1 In_2 in_N

...

out_1

Declaracin de la tipo_retorno nombre_funcion(tipo_1,.., tipo_N); funcin (Prototipo).


tipo_retorno nombre_funcion(tipo_1 param_1,. . ., tipo_N param_N) { intruccion_1; . . . instruccin_N; return expresion; }

Definicin de la funcin

FUNCIONES POR REFERENCIA


#include <archivo_cabecera> void swap(int *i, int *j); int main() { int a,b; a=5; b=10; printf("%d %d\n",a,b); swap(&a,&b); printf("%d %d\n",a,b); return 0; } void swap(int *i, int *j) { int t; t = *i; *i = *j; *j = t; }

Apuntadores como parmetros a funciones

PUNTEROS COMO PARAMETROS

Con frecuencia se desea que una funcin calcule y devuelva ms de un valor. Se desea que una funcin modifique las variables que se le pasan como argumentos. Un apuntador que se le pasa como parametro a una funcion, sera pasada como parametro por referencia. Si una variable es local y quiere que sea vista por alguna funcin entonces se utiliza apuntadores para que sea visible en la funcion.

PUNTEROS COMO PARAMETROS

FUNCIONES QUE RECIBEN APUNTADORES


Prototipo:
int funcionApunt(int *ptr1, int *ptr2);

Definicin:
int funcionApunt(int *ptr1, int *ptr2){ ptr1=ptr2; printf("%d", *ptr1); return *ptr1 + *ptr2; }

Llamado a la funcin:
void main(void){ int *ptr1, *ptr2,a,var1,var2; .. a=funcionApunt(&var1,&var2); a=funcionApunt(ptr1,ptr2); }

PUNTEROS COMO PARAMETROS

EJEMPLO:
Programa que imprime una cadena de caracteres por medio de una funcin que recibe un apuntador a la cadena y otro apuntador a una variable que contiene el numero de caracteres en la cadena.

EJEMPLO:
#include <stdio.h> void funcion1(int *ptrInt, char *ptrCh); int main(void){ int *ptrInt; int num=5; char *ptrCh; char cad[10] = { 'M', 'A', 'N', 'G', 'O', '\0'}; ptrInt=&num; ptrCh=cad; funcion1(ptrInt,ptrCh); return 0; }

PUNTEROS COMO PARAMETROS

//Incluya libreria para manejo de teclado y de pantalla //Prototipo de funcion1 que reciba puntero a entero y //puntero a caracter, que no retorne nada //Cuerpo del main, retorna un cero. //Declare ptrInt como un puntero a entero. //Declare num como entero e inicialicelo con 5. //Declare ptrCh como un puntero a caracter. //Declare cad cadena de caract. e inicie con MANGO //Apunte ptrInt a la variable. //Apunte ptrCh a la cadena cad. //Llame a la funcion1 con parametros ptrInt y ptrCh //Retorna la funcion main. //Definicion funcion1 //Declare variable entera i //Imprima caracter apuntado por ptrCh //Ciclo for, i desde 0 hasta <= valor apuntado por ptrInt, increm. i //Apunte ptrCh al siguiente caracter. //Fin Ciclo for

void funcion1(int *ptrInt, char *ptrCh){ int i; for(i=0; i < *ptrInt; i++){ printf("%c", *ptrCh); ptrCh=ptrCh+1; } } //Fin funcion1

APUNTADORES

Zona de Preguntas
Apuntadores
int main(void) { int a,b,*pa,*pb; b= *pa+1; b= *(pa+1); pb=&b; *pb=0; *pb+=2; (*pb)--; }
int main(void){ int i,j,*p,**q; i=25; j= 50; p=&i; *p=100; printf(%d %d,i,j); q=&p; **q=8; printf(%d %d,i,j); p=&j; **q=700; printf(%d %d,i,j); return 0; }

PUNTEROS COMO PARAMETROS

Ejercicio
1. Programa que imprime una cadena de caracteres por medio de una funcin que recibe un apuntador a la cadena. 2. Disea una funcin que reciba dos nmeros enteros a y b y devuelva, simultneamente el menor y el mayor de ambos. La funcin tendr este prototipo: void minimax (int a, int b, int * min, int * max) 3. Convertir una cadena de minsculas a Maysculas utilizando apuntadores a travs del llamado a un procedimiento (no usar libreras para el manejo de string, ni funciones especiales).

Bibliografa
Joyanes Aguilar, Luis. PROGRAMACIN EN C. Metodologa, algoritmos y estructura de datos. Capitulo10. H.M. Deitel, P.J. Deitel. Como programar en C y C++ Google

S-ar putea să vă placă și