arreglos multidimensionales y de apuntadores
TRANSCRIPT
Arreglos y 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.
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 };
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]);
26/04/12 Programación avanzada y métodos numéricos 5
Apuntador
Son variables que almacenan direcciones de memoria.
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
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
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()
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
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
11 Agosto Programación avanzada y métodos numéricos 11
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));
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
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)
26/04/12 Programación avanzada y métodos numéricos 15
Arreglos de varios dimensiones
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 } };
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]);
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
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));
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
26/04/12 Programación avanzada y métodos numéricos 21
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]);
11 Agosto Programación avanzada y métodos numéricos 23
char *palabras[3] =
{“kilowatt”, “centímetro”, “gramo”};
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]);
}
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;
}
}
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.