Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Principios de un puntero
1. ¿Qué es un puntero?
a. Memoria RAM
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -1-
JAIRO ENRIQUE MARTINEZ BANDA
char C=255;
int A=256, B=129;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -2-
JAIRO ENRIQUE MARTINEZ BANDA
Cada nuevo objeto comienza siempre en una nueva de palabra. Solo los
objetos de tipo char (1 byte) o a veces short (2 bytes) pueden tener
direcciones de bytes intermedios. Esta es la razón por la que la dirección de
la variable entera A está en la nueva palabra, la siguiente a la dirección de la
variable de tipo char C. Los tres bytes de las direcciones 101, 102 y 103 no se
utilizan.
c. Cuatro operadores
ˇ
Obtener una dirección de memoria.
ˇ
Acceder a una dirección de memoria.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -3-
JAIRO ENRIQUE MARTINEZ BANDA
escritura: el operador -> «flecha», que permite acceder a los campos de una
tupla a partir de su dirección de memoria, y el operador [ ] «corchete», que
permite acceder a los elementos de una tabla a partir de la dirección del
primer elemento.
Los punteros forman parte de una de las herramientas más potentes del
lenguaje C. Hay tres casos de uso de punteros:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -4-
JAIRO ENRIQUE MARTINEZ BANDA
ˇ
El tipo del objeto al que apuntará.
ˇ
El operador * (a la izquierda del nombre del puntero).
ˇ
Un nombre (identificador) para el puntero.
Por ejemplo:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -5-
JAIRO ENRIQUE MARTINEZ BANDA
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -6-
JAIRO ENRIQUE MARTINEZ BANDA
int k;
&k // esta expresin vale la direccin en memoria de la
// variable k
Observación:
Cabe decir que k debe ser lo que se llama un lvalue. Es decir, una expresión
que tiene una dirección de memoria accesible, en general una expresión a la
que se le pueda asignar un valor. En efecto, si i es un int, &i es la dirección de i
que apunta i. Pero una expresión como &(i+1) con los paréntesis no es
correcta sintácticamente, ya que (i+1) no se corresponde con una variable en
memoria y, por tanto, no es un lvalue. No es posible escribir algo como:
(i+1)=77.
#include <stdio.h>
int main()
{
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -7-
JAIRO ENRIQUE MARTINEZ BANDA
char c;
int i,j;
struct {
int x,y;
float dx,dy;
}s1;
printf("la direccin de c es: %p\n", &c);
printf("la direccin de i es: %p\n", &i);
printf("la direccin de j es: %p\n", &j);
printf("la direccin de s1 es: %p\n", &s1);
return 0;
}
b. Operador asterisco: *
int i;
int* ptr = &i;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -8-
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 23; // 1
int *ptr;
ptr = &i; // 2
printf("%d, ",*ptr);
*ptr = 55; // 2
printf("%d, ",i);
i = 777; // 3
printf("%d.",*ptr);
return 0;
}
(1) Declaraciones del entero i que vale 23 y del puntero a entero ptr.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -9-
JAIRO ENRIQUE MARTINEZ BANDA
ptr.
typedef struct{
int vida;
float x,y,dx,dy;
int color;
} enemigo;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 10 -
JAIRO ENRIQUE MARTINEZ BANDA
enemigo S1,S2;
enemigo*p;
con
p=&S1;
(*p).vida=1;
(*p).x=rand()%80;
(*p).y=rand()%25;
etc.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 11 -
JAIRO ENRIQUE MARTINEZ BANDA
p->vida=1;
p->x=rand()%80;
p->y=rand()%25;
etc.
d. Operador corchete: [ ]
int *p;
p=tab;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 12 -
JAIRO ENRIQUE MARTINEZ BANDA
lo que significa que tab y p son equivalentes y se puede usar p en vez de tab:
int i;
for (i=0; i<50; i++)
p[i] = rand()%256;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 13 -
JAIRO ENRIQUE MARTINEZ BANDA
a. La función malloc()
Hemos visto casos en los que un puntero recibe como valor la dirección de
una variable previamente declarada. Sin embargo, un puntero también
permite obtener dinámicamente, durante el funcionamiento del programa,
una dirección de memoria asignada para una variable de cualquier tipo. Para
ello, el lenguaje C nos proporciona una función importante:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 14 -
JAIRO ENRIQUE MARTINEZ BANDA
Esta función asigna un bloque de memoria de tam bytes (el tamaño se pasa
por parámetro) y devuelve la dirección de memoria de la zona asignada (o
NULL si no hay suficiente memoria). El void* es un puntero genérico, es decir,
que puede funcionar con cualquier tipo de objeto. El funcionamiento del
sistema garantiza que la dirección asignada está correctamente reservada
para el objeto solicitado por el programa y que en ningún caso se usará para
otros menesteres. El tamaño de una zona de memoria para un objeto
cualquiera de tipo T se obtiene simplemente con el operador sizeof (T). De
este modo, si ptr es un puntero de tipo T*, la llamada a la función es:
#include <stdio.h>
#include <stdlib.h>
int main()
{
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 15 -
JAIRO ENRIQUE MARTINEZ BANDA
int*iptr;
float* tab[10]; // tabla de punteros a float
int i;
iptr=malloc(sizeof(int));
*iptr=45;
printf("*iptr, en la direccin %p vale: %d\n"
, iptr, *iptr);
srand(time(NULL));
for(i=0; i<10; i++){
tab[i]=malloc(sizeof(float));
*tab[i]= (rand() / float
( )RAND_MAX)*5;
printf("*tab[%d] en la direccin %p vale: %.2f\n"
,
i,tab[i], *tab[i]);
}
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 16 -
JAIRO ENRIQUE MARTINEZ BANDA
void free(void*p);
free(ptr);
#include <stdio.h>
#include <stdlib.h>
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 17 -
JAIRO ENRIQUE MARTINEZ BANDA
int main()
{
double*p[500000];
int i;
int fin=0;
do{
printf("\n\n");
}while(fin!=n);
return 0;
}
Digamos que es una cuestión del día a día del programador de C: cuando el
programa finaliza, debe poner especial atención en que
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 18 -
JAIRO ENRIQUE MARTINEZ BANDA
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 19 -
JAIRO ENRIQUE MARTINEZ BANDA
int toto=55;
void* ptr = &toto;
printf("toto=%d\n",*((int*)ptr)); // esta instruccin funciona con el c
printf( "toto=%d\n", *ptr); // si no hay cast, se produce un e
// la compilacin.
d. El valor NULL
ptr=(int*)malloc(sizeof(int));
if (ptr!=NULL){
printf("malloc ha tenido Øxito, el puntero se puede usar\n"
);
*ptr=rand()%300;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 20 -
JAIRO ENRIQUE MARTINEZ BANDA
}
else
printf("memoria insuficiente,"
"el puntero no se puede usar\n"
);
Por otro lado, con mucha frecuencia es necesario inicializar los punteros a
NULL en su declaración en un programa para evitar acceder por descuido a
zonas de memoria no reservadas (los valores residuales albergados en un
puntero sin inicializar), lo que cuelga el programa.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 21 -
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
int main()
{
char*ptr;
char tab[80];
printf("entre una frase:\n"
);
fgets(tab,80,stdin);
printf("tab: %s\n",tab);
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 22 -
JAIRO ENRIQUE MARTINEZ BANDA
compilador.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char*ptr;
char tab[80];
printf("entre una frase:\n"
);
fgets(tab,80,stdin);
printf("tab : %s\n",tab);
ptr=tab;
printf("entre otra frase:\n"
);
fgets(ptr,80,stdin); // ok
printf("ptr: %s",ptr); //
printf("tab: %s\n",tab); // ptr y tab son idØnticos
return 0;
}
ptr toma la dirección de tab, que está debidamente reservada por la máquina
para la tabla tab. Entonces ptr y tab designan el mismo espacio de memoria;
escribir a partir de ptr es escribir a partir de tab. Es la misma dirección de
memoria, la misma ubicación en la
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 23 -
JAIRO ENRIQUE MARTINEZ BANDA
memoria. Por lo tanto, atención, porque en este caso ptr y tab son dos
accesos para el mismo bloque de memoria, y no dos bloques distintos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char*ptr;
char tab[80];
int i;
printf("entre una frase:\n"
);
fgets(tab,80,stdin);
// copia de tab
strcpy(ptr,tab);
// modificacin de la copia
for(i=0; i<strlen(ptr); i++)
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 24 -
JAIRO ENRIQUE MARTINEZ BANDA
ptr[i]++;
Esta vez, ptr y tab son dos bloques distintos y cada uno de ellos corresponde
a una dirección de memoria válida.
b. ¿Por qué hay que realizar casting con el retorno de las funciones
de asignación?
char c;
double *d;
d=&c;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 25 -
JAIRO ENRIQUE MARTINEZ BANDA
En cambio, si escribimos:
double *d;
d=malloc(sizeof(char)); // atencin, error invisible
double *d;
// retorno de malloc transformÆndolo a char*:
d=(char*)malloc(sizeof(char)); // entonces el error queda
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 26 -
JAIRO ENRIQUE MARTINEZ BANDA
// visible en la compilacin
Podemos definir una tabla estática de punteros, que es una tabla normal que
contiene punteros, en este caso de tipo t_trol*.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 27 -
JAIRO ENRIQUE MARTINEZ BANDA
Para utilizar una tabla de punteros, hay que velar por que cada puntero
contenga una dirección de memoria válida:
tab[i]=(t_trol*)malloc(sizeof(t_trol));
// asignacin de memoria
Por otro lado, es una tabla estática y se comporta como tal en parámetros de
función:
#include <stdio.h>
#include <stdlib.h>
void inicializacion
(t_trol* t[])
{
int i;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 28 -
JAIRO ENRIQUE MARTINEZ BANDA
t[i]=(t_trol*)
malloc(sizeof(t_trol));
t[i]->x=rand()%800;
t[i]->y=rand()%600;
t[i]->color=rand()%256;
}
}
void mostrar(t_trol*t[])
{
int i;
for (i =0; i<NUMMAX; i++){
printf("%4d %4d %4d\n"
,t[i]->x,t[i]->y,t[i]->color);
}
}
int main()
{
t_trol* ALL[NUMMAX];
inicializacion(ALL);
mostrar(ALL);
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 29 -
JAIRO ENRIQUE MARTINEZ BANDA
char* lista_pal[]={
"titi",
"toto practica bicicleta"
,
"tutu",
"tata goes to the sea"
,
"fin" };
char mat_pal[5][30]={"titi",
"toto practica bicicleta"
,
"tutu",
"tata goes to the sea"
,
"fin" };
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 30 -
JAIRO ENRIQUE MARTINEZ BANDA
int i;
for (i=0; strcmp("fin", lista_pal[i]) !=0 ; i++)
printf("%s\n",lista_pal[i]);
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 31 -
JAIRO ENRIQUE MARTINEZ BANDA
((char*)0)
El valor 0, de tipo int, con casting a char* se acepta en una tabla de char*
como una cadena de caracteres. La lista de palabras se puede escribir de la
siguiente forma:
char* lista_pal[ ] ={
"titi",
"toto practica bicicleta"
,
"tutu",
"tata goes to the sea"
,
((char*)0) };
int i;
for (i=0; lista_pal[i] !=NULL ; i++)
printf("%s\n",lista_pal[ i ]);
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 32 -
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
#include <stdlib.h>
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 33 -
JAIRO ENRIQUE MARTINEZ BANDA
C:\> test.exe
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 34 -
JAIRO ENRIQUE MARTINEZ BANDA
muestra:
Se realiza un desacople con los espacios. Para evitarlo, basta con agrupar los
conjuntos de palabras con comillas dobles:
muestra:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 35 -
JAIRO ENRIQUE MARTINEZ BANDA
/***************************************************************
¿QuØ es un puntero?
Una variable que adquiere œnicamente direcciones de memoria como
valor.
¿Cmo se usan?
Hay cuatro operadores asociados y tres funciones de asignacin
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 36 -
JAIRO ENRIQUE MARTINEZ BANDA
EJEMPLO:
int a;
int *ptr; // declaracin de un puntero a entero
ptr = &a; // ptr toma por valor la direccin de a
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int*ptr=&a;
a= 100;
*ptr=200;
printf("a : %d / *ptr : %d\n"
,a,*ptr);
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 37 -
JAIRO ENRIQUE MARTINEZ BANDA
/***************************************************************
EJEMPLO:
struct test{
int x,y;
} t;
int main()
{
struct test{
int x,y;
} t;
struct test *ptr;
ptr=&t;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 38 -
JAIRO ENRIQUE MARTINEZ BANDA
ptr->x=450;
ptr->y=90;
printf("t.x=%d, t.y=%d\n", t.x, t.y);
return 0;
}
*/
/***************************************************************
4) "corchetes": [] es el operador de tabla, desde una
direccin de partida permite acceder a las direcciones de
distintos elementos de la tabla
EJEMPLO:
int tab[50];
int*ptr;
ptr=tab; // ptr toma la direccin de la tabla por valor
// que es la direccin del primer elemento de esta
// equivalente a:
for (i=0; i<50; i++)
*(ptr+i) = rand()%256;
*/
/*
#include <stdio.h>
#include <stdlib.h>
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 39 -
JAIRO ENRIQUE MARTINEZ BANDA
int main()
{
int tab[10];
int*ptr;
int i;
ptr=tab;
for (i=0; i<10; i++){
ptr[i] = rand()%256;
printf("ptr[%d] = %d\n",i,ptr[i]);
}
// equivalente a:
for (i=0; i<10; i++){
*(ptr+i) = ptr[i]+1;
printf("*(ptr+%d) = %d\n",i,*(ptr+i));
}
return 0;
}
*/
Ejercicio 1
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 40 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 2
Ejercicio 3
Sea una tupla persona que incluye datos tales como: nombre, apellidos,
dirección, edad, fecha de nacimiento, nacionalidad, trabajo y hobby. En un
programa:
ˇ
Definir el tipo.
ˇ
Inicializar una tupla persona únicamente accediendo a ella a través
de su dirección de memoria.
ˇ
Mostrar el resultado.
ˇ
Volver a empezar o salir.
Modificar el programa para tener una tabla de num tuplas persona. Escribir
una función de inicialización e inicializar la tabla (si puede ser con valores
aleatorios, mejor). El usuario puede modificar el
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 41 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 4
Ejercicio 5
Ejercicio 6
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 42 -
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
int main()
{
int t[3];
int i, j;
int* ptr;
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 43 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 7
ˇ
La inicialización de la tabla con 12 valores aleatorios y 3 entrados por
el usuario.
ˇ
La visualización de la tabla.
ˇ
La búsqueda del más grande.
ˇ
La búsqueda del más pequeño.
ˇ
La visualización de los resultados.
Ejercicio 8
ˇ
Escribir una función de inicialización de la tabla que la recorra con un
puntero.
ˇ
Escribir una función de visualización de la tabla que la recorra con un
puntero.
ˇ
Salir o volver a empezar.
Ejercicio 9
ˇ
Escribir una función de inicialización de la matriz en la que la matriz
se recorra con un puntero. Los valores serán aleatorios, excepto por
una entrada del usuario cada 100
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 44 -
JAIRO ENRIQUE MARTINEZ BANDA
valores.
ˇ
Escribir una función de visualización paralelamente recorrida por un
puntero.
ˇ
Salir o volver a empezar.
Ejercicio 10
En un programa:
ˇ
Introducir una cadena de caracteres.
ˇ
Escribir una función de visualización de la cadena recorriéndola en
sentido inverso con un puntero.
ˇ
Salir o volver a empezar.
Ejercicio 11
En un programa:
ˇ
Asignar memoria para un char, un entero y un float.
ˇ
Inicializar con valores introducidos por el usuario.
ˇ
Visualizar.
ˇ
Salir si el usuario lo solicita (si no, volver a empezar, ¡cuidado con la
memoria!).
Ejercicio 12
En un programa:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 45 -
JAIRO ENRIQUE MARTINEZ BANDA
ˇ
Escribir una función de asignación de memoria con control de errores
para un entero.
ˇ
Inicializar una tabla de 10 punteros a entero.
ˇ
Asignar valores decrecientes a los enteros.
ˇ
Mostrar los valores.
ˇ
Salir si el usuario lo solicita (si no, volver a empezar, ¡cuidado con la
memoria!).
Ejercicio 13
ˇ
Definir el tipo para la entidad.
ˇ
Declarar dos punteros para dos entidades e inicializar con valores
cada una de sus características.
ˇ
Comparar las características de ambas entidades y mostrar el
resultado.
ˇ
Salir si el usuario lo solicita (si no, volver a empezar, ¡cuidado con la
memoria!).
Ejercicio 14
En un programa, retomar el ejemplo del tipo definido para una entidad del
ejercicio 13 y:
ˇ
Declarar dos punteros a entidad.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 46 -
JAIRO ENRIQUE MARTINEZ BANDA
ˇ
Escribir una función de inicialización e inicializar cada entidad.
ˇ
Escribir una función de visualización y mostrar cada entidad.
ˇ
Escribir una función que visualice el nombre de la entidad con la
característica más fuerte.
Ejercicio 15
En un programa, retomar el ejemplo del tipo definido para una entidad del
ejercicio 13 y:
ˇ
Declarar una tabla de punteros para NUM_MAX entidades.
ˇ
Escribir una función de inicialización e inicializar la tabla.
ˇ
Escribir una función de visualización y visualizar la tabla.
ˇ
Escribir una función que muestre el nombre de la entidad con la
característica más fuerte.
Ejercicio 16
int main()
{
char*s1;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 47 -
JAIRO ENRIQUE MARTINEZ BANDA
char s2[80];
int i;
fgets(s2,100,stdin);
strcpy(s1, s2);
s1=s2;
fgets(s2,100,stdin);
if (strcmp(s1,s2)==0)
printf("ambas frases son idØnticas\n"
);
else
printf("son distintas\n"
);
s1="hola";
printf("s1: %s\n",s1);
strcpy(s2,"hace buen da, cojo mi bastn y mi sombrero con alegra"
printf("s2: %s\n",s2);
while(s2[i]){
s1[i]=s2[i];
i++;
}
printf("s1: %s\n",s1);
printf("s2: %s\n",s2);
return 0;
}
e. Tablas de cadenas
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 48 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 17
Ejercicio 18
char*lista[ ={"pan","fruta","patata","manzana","pera",
"queso","crepes", "miel", "sidra","tortilla","fin"};
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 49 -