En el lenguaje C una función se define de la siguiente manera:
tipo nombre (tipo param1, tipo param2, ...)
{
/*cuerpo de la función*/
...
[return expresión;]
}
Donde:
tipo es tipo del dato que devuelve. Si no devuelve nada se declarará de tipo "void". Sólo se pueden devolver tipos asignables: enteros, reales, punteros, estructuras y void. Si no se especifica el tipo, se supone que es entero.
nombre es el nombre con que la función es identificada.
Parámetros de la función. Es una lista de nombres de variables separados por comas con sus tipos asociados, que recibirán valor en el momento de llamar a la función. Los paréntesis siempre deben aparecer, aunque la función no tenga argumentos. Estas variables sólo estarán definidas dentro de la función, es decir, son locales a la función, salvo que hayan sido definidas como globales (ver al final de este apartado), creándose al comienzo de la ejecución de la función y destruyéndose al finalizar ésta. Esto es aplicable a cualquier otra variable declarada dentro de la función, excepto si se declaran como static (esta sentencia debe aparecer antes del tipo de la variable). En este caso el compilador no las destruye y guarda su valor para la próxima llamada, aunque la variable sigue teniendo limitado el ámbito al interior de la función.
La sentencia return es opcional, sólo debe aparecer si la función retorna un valor. Puede aparecer en cualquier punto del cuerpo de una función.
En C no se permite la definición anidada de funciones, es decir, definir una función dentro de otra. Si se permite la recursividad.
Una variable es global cuando se declara fuera de una función, y se puede utilizar en todo el programa desde el punto de la declaración. Todas las variables usadas en los ejemplos mostrados en estos apuntes son locales, es decir, declaradas dentro de un bloque de sentencias, y su ámbito de aplicación es dentro del bloque en que son declaradas. En general, No es aconsejable el uso de variables globales.
Toda función debe ser declarada antes de ser definida. La forma de declarar una función es la siguiente:
tipo nombre (tipo param1, tipo param2, ...);
La declaración de una función de esta forma se llama prototipo.
Las funciones son siempre globales, de manera que su declaración debe ser realizada al principio del programa; si la primera función definida en éste es la main(), antes de esta definición. La declaración puede evitarse si la función es definida antes de ser invocada, sin embargo, es aconsejable declarar al comienzo del programa los prototipos de las funciones que vamos a definir, incluyendo comentarios sobre su finalidad.
Las funciones pueden ser llamadas desde cualquier punto de un programa.
La llamada de una función se produce mediante el uso de su nombre en una sentencia, pasando una lista de argumentos que deben coincidir en número y tipo con los especificados en la declaración, en caso contrario se produciría una conversión de tipos cuyos resultados pueden no ser los esperados. En general, los parámetros se pueden pasar por valor y por referencia, usando en este caso punteros (dirección de memoria donde se almacena la variable), que serán vistos más adelante. En este último caso será posible modificar el valor de la variable usada en la llamada.
Ejemplo_Fun_1. Ejemplo de uso de funciones donde es obligatorio la declaración
#include <stdio.h>
/* Prototipo de la función */
int Maximo(int var1, int var2); /*Devuelve el mayor de var1 y var2 */
/* Función principal */
int main (void)
{
int i = 3, j = 5;
printf ("Maximo (%d, %d) = %d\n", i, j, Maximo (i,j));
return (Maximo (i, j));
}
/* Definición de la función */
int Maximo (int a, int b)
/* Esto también se podría hacer:
int Maximo (a,b)
int a,b; */
{
if (a < b)
return (b);
else
return (a);
}
Ejemplo_Fun_2. Ejemplo anterior pero definiendo la función de manera que no sea necesaria su declaración.
#include <stdio.h>
/* Definición de la función */
int Maximo (int a, int b)
/* Esto también se podría hacer:
int Maximo (a,b)
int a,b; */
{
if (a < b)
return (b);
else
return (a);
}
/* Función principal */
int main (void)
{
int i = 3, j = 5;
printf ("Maximo (%d, %d) = %d\n", i, j, Maximo (i,j));
return (Maximo (i, j));
}
Ejemplo_Fun_3. Ejemplo de función tipo void y sin parámetros
#include <stdio.h>
#include <stdlib.h>
/* Declaración de la función */
void suerte ();
/* Función principal */
int main (void)
{
int i;
for (i=0; i<10; i++)
suerte();
return 0;
}
/* Definición de la función */
void suerte ()
{
int i;
i= 1 + (int) (10.0 * rand() / (RAND_MAX + 1.0));
/* La constante RAND_MAX esta definida en el fichero stdlib.h */
printf ("Tu número de la suerte es %d\n", i);
}
Ejemplo_Fun_4. Ejemplo error típico en el uso de funciones
#include <stdio.h>
/* Prototipo */
void cambia (int var1, int var2);
int main ()
{
int i=1, j=2;
Cambia (i, j);
printf ("i=%d, j=%d", i, j);
return 0;
}
/* Definición */
void cambia (int i, int j)
{
int tmp;
tmp=i;
i = j;
j = tmp;
}
Responde a la siguiente pregunta: