Apuntadoresdobles

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 34

PUNTEROS DOBLES EN C

XIII CUIEET MASPALOMAS

Sidonio Prez Matilla EUITI de Eibar UPV

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.

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

PUNTEROS DOBLES EN C
INTRODUCCIN Un ejemplo sencillo de un concepto del lenguaje C difcil de entender: LOS PUNTEROS DOBLES

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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;

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

PUNTEROS DOBLES EN C
DIRECCION CONTENIDO IDENTIFICADOR

...
65000 65002 ... 65100 65102 65104

x Y[0]

...

... Y[49]

65002 65102 ...


Sidonio Prez: EUITI Eibar (UPV)

p1 p2
6

XIII CUIEET SEP 05

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);

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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);

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

16

PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 printf("\n\tPulsa tecla para terminar ... "); getch(); // pantalla usuario return 0; } // del main()

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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; } }

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

Sidonio Prez: EUITI Eibar (UPV)

22

PUNTEROS DOBLES EN C
CDIGO FUENTE DEL EJEMPLO 1 *B = puvoc; return (p1voc); } // Devolver dir ult vocal // Devolver dir pri vocal

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

p11 = f1(&s1[0], &p12);

65162

65162

&s1[3]

p12

65172

&s1[3]

p1

65164

p21

65174

&s1[1]

p1voc

65166

p22 ... ...

65176

&s1[3] ...

puvoc ...

...

...

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

p21 = f1(&s2[0], &p22);

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 ...

...

...

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

65172 ... ...

...

65164

&s2[0]

p21

65166

&s2[3] ...

p22 ...

...

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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

65172 ... ...

...

65164

&s2[0]

p21

65166

&s2[3] ...

p22 ...

...

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

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.

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

32

PUNTEROS DOBLES EN C
RESULTADOS DEL EJEMPLO 2

XIII CUIEET SEP 05

Sidonio Prez: EUITI Eibar (UPV)

33

MUCHAS GRACIAS POR SU ATENCIN


XIII CUIEET SEP 05 Sidonio Prez: EUITI Eibar (UPV) 34

También podría gustarte