06 - Arreglos de Punteros
-
Upload
emi-retamar -
Category
Documents
-
view
222 -
download
0
description
Transcript of 06 - Arreglos de Punteros
![Page 1: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/1.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 H E X A
X O R B I T
B Y T E 2 3C W H I L E1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 H E X A
X O R B I T
B Y T E 2 3C W H I L E
Clase 6
Arreglos de punteros
![Page 2: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/2.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Temas
• Repaso
• Arreglos de punteros
• Estructuras
![Page 3: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/3.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Repaso de punteros
• No existe pasaje por referencia – Lo implemento usando punteros
• No hay control sobre el uso de memoria – Es responsabilidad del programador
• Es equivalente usar arreglos o punteros
• Es posible operar artiméticamente con punteros siempre que cumplan determinadas condiciones
![Page 4: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/4.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Repaso de funciones
Disponibles en stdlib.h
/* No inicializa. size calculado como sizeof(tipo)*n */
void * malloc(size_t size)
/* Realloca. ptr se inicializa en NULL la primera vez*/
void * realloc(void * ptr, size_t size)
/* tam es lo que ocupa el tipo, n cant de elementos. Inicializa a cero la memoria */
void * calloc(size_t n, size_t tam)
/* Libera la memoria alocada */
void free(void *)
![Page 5: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/5.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Ejemplo my_strcpy
void my_strcpy(char *dst, char *src){while (*dst++ = *src++);
}
¿Es segura la implementación anterior?
char *origen= “a”, *destino = “hola”;my_strcpy(origen,destino);
![Page 6: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/6.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Asignación dinámica de memoria
• malloc, realloc, calloc: permiten alocar espacio de memoria no asignado, que está en la heap, en tiempo de ejecución.
• free permite liberar la memoria alocada
• Este tipo de variables permiten trabajar con estructuras dinámicas como listas, grafos, árboles, etc.
![Page 7: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/7.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Ejemplo:
Dado un arreglo de enteros, escribir una función que retorne todos los elementos menores que el promedio.
Solución:Opción 1: retornar el arreglo con los menores
Opción 2: pasarlo x referencia
Ejemplo de asignación dinámica de memoria
![Page 8: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/8.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Opción 1: retornar el arreglo con los menores
int * menores_que(int vec[], int dim);
/* o en forma equivalente... */
int * menores_que(int *vec, int dim);
Recordar que vec es la dir del primer elemento del arreglo!!
Ejemplo de asignación dinámica de memoria
![Page 9: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/9.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
double array_avg(int * a, unsigned s);
int *∙lower_than_avg(int a[], unsigned s){
int * new = (int *) malloc(sizeof(int)*s);
double avg = array_avg(a,s);
unsigned j,i;
for(j=0,i=0;i<s;i++){
if (a[i] < avg) {
new[j] = a[i];
j++;
}
}
return new;
}
Ejemplo de asignación dinámica de memoria
¿y la longitud delArreglo queretornamos?
![Page 10: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/10.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Una idea...
/* El primer elemento es la longitud del arreglo retornado */
int *∙lower_than_avg(int a[], unsigned s){
int * new = (int *) malloc(sizeof(int)*(s+1));
double avg = array_avg(a,s);
unsigned i;
*new = 0; /* Dimension del arreglo se inicializa a cero */
for(i=0;i<s;i++){
if (a[i] < avg) {
new[(*new)+1] = a[i];
(*new)++;
}
}
return new;
}
![Page 11: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/11.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Errores frecuentes
int * miFuncion( ... ){int vec[10];
....return vec;
}
int *p = NULL;*p = 10;
![Page 12: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/12.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Repaso: cadena de caracteres
• Si declaramos char cadena[] = “Hola”;– La variable cadena char[5] por lo que no será posible:
cadena = “juan”;– Para copiar dos strings, se utiliza strcpy()
405332
H
o
(&cadena[0]) 405332
(&cadena[1]) 405334
cadena
l(&cadena[2]) 405336
a(&cadena[3]) 405338
\0(&cadena[4]) 405340
Si lo declaro como puntero: char *nombre =“Juan”;
Luego puedo hacer una asignación:
nombre = “María”
![Page 13: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/13.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Arreglo de Punteros
• Puesto que en sí mismos los punteros son variables, pueden almacenarse en arreglos como cualquier otra variable.
![Page 14: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/14.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
• En este caso creamos un arreglo donde cada elemento es un puntero a charchar *lineas[5];
/* Arreglo de 5 punteros a char */
• lineas[i] es un puntero a char y,
• *lineas[i] es el primer carácter de la línea i-ésima
Arreglo de punteros
![Page 15: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/15.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Ejemplo de arreglo de punteros
char * palabras [ ] = {“break”, “continue”, “do”, “if”, “int”};
palabras
palabras[0] O *palabras break
palabras[1] O *(palabras +1) continue
palabras[1][3] O *(palabras [1] +2) O *(*(palabras +1)+2) n
palabras[0] O *palabras => “break”
palabras[1] O *(palabras +1) => “continue”
palabras[1][2] O *(palabras [1] +2) O *(*(palabras +1)+2) => 'n'
palabras[0] palabras[1] palabras[2] palabras[3] palabras[4]
palabras
![Page 16: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/16.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Arreglo de punteros
#include <stdio.h>
int main()
{
char *dias[]= { "lunes", "martes", "miercoles",
"jueves", "viernes", "sabado",
"domingo", };
int i;
for (i=0; i<7; i++)
printf("El dia %d es %s\n",i,dias[i]);
return 0;
}
![Page 17: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/17.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Arreglo de punteros
• Ejemplo: escribir un programa que ingrese un conjunto de palabras y las imprima en orden.
• La tarea a realizar tiene 3 etapas bien claras:• (1) ingresar todas las palabras• (2) ordenarlas
• (3) imprimirlas en orden
![Page 18: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/18.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
• Si tengo:
int a[10][20];
int *b[10];
• Pensar en el espacio que se reserva para a y b
Arreglos de punteros vs arreglos multidimensionales
![Page 19: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/19.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
Un ejemplo de arreglo de punteros
El siguiente código, tomado del libro de Schildt, es un ejemplo de uso que introduce el concepto de static que veremos más adelante:
void error_de_sintaxis(int num){
static char *err[]= {
“No se puede abrir el archivo\n”,
“Error de lectura\n”,
“Error de escritura\n”,
“Fallo de dispositivo\n”
};
printf (“%s”, err[num]);
![Page 20: 06 - Arreglos de Punteros](https://reader035.fdocuments.ec/reader035/viewer/2022081811/55cf903c550346703ba41d53/html5/thumbnails/20.jpg)
Seminario de Lenguajes – Opción Lenguaje C 2013 -
• La función main puede especificar dos parámetros
• Generalmente a estos parámetros se los llama– argc: de tipo entero
– argv: de tipo char * []
• El primer argumento es el nombre del programa. ¿Por qué?
• Ejemploint main (int argc, char *argv[])
Argumentos al programa