Cómo pasar de arreglos a funciones

Anuncio
Universidad Tecnológica Nacional
Facultad Regional Córdoba
Departamento Ingeniería en Electrónica
Catedra de Infomática 1
JTP Ing. Mascietti, Norma
PA Pereira, Mauro Alejandro
Cómo pasar de arreglos a funciones
Para pasar un arreglo como argumentos a una función, especifique el nombre del arreglo sin corchetes y el
tamaño de dicho arreglo, por ejemplo si declaro un arreglo tempCadaHora como:
int tempCadaHora[24];
la llamada de función se debe declarar:
modificaArreglo(tempCadaHora, 24);
Esto se debe que a diferencia de los arreglos char que contienen cadenas de caracteres, estos tipos de arreglos no
tienen un terminador especial (\0). Por esta razón, el tamaño del arreglo se debe pasar si o si a la función, para que ésta
pueda procesar el número apropiado de elementos, y no ocurra un error como por ejemplo un desbordamiento.
C pasa automáticamente por referencia los arreglos a funciones; las funciones llamadas pueden modificar los
valores del elemento en los arreglos originales de las funciones que las llaman. En pocas otras palabras, cuando a una
función se le pasa la dirección de memoria de un arreglo, la función internamente no genera una copia, sino que le
asigna al nombre del arreglo que se declaró dentro de ella, la dirección de memoria del arreglo original.
Se debe recordar siempre que el nombre de un arreglo es en realidad la dirección del primer elemento del
arreglo, por lo tanto es indistinto escribir:
modificaArreglo(tempCadaHora, 24);
modificaArreglo(&tempCadaHora[0], 24);
modificaArreglo(&tempCadaHora, 24);
El especificador de conversión %p nos permite desplegar las direcciones de memoria como números
hexadecimales.
Pasar arreglos por referencia tiene sentido por motivos de rendimiento. Si se pasan arreglos grandes por valor
y de manera frecuente, como copias de cada elemento, esto requerirá demasiado tiempo y demasiado espacio de
almacenamiento.
Ejemplo de aplicación:
#include <stdio.h>
#define tam 100
void modificaArreglo(int [], int);
//prototipo de la función
int main(int argc, char **argv)
{
int vect[tam]={0},i=0,cant=0;
//consejo: siempre inicialice a 0 lo que pueda
//compruebo las tres formas de obtener la dirección de memoria del arreglo
printf("Dirección de memoria\n vect:%p\n &vect[0]:%p\n &vect:%p\n",vect,&vect[0],&vect);
printf("Ingrese la cantidad de elementos con los cuales desea trabajar\n");
scanf("%d",&cant);
for(i=0;i<cant;i++){
//ingreso los valores
printf("Ingrese el valor %d\n",i+1);
scanf("%d",&vect[i]);
}
for(i=0;i<cant;i++)
//imprimo antes de modificar
printf("Valor[%d]:%d\n",i+1,vect[i]);
modificaArreglo(vect,cant);
printf("Se modificó el arreglo\n");
for(i=0;i<cant;i++)
printf("Valor[%d]:%d\n",i+1,vect[i]);
}
//llamo a la función
//imprimo despúes de modificar
return 0;
void modificaArreglo(int b[],int tamanio){
//declaración del cuerpo de la función
int i=0; //recuerde, i no es una variable global, por lo que pueden
//haber dos variables i declaradas tanto en el main() como en la función
//modificaArreglo()
//Comprobamos que efectivamente, b[] hace referencia a vect[]
printf("Dirección de memoria de b[]:%p\n",b);
for(i=0;i<tamanio;i++)
b[i]+=2;
}
1
Universidad Tecnológica Nacional
Facultad Regional Córdoba
Departamento Ingeniería en Electrónica
Catedra de Infomática 1
JTP Ing. Mascietti, Norma
PA Pereira, Mauro Alejandro
Pueden existir situaciones en sus programas en las que no se debe permitir que una función modifique los
elementos de un arreglo. C nos proporciona el calificador de tipo const para prevenir que una función modifique los
elementos de un arreglo.
Si al prototipo y a la declaración de la función del ejemplo anterior los escribo como:
void modificaArreglo(const int [], int); //prototipo de la función
void modificaArreglo(const int b[],int tamanio){ //declaración de la función
el compilador arrojará el siguiente error:
Ejemplo2.c:59:3: error: assignment of read-only location ‘*(b + …
Cualquier intento de modificar un elemento del arreglo en el cuerpo de la función da como resultado un error en
el tiempo de compilación. Esto permite al programador corregir un programa para que no intente modificar los elementos
de un arreglo.
Los errores pueden ser diferentes dependiendo del compilador y del sistema.
Ejercicio 1:
Realice un programa en C en el cual el usuario cargue la cantidad de elementos a usar en un vector, cargue los
valores de este vector, y que luego, a través de una función a la que se le pase por referencia dicho vector, se ordene por el
método de la burbuja. Imprima los valores del vector antes y después de la llamada en el main() para corroborar dicho
ordenamiento.
2
Descargar