Funciones en C

Author
By Darío Rivera
Posted on 2022-08-04 in Lenguaje C

Las funciones son los bloques de código más importantes en C. Mediante las funciones podemos reutilizar código y obtener o no un valor de retorno como resultado. En este post veremos todo acerca de las funciones.

Declaración de funciones

En C podemos declarar funciones empezando por el tipo de dato de retorno, el nombre de la función más paréntesis y los delimitadores del bloque de código. Observa por ejemplo que la función más importante en C, la función main sigue este patrón también.

#include <stdio.h>

int main()
{
    printf("Hola mundo");
    return 0;
}

Una función debe ser declarada antes de su uso. Veamos el siguiente ejemplo en donde separamos la impresión del mensaje "Hola mundo" en una función.

#include <stdio.h>

void say_hello()
{
    printf("Hola mundo");
}

int main()
{
    say_hello();
    return 0;
}

Como regla general, antes de invocar una función hay que declararla en algún lugar antes del código en donde se invoca. Eso implica que todo el código de la función debe estar antes de donde se utilice o al menos su prototipo (la cabecera empleada en la definción de la función).

El sigiente ejemplo es equivalente al anterior con la diferencia que el código de la función está al final y su declaración al casi al comienzo del archivo.

#include <stdio.h>

void say_hello();

int main()
{
    say_hello();
    return 0;
}

void say_hello()
{
    printf("Hola mundo");
}

Argumentos de funciones

Las funciones en C pueden aceptar argumentos especificando el tipo y nombre de cada uno de ellos. Veamos la siguiente función en donde se solicitan dos argumentos de tipo float y se retorna a su vez un float.

#include <stdio.h>

float triangle_area(float base, float height)
{
    return base * height / 2;
}

int main()
{
    float base = 10.0;
    float height = 20.0;

    printf("The area is %.2f\n", triangle_area(base, height));
    return 0;
}

Siempre que no se requieran parámetros en una función debe especificarse el tipo void y que la ausencia de parámetros indica un número indeterminado de ellso y en C++ la ausencia de los mismos.

float funcion_x(void);

Prototipo de funciones

El prototipo de una función indica el número y tipo de argumentos que va a usar una función, así como también su valor de retorno. Los prototipos de funciones siempre deben ser declarados al comienzo de un archivo C. Tomemos el mismo ejemplo del área del rectángulo para colocar el prototipo de la función al inicio del archivo y definir la función más abajo.

#include <stdio.h>

float triangle_area(float base, float height);

int main()
{
    float base = 10.0;
    float height = 20.0;

    printf("The area is %.2f\n", triangle_area(base, height));
    return 0;
}

float triangle_area(float base, float height)
{
    return base * height / 2;
}

Paso de argumentos por valor y referencia

La mayoría de las veces vamos a pasar argumentos por valor. Esto significa que una copia del valor de las variables son pasadas a través de los argumentos de una función hacia su interior. Otra forma de pasar argumentos es por referencia, en este caso se pasa la dirección de memoria en lugar del valor.

Dado que una variable pasada por referencia apunta a la dirección de memoria de la variable esta puede ser modificada. Esto no pasa cuando se pasan por valor los argumentos. Veamos el siguiente ejemplo en donde el resultado del cálculo del área del triángulo es puesto en el tercer parámetro.

#include <stdio.h>

float triangle_area(float base, float height, float *area);

int main()
{
    float base = 10.0;
    float height = 20.0;
    float area;

    triangle_area(base, height, &area);
    printf("The area is %.2f\n", area);
    return 0;
}

float triangle_area(float base, float height, float *area)
{
    *area = base * height / 2;
    return *area;
}

Dado que la función acepta un punto como tercer parámetro, debemos utilizar el operador de dirección (&) para acceder a la dirección de memoria de la variable y poderla pasar en la función.

Al principio puede parecer un poco confuso, pero basta interpretar que el último argumento es de tipo puntero (float *), en este caso un puntero de una variable float. Por lo que cada vez que utilicemos la variable area estamos utilizando su dirección de memoria. Para desreferenciar la variable, debemos utilizar el operador de desreferencia (*). Esto hace que accedamos a la variable en sí nuevamente y podamos asignarle un valor.

Arrays como argumentos

Podemos pasar también arrays como argumentos de funciones. Modifiquemos un poco el ejemplo del área del triángulo y veamos que pasa si enviamos base y altura como un array.

#include <stdio.h>

float triangle_area(float dimension[]);

int main()
{
    float dimension[2] = {10.0, 20.0};

    printf("The area is %.2f\n", triangle_area(dimension));
    return 0;
}

float triangle_area(float dimension[])
{
    return dimension[0] * dimension[1] / 2;
}

Algo muy curioso que sucede con los arrays, es que el nombre de la variable de un array realmente guarda la dirección de memoria del primer elemento del array, por lo que podríamos cambiar el prototipo de la función en el anterior ejemplo a lo siguiente y funcionaria exactamente de la misma manera.

float triangle_area(float *dimension);

Lo que quiere decir que la siguiente línea de código de impresión también es reemplazable por la siguiente:

printf("The area is %.2f\n", triangle_area(&dimension[0]));

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.