Publicado el 12 de Marzo del 2020
620 visualizaciones desde el 12 de Marzo del 2020
181,8 KB
34 paginas
Creado hace 18a (11/10/2005)
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
XIII CUIEET – MASPALOMAS
XIII CUIEET – MASPALOMAS
Sidonio Pérez Matilla
Sidonio Pérez Matilla
EUITI de Eibar
EUITI de Eibar
UPVUPV
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
• INTRODUCCIÓN.
INTRODUCCIÓN.
• DEFINICIONES DE PUNTERO y PUNTERO DOBLE.
DEFINICIONES DE PUNTERO y PUNTERO DOBLE.
• MAPA DE MEMORIA DE UN PROGRAMA CON PUNTEROS.
MAPA DE MEMORIA DE UN PROGRAMA CON PUNTEROS.
• FUNCIONES DE USUARIO Y PUNTEROS.
FUNCIONES DE USUARIO Y PUNTEROS.
• EJEMPLO 1.
EJEMPLO 1.
– CÓDIGO FUENTE.
CÓDIGO FUENTE.
– RESULTADOS.
RESULTADOS.
– MAPA DE MEMORIA.
MAPA DE MEMORIA.
• EJEMPLO 2.
EJEMPLO 2.
– RESULTADOS.
RESULTADOS.
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
22
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
INTRODUCCIÓN
INTRODUCCIÓN
Un ejemplo sencillo de un concepto del
Un ejemplo sencillo de un concepto del
lenguaje C difícil de entender:
lenguaje C difícil de entender:
LOS PUNTEROS DOBLES
LOS PUNTEROS DOBLES
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
33
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
DEFINICIÓN DE PUNTERO
DEFINICIÓN DE PUNTERO
Variable cuyos posibles valores son
Variable cuyos posibles valores son
direcciones de otras variables.
direcciones de otras variables.
DEFINICIÓN DE PUNTERO DOBLE
DEFINICIÓN DE PUNTERO DOBLE
Variable cuyos posibles valores son
Variable cuyos posibles valores son
direcciones de otras variables puntero.
direcciones de otras variables puntero.
int x=5, y[50], *p1=&y[0], **p2=&p1;
int x=5, y[50], *p1=&y[0], **p2=&p1;
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
44
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
MAPA DE MEMORIA DE UN PROGRAMA CON
MAPA DE MEMORIA DE UN PROGRAMA CON
PUNTEROS
PUNTEROS
Una tabla donde se relacionan
Una tabla donde se relacionan
identificadores, direcciones y contenidos
identificadores, direcciones y contenidos
int x=5, y[50], *p1=&y[0], **p2=&p1;
int x=5, y[50], *p1=&y[0], **p2=&p1;
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
55
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
DIRECCION
DIRECCION
CONTENIDO
CONTENIDO
IDENTIFICADOR
IDENTIFICADOR
......
65000
65000
65002
65002
......
65100
65100
65102
65102
65104
65104
……
……
55
......
65002
65002
65102
65102
......
……
xx
Y[0]Y[0]
......
Y[49]
Y[49]
p1p1
p2p2
……
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
66
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS
FUNCIONES DE USUARIO Y PUNTEROS
Las funciones de usuario pueden usar punteros:
Las funciones de usuario pueden usar punteros:
– En el valor devuelto; en los PF; en variables locales o globales:
En el valor devuelto; en los PF; en variables locales o globales:
int *f1(int *A, int B, int C)
int *f1(int *A, int B, int C)
{{
int *p1, …;
int *p1, …;
……
return (p1);
return (p1);
}}
// interface
// interface
Analiza una tabla de enteros de
Analiza una tabla de enteros de
BxC siendo A su dirección de
BxC siendo A su dirección de
comienzo y devuelve la dirección
comienzo y devuelve la dirección
del máximo.
del máximo.
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
77
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS
FUNCIONES DE USUARIO Y PUNTEROS
Las funciones que devuelven varios valores usan PF por referencia para
Las funciones que devuelven varios valores usan PF por referencia para
“ “devolver” los resultados que no pueden ser devueltos con un return:
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
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;
int *p1, *p2, f, c, acu;
……
*D = *p1;
*D = *p1;
*E = *p2;
*E = *p2;
return ((float)acu/B*C);
return ((float)acu/B*C);
}}
// un int
// un int
// un int
// un int
// un float
// un float
Analiza una tabla de
Analiza una tabla de
enteros de BxC siendo A
enteros de BxC siendo A
su dirección de comienzo y
su dirección de comienzo y
devuelve el Vmed, y el
devuelve el Vmed, y el
máximo y mínimo a través
máximo y mínimo a través
de D y E.
de D y E.
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
88
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
FUNCIONES DE USUARIO Y PUNTEROS
FUNCIONES DE USUARIO Y PUNTEROS
Cuando una función de usuario ha de devolver direcciones a través de
Cuando una función de usuario ha de devolver direcciones a través de
PF pasados por referencia estos se definen como punteros dobles:
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
int *f3(int *A, int B, int C, int **D) // D: dir de una var *int
{{
Analiza una tabla de
Analiza una tabla de
enteros de BxC siendo A su
enteros de BxC siendo A su
dirección de comienzo y
dirección de comienzo y
devuelve la dirección del
devuelve la dirección del
máximo, y también la
máximo, y también la
dirección del mínimo a
dirección del mínimo a
través de D.
través de D.
int *p1, …;
int *p1, …;
……
*D = expresión;
*D = expresión;
return (p1);
return (p1);
}}
// una dirección
// una dirección
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
99
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
EJEMPLO 1
EJEMPLO 1
Escribir un programa en C que intercambie
Escribir un programa en C que intercambie
entre sí las vocales primeras y últimas de
entre sí las vocales primeras y últimas de
dos cadenas.
dos cadenas.
Hola, Adios --> HAlo, odias
Hola, Adios --> HAlo, odias
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1010
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <conio.h>
int main()
int main()
{{
/* ...... PARTE DECLARATIVA ...... */
/* ...... PARTE DECLARATIVA ...... */
char s1[80], s2[80], *p11, *p12, *p21, *p22;
char s1[80], s2[80], *p11, *p12, *p21, *p22;
char *f1(char *, char **);
char *f1(char *, char **);
void f2(char *, char *);
void f2(char *, char *);
// prototipo
// prototipo
// prototipo
// prototipo
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1111
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
/* ...... PARTE EJECUTIVA ...... */
/* ...... PARTE EJECUTIVA ...... */
clrscr();
clrscr();
// limpia pantalla usuario
// limpia pantalla usuario
// 1: Leer dos cadenas desde el teclado:
// 1: Leer dos cadenas desde el teclado:
printf("\n\tTeclea una cadena: ");
printf("\n\tTeclea una cadena: ");
printf("\n\tTeclea otra cadena: ");
printf("\n\tTeclea otra cadena: ");
gets(s1);
gets(s1);
gets(s2);
gets(s2);
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1212
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
// 2: visualizar las cadenas tecleadas:
// 2: visualizar las cadenas tecleadas:
puts("\n\n\tCadenas iniciales: ”);
puts("\n\n\tCadenas iniciales: ”);
printf(“\ts1: %s \n\ts2: %s", s1, s2);
printf(“\ts1: %s \n\ts2: %s", s1, s2);
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1313
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
// 3: Buscar direcciones de las vocales
// 3: Buscar direcciones de las vocales
primera y última de cada cadena:
primera y última de cada cadena:
p11 = f1(s1, &p12);
p11 = f1(s1, &p12);
p21 = f1(s2, &p22);
p21 = f1(s2, &p22);
// llamada función
// llamada función
// llamada función
// llamada función
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1414
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
// 4: Intercambiar primeras vocales s1-s2:
// 4: Intercambiar primeras vocales s1-s2:
f2(p11, p21);
f2(p11, p21);
// llamada a función
// llamada a función
// 5: Intercambiar últimas vocales s1-s2:
// 5: Intercambiar últimas vocales s1-s2:
f2(p12, p22);
f2(p12, p22);
// llamada a función
// llamada a función
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1515
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
// 6: visualizar las cadenas tratadas:
// 6: visualizar las cadenas tratadas:
puts("\n\n\tCadenas finales: “);
puts("\n\n\tCadenas finales: “);
printf(“\ts1: %s \n\ts2: %s", s1, s2);
printf(“\ts1: %s \n\ts2: %s", s1, s2);
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1616
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
printf("\n\tPulsa tecla para terminar ... ");
printf("\n\tPulsa tecla para terminar ... ");
getch();
getch();
return 0;
return 0;
// pantalla usuario
// pantalla usuario
}}
// del main()
// del main()
XIII CUIEET SEP 05
XIII CUIEET SEP 05
Sidonio Pérez: EUITI Eibar (UPV)
Sidonio Pérez: EUITI Eibar (UPV)
1717
PUNTEROS DOBLES EN C
PUNTEROS DOBLES EN C
CÓDIGO FUENTE DEL EJEMPLO 1
CÓDIGO FUENTE DEL EJEMPLO 1
/*---------------------------------------------------------------------
/*-----------------------------------------------------------------
Comentarios de: Punteros dobles en C (0)
No hay comentarios