06 - Arreglos de Punteros

20
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 IT B Y TE 2 3 C W H ILE 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 H E X A X O R B IT B Y TE 2 3 C W H ILE Clase 6 Arreglos de punteros

description

Programacion - Lenguaje C - Facultad de Informatica - UNLP

Transcript of 06 - Arreglos de Punteros

Page 1: 06 - Arreglos de Punteros

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

Seminario de Lenguajes – Opción Lenguaje C 2013 -

Temas

• Repaso

• Arreglos de punteros

• Estructuras

Page 3: 06 - Arreglos de Punteros

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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