Apuntadoresdobles
Apuntadoresdobles
Apuntadoresdobles
PUNTEROS DOBLES EN C
INTRODUCCIN. DEFINICIONES DE PUNTERO y PUNTERO DOBLE. MAPA DE MEMORIA DE UN PROGRAMA CON PUNTEROS. FUNCIONES DE USUARIO Y PUNTEROS. EJEMPLO 1.
CDIGO FUENTE. RESULTADOS. MAPA DE MEMORIA.
EJEMPLO 2.
RESULTADOS.
PUNTEROS DOBLES EN C
INTRODUCCIN Un ejemplo sencillo de un concepto del lenguaje C difcil de entender: LOS PUNTEROS DOBLES
PUNTEROS DOBLES EN C
DEFINICIN DE PUNTERO Variable cuyos posibles valores son direcciones de otras variables. DEFINICIN DE PUNTERO DOBLE Variable cuyos posibles valores son direcciones de otras variables puntero. int x=5, y[50], *p1=&y[0], **p2=&p1;
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 4
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DE UN PROGRAMA CON PUNTEROS Una tabla donde se relacionan identificadores, direcciones y contenidos int x=5, y[50], *p1=&y[0], **p2=&p1;
PUNTEROS DOBLES EN C
DIRECCION CONTENIDO IDENTIFICADOR
...
65000 65002 ... 65100 65102 65104
x Y[0]
...
... Y[49]
p1 p2
6
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS Las funciones de usuario pueden usar punteros:
En el valor devuelto; en los PF; en variables locales o globales:
int *f1(int *A, int B, int C) // interface { int *p1, ; Analiza una tabla de enteros de BxC siendo A su direccin de comienzo y devuelve la direccin return (p1); del mximo. }
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 7
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS Las funciones que devuelven varios valores usan PF por referencia para devolver los resultados que no pueden ser devueltos con un return: float f2(int *A, int B, int C, int *D, int *E) // D y E: dir de var int { int *p1, *p2, f, c, acu; Analiza una tabla de enteros de BxC siendo A *D = *p1; // un int su direccin de comienzo y *E = *p2; // un int devuelve el Vmed, y el return ((float)acu/B*C); // un float mximo y mnimo a travs } de D y E.
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 8
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS Cuando una funcin de usuario ha de devolver direcciones a travs de PF pasados por referencia estos se definen como punteros dobles: int *f3(int *A, int B, int C, int **D) // D: dir de una var *int { Analiza una tabla de int *p1, ; enteros de BxC siendo A su direccin de comienzo y *D = expresin; // una direccin devuelve la direccin del return (p1); mximo, y tambin la } direccin del mnimo a travs de D.
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 9
PUNTEROS DOBLES EN C
EJEMPLO 1 Escribir un programa en C que intercambie entre s las vocales primeras y ltimas de dos cadenas. Hola, Adios --> HAlo, odias
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 10
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 #include <stdio.h> #include <conio.h> int main() { /* ...... PARTE DECLARATIVA ...... */ char s1[80], s2[80], *p11, *p12, *p21, *p22; char *f1(char *, char **); // prototipo void f2(char *, char *); // prototipo
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 11
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 /* ...... PARTE EJECUTIVA ...... */ clrscr(); // limpia pantalla usuario // 1: Leer dos cadenas desde el teclado: printf("\n\tTeclea una cadena: "); gets(s1); printf("\n\tTeclea otra cadena: "); gets(s2);
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 12
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // 2: visualizar las cadenas tecleadas: puts("\n\n\tCadenas iniciales: ); printf(\ts1: %s \n\ts2: %s", s1, s2);
13
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // 3: Buscar direcciones de las vocales primera y ltima de cada cadena: p11 = f1(s1, &p12); // llamada funcin p21 = f1(s2, &p22); // llamada funcin
14
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // 4: Intercambiar primeras vocales s1-s2: f2(p11, p21); // llamada a funcin // 5: Intercambiar ltimas vocales s1-s2: f2(p12, p22); // llamada a funcin
15
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // 6: visualizar las cadenas tratadas: puts("\n\n\tCadenas finales: ); printf(\ts1: %s \n\ts2: %s", s1, s2);
16
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 printf("\n\tPulsa tecla para terminar ... "); getch(); // pantalla usuario return 0; } // del main()
17
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 /*--------------------------------------------------------------------Analiza cadena y devuelve dirs primera y ltima vocal o del \0 si no hay vocales: DEVUELVE: direccin de la primera vocal o del \0. A: direccin de comienzo de la cadena. B: dir *char para devolver dir ltima vocal o del \0 ---------------------------------------------------------------------*/ char *f1(char *A, char **B) // interface { // cdigo char *p1, *p1voc, *puvoc;
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 18
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // bsqueda de la primera vocal o del \0 for (p1=A; *p1 != '\0'; p1++) { if (*p1=='a'||*p1=='e'||*p1=='i'||*p1=='o'||*p1=='u' ||*p1=='A'||*p1=='E'||*p1=='I'||*p1=='O'||*p1=='U') { break; } } p1voc = p1; // dir primera vocal o \0
19
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 // bsqueda de la ltima vocal o del \0 for (p1=A; *p1 != '\0'; p1++) { ; }
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 20
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 for (p1--; p1 >= A; p1--) { if (*p1=='a'||*p1=='e'||*p1=='i'||*p1=='o'||*p1=='u' ||*p1=='A'||*p1=='E'||*p1=='I'||*p1=='O'||*p1=='U') { break; } }
21
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 if (*p1voc == '\0') { puvoc = p1voc; } else { puvoc = p1; }
XIII CUIEET SEP 05
// A sin vocales
// A con vocal/es
22
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 *B = puvoc; return (p1voc); } // Devolver dir ult vocal // Devolver dir pri vocal
23
PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 /* Intercambia 2 chars dados por sus dirs A y B */ void f2(char *A, char *B) // interface { // cdigo char aux; aux = *A; *A = *B; *B = aux; }
XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 24
PUNTEROS DOBLES EN C
RESULTADOS DEL EJEMPLO 1
25
PUNTEROS DOBLES EN C
RESULTADOS DEL EJEMPLO 1
Combinaciones de vocales en s1 y s2:
0: sin vocales. 1: una vocal. 2+: dos o mas vocales.
0 0 1 0 2+ 0
XIII CUIEET SEP 05
0 1 1 1 2+ 1
Sidonio Prez: EUITI Eibar (UPV)
0 2+ 1 2+ 2+ 2+
26
PUNTEROS DOBLES EN C
RESULTADOS DEL EJEMPLO 1
s1 y s2
f1()
p11=&s1[1] -> o p12=&s1[3] -> a p21=&s2[0] -> A p22=&s2[3] -> o
f2()
p11=&s1[1] -> A p21=&s2[0] -> o p12=&s1[3] -> o p22=&s2[3] -> a
s2 y s2 HAlo\0 odias\0
Hola\0 Adios\0
27
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DEL EJEMPLO 1
... 65000 ... 65079 65080 ... 65159 65160 &s1[1] A ... ... H ... ... S1[0] ... S1[79] S2[0] ... S2[79] p11 65170 ... 65168 ... 65000 ... A
65162
65162
&s1[3]
p12
65172
&s1[3]
p1
65164
p21
65174
&s1[1]
p1voc
65166
65176
&s1[3] ...
puvoc ...
...
...
28
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DEL EJEMPLO 1
... 65000 ... 65079 65080 ... 65159 65160 &s1[1] A ... ... H ... ... S1[0] ... S1[79] S2[0] ... S2[79] p11 65170 ... 65168 ... 65080 ... A
65166
65162
&s1[3]
p12
65172
&s2[3]
p1
65164
&s2[0]
p21
65174
&s2[0]
p1voc
65166
&s2[3] ...
p22 ...
65176
&s2[3] ...
puvoc ...
...
...
29
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DEL EJEMPLO 1
... 65000 ... 65079 65080 ... 65159 65160 &s1[1] A ... ... H ... ... S1[0] ... S1[79] S2[0] ... S2[79] p11 65170 ... 65168 ... &s1[1] ... A
f2(p11, p21);
&s2[0]
B aux
65162
&s1[3]
p12
...
65164
&s2[0]
p21
65166
&s2[3] ...
p22 ...
...
30
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DEL EJEMPLO 1
... 65000 ... 65079 65080 ... 65159 65160 &s1[1] A ... ... H ... ... S1[0] ... S1[79] S2[0] ... S2[79] p11 65170 ... 65168 ... &s1[3] ... A
f2(p12, p22);
&s2[3]
B aux
65162
&s1[3]
p12
...
65164
&s2[0]
p21
65166
&s2[3] ...
p22 ...
...
31
PUNTEROS DOBLES EN C
EJEMPLO 2: Escribir un programa en C que permita intercambiar entre si los valores mximos y mnimos de dos tablas de enteros.
32
PUNTEROS DOBLES EN C
RESULTADOS DEL EJEMPLO 2
33