arreglos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
arreglos [2012/08/03 15:55] – [Arreglos globales] lmateu | arreglos [2016/09/27 13:02] (actual) – [Arreglos globales] lmateu | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
===== Arreglos ===== | ===== Arreglos ===== | ||
- | En realidad C no posee verdaderos arreglos como ocurre en Java. En C un arreglo de n elementos de un tipo T corresponde a un puntero al comienzo de un área de memoria que contiene n variables consecutivas de tipo T. De modo que lo que se vió en el capítulo sobre punteros es el 90% de lo que se puede escribir sobre arreglos. | + | En realidad C no posee verdaderos arreglos como los de Java. En C un arreglo de n elementos de un tipo T corresponde a un puntero al comienzo de un área de memoria que contiene n variables consecutivas de tipo T. De modo que lo que se vió en el capítulo sobre punteros es el 90% de lo que se puede escribir sobre arreglos. |
- | El otro 10% corresponde la declaración de arreglos de tamaño constante. | + | El otro 10% corresponde |
==== Arreglos globales ==== | ==== Arreglos globales ==== | ||
Línea 23: | Línea 23: | ||
</ | </ | ||
- | El primero es un arreglo de 100 elementos inicializados por omisión en 0. El tipo de la expresión //a// es //double*// y corresponde a la dirección del primer elemento de un área de memoria global con espacio para 100 variables consecutivas de tipo double. | + | El primero es un arreglo de 100 elementos inicializados por omisión en 0. El tipo de la expresión //a// es //double*// y corresponde a la dirección del primer elemento de un área de memoria global con espacio para 100 variables consecutivas de tipo double. |
En este caso //a// **no es una variable**. | En este caso //a// **no es una variable**. | ||
Línea 29: | Línea 29: | ||
a= (double*)malloc(100*sizeof(double)); | a= (double*)malloc(100*sizeof(double)); | ||
| | ||
- | En este caso el identificador //a// representa una constante | + | En este caso el identificador //a// representa una constante |
- | El arreglo b corresponde a un arreglo de 4 elementos preinicializados con constantes conocidas en tiempo de compilación. | + | {{ : |
+ | |||
+ | Volviendo al código de arriba, el arreglo b corresponde a un arreglo de 4 elementos preinicializados con constantes conocidas en tiempo de compilación. | ||
Nótese que el compilador no genera ningún código para inicializar los arreglos globales. | Nótese que el compilador no genera ningún código para inicializar los arreglos globales. | ||
- | === Inicialización de punteros === | + | === Inicialización de punteros |
Las siguientes declaraciones globales son válidas: | Las siguientes declaraciones globales son válidas: | ||
Línea 42: | Línea 44: | ||
int x, y; | int x, y; | ||
int *p= &x; | int *p= &x; | ||
- | int *p[]= {&x, &y}; | + | int *q[]= {&x, &y}; |
</ | </ | ||
- | En este caso //&x// y //&y// se considera constantes. | + | En este caso //&x// y //&y// se considera constantes. |
==== Arreglos automáticos ==== | ==== Arreglos automáticos ==== | ||
- | También es posible declarar un arreglo local a una función. | + | También es posible declarar un arreglo local a una función. |
< | < | ||
Línea 67: | Línea 69: | ||
Acá //a// es un arreglo de 20 elementos que es creado al inicio de f y destruidos en el retorno de f. Cuidado, una función no debe retornar la dirección de un arreglo local. | Acá //a// es un arreglo de 20 elementos que es creado al inicio de f y destruidos en el retorno de f. Cuidado, una función no debe retornar la dirección de un arreglo local. | ||
- | Observe aquí como se usa el arreglo en donde corresponde usar un puntero. | + | Observe aquí como se usa el arreglo en donde corresponde usar un puntero. |
=== Arreglos locales preinicializados === | === Arreglos locales preinicializados === | ||
Línea 95: | Línea 97: | ||
</ | </ | ||
- | Compíle | + | Compile |
% gcc -m32 loop.c | % gcc -m32 loop.c | ||
Línea 111: | Línea 113: | ||
% gdb a.out | % gdb a.out | ||
GNU gdb (Gentoo 7.3.1 p2) 7.3.1 | GNU gdb (Gentoo 7.3.1 p2) 7.3.1 | ||
- | Copyright (C) 2011 Free Software Foundation, Inc. | + | ... |
- | License GPLv3+: GNU GPL version 3 or later < | + | |
- | This is free software: you are free to change and redistribute it. | + | |
- | There is NO WARRANTY, to the extent permitted by law. Type "show copying" | + | |
- | and "show warranty" | + | |
- | This GDB was configured as " | + | |
- | For bug reporting instructions, | + | |
- | < | + | |
Reading symbols from / | Reading symbols from / | ||
(gdb) b main | (gdb) b main | ||
Línea 151: | Línea 146: | ||
</ | </ | ||
- | Continúe así hasta que i tome el valor 10. | + | Continúe así hasta que i tome el valor 10. |
+ | |||
+ | ==== Arreglos dinámicos ==== | ||
+ | |||
+ | Son todos los arreglos que se crean llamando a malloc y se destruyen explícitamente con free, como se vió en el capítulo sobre punteros. Por lo tanto se ubican en el heap. Su valor inicial es indeterminado y por lo tanto deben ser inicializados por el programador despúes de su creación. | ||
+ | |||
+ | Observe que Java no posee arreglos globales ni locales a una función. |
arreglos.1344009310.txt.gz · Última modificación: 2012/08/03 15:55 por lmateu