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