Documente Academic
Documente Profesional
Documente Cultură
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
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; }
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;
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;
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.
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
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
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 .
&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++; }
AGENDA
1
REPASO FUNCIONES
in_1 In_2 in_N
...
out_1
Definicin de la funcin
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.
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); }
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=# ptrCh=cad; funcion1(ptrInt,ptrCh); return 0; }
//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; }
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