Estructuras de datos (Prof. Edgardo A. Franco)
1
Tema 12: Arreglos estáticos en C
M. en C. Edgardo Adrián Franco Martínez http://[email protected]@edfrancom edgardoadrianfrancom
Contenido• Introducción
• Arreglos unidimensionales• Lectura-escritura de elementos en arreglos
unidimensionales
• Inicialización de un arreglo
• Arreglos multidimensionales• Inicialización de arreglos multidimensionales
• Lectura-escritura de elementos de arreglos multidimensionales
• Envió de un arreglo a funciones en C (Paso de referencia)
• Tamaño de un arreglo• Función Sizeof
2
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Introducción• Un arreglo estático es una colección finita yconstante (que no cambia su tamaño) de elementosdel mismo tipo.
• Un arreglo también es conocido como vector, matrizo array.
• Se pueden crear arreglos de cualquier tipo de datoen C, es decir, tipos de dato simple, estructurado,archivos e incluso de apuntadores.
3
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Arreglos unidimensionales• Se conocen dos tipos de arreglos: los unidimensionales
y los multidimensionales. Y al igual que otra variableprimero se debe declarar antes de utilizarse.
• Sintaxis para declarar un arreglo unidimensional:
<tipo_de_dato> identificador[tam_arreglo];
• Cuando se declara un arreglo unidimensional omultidimensional, se debe indicar el tamaño de dichoarreglo y este permanecerá constante durante el ciclo devida del programa o de la función, es decir, no podrácambiar su tamaño de manera dinámica. (Arreglosestáticos)
4
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Por ejemplo:
int arreglo[ 10 ];
• Esta declaración hace que el compilador le indiqueal sistema operativo que reserve espacio suficientepara almacenar 10 valores enteros.
• En estos casos, cuando se declara un arreglo el S.O.le asigna a dicho arreglo una porción consecutiva dememoria que es múltiplo del tamaño del tipo dedato con el que se declaro el arreglo.
5
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• int arreglo[ 10 ];
6
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Lectura-escritura de elementos en arreglos unidimensionales
• Cada ítem del arreglo se le denomina elemento delarreglo.
• Todos los elementos que constituyen un arreglo senumeran consecutivamente comenzando en 0 hastan-1 donde:
• 0: es el primer elemento del arreglo,
• n-1: es el ultimo elemento del arreglo y
• n: es el tamaño total del arreglo.7
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• A los valores de 0 a n-1 se les denomina índices osubíndices del arreglo, es decir, un índice osubíndice nos ubica en una posición determinadadentro del arreglo y nos permite tener accesodirecto al elemento de ese índice, para obtener suvalor o para modificarlo,
• Por ejemplo:Índice o subíndice del arreglo
Tamaño total del arreglo
Se obtiene el valor del elemento (10 + 1)
Se modifica el valor del elemento (25 + 1)
int arreglo[30];
int dato;
dato = arreglo[10];
arreglo[25] = 2344;8
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Inicialización de un arreglo• Al igual que una variable local, un arreglo puede estar
previamente inicializado antes de usarlo, caso contrario elarreglo contendrá datos basura.
• Existen diferentes formas de inicializar un arreglo:1. int numeros[6] = { 10,20,30,40,50,60 };
2. int numeros[] = { 10,20,30 };
3. char cad[] = {‘h’,‘o’,‘l’,‘a’,‘\0’};
4. char s[] = “hola";
• Cada elemento dentro de las llaves corresponde a unelemento que se almacena en una localidad del arreglo.
• Un caso especial es el de las comillas dobles ʺcadenasʺ, estetipo de inicialización aplica solamente para arreglos decaracteres y también significa que se está inicializando dichoarreglo.
9
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Ejemplos
• Inicializar un arreglo de números aleatorios
• Inicializar un arreglo de con el abecedario
int i;
for( i = 0, i < 6, i++ )
{
numeros[i] = rand();
}
char i;
int h = 0;
for( i = ‘a’, i <= ‘z’, i++ )
{
letras[h] = i;
h++;
}
10
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Arreglos multidimensionales• Los arreglos multidimensionales son los que tienen
más de una dimensión, los más usuales son los dedos dimensiones que también son conocidos comotablas o matrices.
11
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Una arreglo de dos dimensiones tienen 2 índices que nos ayudan a ubicar un elemento dentro del arreglo.
12
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
La sintaxis para la declaración de un arreglo de dosdimensiones seria:
<tipo_dato> identificador [tam_filas][tam_columnas];
• Por ejemplo:
int datos[3][3];
• Esta línea de código declara un arreglo en dosdimensiones de 3 X 3 elementos, es decir, este arreglocontendrá en su interior 9 elementos de tipo entero.
13
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Acceso arreglos multidimensionales
• Para acceder a alguno de sus elementos se utilizan losdos índices, es decir:
datos[0][2] = 12;
datos[2][0] = 0;
datos[2][2] = 30;
• Un arreglo en dos dimensiones en realidad es un arreglode arreglos unidimensionales, es decir, cada elementodel un arreglo no es un valor entero, sino que cadaelemento es un arreglo.
0 1 2
0 12
1
2 0 30Los arreglos vande 0 hasta n-1, datos es un arreglode 3 X 3 entonces datos[2][2] hace referencia al ultimo elemento del arreglo
14
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
• Es decir:int datos[3][3];
Es un arreglo que contiene 3 arreglos de treselementos cada uno.
datos[0]
datos[1]
datos[2]
datos[2][0]
datos[2][1]
datos[2][2]
15
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Inicialización de arreglos multidimensionales
• Existen varia formas de inicializar un arreglo de dosdimensiones:
a) int datos[3][3] = { 1,2,3,4,5,6,7,8,9};
b) int datos[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
c) int datos[3][3] = { {1,2,3},
{4,5,6},
{7,8,9}};
d) o finalmente con un ciclo anidado:
for ( i = 0; i < 3; i++){ //i manipulara las filas
for( j = 0; j < 3; j++){ //j las columnas
datos[i][j] = rand()%30; //Se delimita los valores
} //entre 0 y 30
}
Todas estas inicializaciones tienen el mismo efecto.16
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Lectura-escritura de elementos de arreglos multidimensionales
• Para escribir o leer un elemento de un arreglobidimensional siempre se va a requerir utilizar losdos índices con los cuales se declaro el arreglo.
• Para escribir en uno de ellos, obteniendo el valordesde consola sería:
int datos[3][3];
printf( "Escribe un dato entero: \n" );
scanf( "%d", &datos[1][2] );
printf( El dato capturado fue: %d , &datos[1][2] ); 17
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones
• Para mandar por referencia un arreglo a una función sedebe entender que el nombre del arreglo, es decir, elidentificador que se le coloco al arreglo es un apuntador,por lo tanto para mandar un arreglo a una función sehace de la siguiente forma:
int arregloInt[10];
funcion( arregloInt );
.
.
.
int funcion( int *ptr ){
ptr[0] = 123;
ptr[1] = 7;
}
Se manda el nombre arregloIntque es un apuntador que contiene la dirección del primerelemento dentro del arreglo.
La referencia del arregloInt se debe recibir con una variable apuntador del mismo tipo que fuedeclarado el arreglo.Hacen ya referencia
directamente a loselementos de arregloInt
18
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones
• Para un arreglo de dos dimensiones sucede lo mismo,solo hay que tomar en cuenta que el nombre de arreglomultidimensional es un apuntador a apuntadores, esdecir, el apuntador a apuntadores quedara definidodependiendo de la dimensión del arreglo, así para unarreglo de dos dimensiones:
int arreglo2D[5][10];funcion(arreglo2D);...
int funcion2( int (*ptr)[10] ){ptr[5][8] = 1;ptr[9][6] = 7542;
}
Se recibe con un apuntador a cadenaya que se trata de un arreglo de 2Dy su nombre seria un apuntador a una cadena
Hacen ya referencia directamente a loselementos de arreglo2D
19
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Tamaño en bytes de un arreglo• Para obtener saber el tamaño de un arreglo, se
puede utilizar la función sizeof(), esta funciónnos devolverá el numero de bytes reservados para elarreglo completo.
• Por ejemplo:
int arreglo[ 10 ];
int tamanio;
tamanio = sizeof( arreglo );
20
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez
Función Sizeof ( )• sizeof() también sirve para darnos el tamaño de un
tipo de dato en especifico o el tamaño de un elementodentro del arreglo.
• Por ejemplo:
int tamanio;
double a = 3.1455; float b = 3.084;
char c = ‘e’;
tamanio = sizeof( a );
tamanio = sizeof( b );
tamanio = sizeof( c );
tamanio = sizeof( tamanio );
tamanio = sizeof( arreglo[1] );21
12
Arr
eglo
s e
stát
ico
s en
CA
lgo
ritm
ia y
pro
gram
ació
n e
stru
ctu
rad
aP
rof.
Edga
rdo
Ad
rián
Fra
nco
Mar
tín
ez