Arreglos multidimensionales y de apuntadores

26
Arreglos y apuntadores

Transcript of Arreglos multidimensionales y de apuntadores

Page 1: Arreglos multidimensionales y de apuntadores

Arreglos y apuntadores

Page 2: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 2

Arreglo

Conjunto de variables del mismo tipo, las cuales están indexadas.

Page 3: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 3

Declaración:

tipo_variable nombre[tamaño];

Inicialización:

tipo_variable nombre[tamaño] =

{ elemento 1, elemento 2, ... , elemento n };

Page 4: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 4

int numeros[40];

float otros_numeros[] = {4.6, 5.6, 2.1, 4.5};

int i;

for(i = 0; i < 40; i++) {

printf(“Escribe un número: ”);

scanf(“%d”, &numeros[i]);

}

for (i = 0; i < 4; i++)

printf(“%f\n”, otros_numeros[i]);

Page 5: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 5

Apuntador

Son variables que almacenan direcciones de memoria.

Page 6: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 6

Declaración: tipo_variable *nombre;

Asignar dirección: nombre = &variable_del_mismo_tipo;

Devuelve valor almacenado (desreferenciamiento): *nombre

Page 7: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 7

Ejemplo:

int *px; // apuntador

int x = 1, y = 2; // Variables

px = &x; // apunta a x

y = *px; // el valor de x se asigna a // y, ahora y vale 1

*px = 0; // ahora x vale 0

Page 8: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 8

Reserva de espacio en la memoria

Incluir biblioteca stdlib Declarar apuntador Asignar espacio a cada apuntador

declarado usando malloc() Después de usar, liberar espacio usando

free()

Page 9: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 9

int *numeros;

// numeros apunta a un espacio donde caben 40 variables int

numeros = (int *) malloc(40 * sizeof(int));

// ... Código ...

free(numeros); // Liberamos espacio

Page 10: Arreglos multidimensionales y de apuntadores

11 Agosto Programación avanzada y métodos numéricos 10

int *px; int x; px = &x;

px++; // apunta 1 posición más adelante

px = px + 2; // apunta 5 posiciones más //adelante

px = px – 8; // apunta 8 posiciones más atrás

Aritmética de direcciones

Page 11: Arreglos multidimensionales y de apuntadores

11 Agosto Programación avanzada y métodos numéricos 11

Page 12: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 12

int i;

// captura números

for(i = 0; i < 40; i++)

scanf(“%i”,numeros + i);

// imprime números

for(i = 0; i < 40; i++)

printf(“%i\n”,*(numeros + i));

Page 13: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 13

vect[i] y *(pv + i) son expresiones equivalentes

El nombre de un arreglo es el sinónimo de la dirección de su posición inicial

Equivalencia entre arreglos y apuntadores

Page 14: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 14

int vect[10]; int *pv;

pv = vect; // Expresión válidavect = pv; // Expresión inválida

*(vect + 4) = 302; // asigna 302 a vect[4]

pv[4] = 302; // asigna 302 a *(pv + 4)

Page 15: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 15

Arreglos de varios dimensiones

Page 16: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 16

Declaración e inicialización

Declaración:

Tipo_de_variable nombre[Tamaño] ... [Tamaño];

float arreglo[2][4];

Inicialización:

Tipo_de_variable nombre[Tamaño] ... [Tamaño] = { conjuntos anidados de elementos } ;

float arreglo[2][2] = { {1, 2} , { 4 , 5 } };

Page 17: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 17

int numeros[40][20];

int i, j;

for(j = 0; j < 20; j++)

for(i = 0; i < 40; i++) {

printf(“Escribe un número: ”);

scanf(“%d”, &numeros[i][j]);

}

for (i = 0; i < 40; i++)

for(j = 0; j < 20; j++)

printf(“%d\n”, numeros[i][j]);

Page 18: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 18

Declaración

Tipo_variable *nomb_arreglo[tamaño];

float *pesos[500];

Inicialización

Tipo_variable *nomb_arreglo[tamaño] = { &variable1, &variable2, ..., &variablen};

int *datos_biblio[3] = {&libros, &empleados, &mesas};

Arreglos de apuntadores

Page 19: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 19

int *numeros[20];

int i, j;

for(i = 0; i < 20; i++)

numeros[i] = (int *) malloc(40 * sizeof(int));

for (i = 0; i < 40; i++)

for(j = 0; j < 20; j++)

scanf(“%d”, numeros[j] + i);

for (i = 0; i < 40; i++)

for(j = 0; j < 20; j++)

printf(“%d”, *(numeros[j] + i));

Page 20: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 20

Apuntadores y Arreglos multidimensionales

int a[2][7];

int *b[2];

b[0] = a[0]; // dirección primera fila

b[1] = a[1] + 1; // dirección segunda fila con offset de 1 espacio

b[0][1] = 6; // a[0][1] también es igual a 6

b[1][4] = 7; // a[1][5] también es igual a 7

Page 21: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 21

Page 22: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 22

int *numeros[20];

int i, j;

for(i = 0; j < 20; j++)

numeros[i] = (int *) malloc(40 * sizeof(int));

for (i = 0; i < 40; i++)

for(j = 0; j < 20; j++)

scanf(“%d”, &numeros[j][i]);

for (i = 0; i < 40; i++)

for(j = 0; j < 20; j++)

printf(“%d”, numeros[j][i]);

Page 23: Arreglos multidimensionales y de apuntadores

11 Agosto Programación avanzada y métodos numéricos 23

char *palabras[3] =

{“kilowatt”, “centímetro”, “gramo”};

Page 24: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 24

char *palabras[10];

char *aux;

int i,j;

/* Reservamos un espacio y capturamos una cadena en él */

for(i = 0; i < 10; i++) {

nombres[i] = (char *) malloc(30 * sizeof(char));

printf("Dame una palabra cualquiera: ");

scanf("%s",palabras[i]);

}

Page 25: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 25

/* Algoritmo de burbuja */

for(i = 0; i < 9; i++)

for(j = i + 1; j < 10; j++) {

if( strlen(palabras[j]) < strlen(palabras[i]) ) {

/* Solo intercambiamos direcciones */

aux = palabras[j];

palabras[j] = palabras[i];

palabras[i] = aux;

}

}

Page 26: Arreglos multidimensionales y de apuntadores

26/04/12 Programación avanzada y métodos numéricos 26

Bibliografía

Luis Joyanes e Ignacio Zahonero. Programación en C, C++, Java y UML. Ed. McGraw Hill Latinoamericana.

Harvey y Paul Deitel, Como programar en C, Ed. Prentice Hall.