You are on page 1of 12

Uso de funciones en C

1 FUNCIONES 1

1.1 PROTOTIPO DE UNA FUNCIÓN 1

1.2 DEFINICIÓN DE UNA FUNCIÓN 2


1.2.1 VALOR DE RETORNO 3
1.2.2 PARÁMETROS 5
1.2.3 APUNTADORES COMO PARÁMETRO 7

1.3 USO DE PROTOTIPOS 10

FUNCIONES

Una función es un conjunto de instrucciones agrupado bajo un mismo nombre. Así cada vez que se
desea ejecutar las instrucciones se emplea el nombre de la función en lugar de simplemente copiar y
pegar las instrucciones.

Al igual que las variables, las funciones tienen tres momentos en un programa: (a) cuando se declara su
existencia –prototipo– (b) cuando se definen, y (c) cuando se usa en algún punto del programa –
llamada–. Estos tres momentos los analizaremos a lo largo de este texto.

1.1 PROTOTIPO DE UNA FUNCIÓN

Un “prototipo” es la declaración de la existencia de una función. Se indica que existe una función cuyo
nombre, parámetros y valor de retorno se detallan en el prototipo. El prototipo se asemeja mucho a la
definición de la función sólo que, en este caso, no se explica qué hace la función. Todo prototipo
termina con un punto y coma (;). Por ejemplo, en la imagen se indica que existe una función
denominada suma que recibe dos parámetros enteros y regresa un valor entero:

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 1


A partir del prototipo el compilador puede determinar la validez de la llamada a la función en algún
punto del programa, en este caso verificando que en la llamada se entreguen dos parámetros enteros y se
asigne su resultado a una variable entera (en caso de asi desearlo el usuario).

Como al compilador le importa unicamente el tipo de parámetros que una función requiere para verificar
la llamada, estrictamente no es necesario asignarles nombre, por lo que seria totalmente equivalente
declarar la función suma de la siguiente manera:

1.2 DEFINICIÓN DE UNA FUNCIÓN

Se define a una función cuando se especifican las operaciones que dicha función debe realizar cada vez
que sea llamada. Dentro de la definición debe indicarse el tipo de valor que regresa, los parámetros que
recibe y las operaciones que debe hacer con esos parámetros.

La estructura general de una función es:

<tipo de valor de retorno> <nombre de la función> ( <lista de parámetros> ) {


<cuerpo de la función>
}

Donde:

<tipo de valor de retorno> Si la función no regresa un valor que pueda asignarse a


una variable o emplearse en alguna expresión, entonces el tipo de retorno es void. Si la función
regresa algún valor entonces se debe especificar su tipo (int, float, double, unsigned,
etc)

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 2


<lista de parámetros> Un parámetro es un valor que se entrega a la función para que
realice la tarea asignada. La lista de parámetros debe contener, tipo y nombre de cada parámetro
separados por comas. Si uno o más parámetros son del mismo tipo se tiene que especificar el tipo
para cada uno de ellos.

<cuerpo de la función> instrucciones que deberán ejecutarse cada vez que se llame a la
función. Puede contener declaraciones de variables, y se delimita por llaves {}

Más adelante, se describen estos elementos con más detalle.

1.2.1 VALOR DE RETORNO

Una función puede entregar un valor como resultado de su ejecución. Este valor puede ser asignado a
una variable o empleado dentro de una expresión y se denomina valor de retorno. Por ejemplo, la
función rand() regresa un número entero aleatorio que puede asignarse a una variable o emplearse en
una expresión.

En el siguiente segmento de código, se observa que:

línea 6: El resultado de la llamada a la función rand() es asignado a la variable n.


línea 9: la función rand()usa para pasar un número aleatorio a la función printf().

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 3


También podemos observar dos de los tres momentos de una función: la definición la función main()
-líneas 4 a 13- y la llamada a una función, la función rand() -en las líneas 6 y 9- y la llamada a la
función printf() -en la línea 9 -.

Además observe que se ha definido que la función main() entrega como resultado de su llamada un
número entero

Cuando se ejecuta función el número entero que se regresa (12345) queda establecido por la instrucción
return -línea 12-.

En el caso de la función rand() el valor de retorno se asigna a la variable n o se emplea en la función


printf() .

Particularmente la función main() al ser el punto de arranque del programa el valor de retorno se lo
entrega al sistema operativo, y el sistema operativo lo reporta cuando termina el programa, observe que,
cuando se ejecuta este programa desde CodeBlocks, la consola reporta dicho valor al momento de la
salida.

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 4


La instrucción return puede aparecer varias veces en una función y cuando la ejecución de la función
llega a alguna de estas líneas, la función termina regresando el valor especificado.

Por otro lado, si la función fue declarada como una función que no devuelve algún valor (void) y se
desea indicar que en ese punto debe terminar la función, entonces la instrucción return debe ser
invocada sin ningún otro valor y terminada con un punto y coma, es decir: return;

1.2.2 PARÁMETROS

Si la función requiere información adicional para poder llevar a cabo su tarea, entonces recibe esta
información al momento de ser invocada (parámetros). Por ejemplo, suponga que se desea sumar dos
números y el resultado de la llamada será su suma:

La línea cuatro presenta el “prototipo” de la función, es decir se declara que existe una función llamada
suma(), que requiere para operar dos valores (parámetros) el primero se llamará a y el segundo b,
además ambos son enteros. Sabemos que esta línea es la declaración de la existencia de la función
porque termina con punto y coma.

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 5


Las líneas 19 a 23 definen a la función suma(), recibe dos valores ambos enteros (a y b) los suma y
regresa el resultado por medio de la instrucción return (línea 22).

Los parámetros y las variables declaradas dentro de una función sólo pueden ser utilizados dentro de la
función. Su vida comienza con la invocación a la función y termina con la finalización de la función 1.
Una función no puede “ver” las variables que existen en otra función, el único mecanismo para
compartir información son los parámetros.

Considérese la definición de la función suma (líneas 19 a 23) y la llamada a la función suma de la línea
8:

Al momento de llamar a la función se copia cada valor que se proporciona en la llamada a los
parámetros a y b de la función asignándolos de izquierda a derecha en orden de aparición, el
valor 10 al parámetro a y el valor 20 al parámetro b.

Los parámetros a y b dentro de la función son variables y se comportan como cualquier otra
variable dentro de la función. Simplemente se inicializan con los valores que reciben en el
momento en que la función es llamada.

Considere ahora la llamada de la línea 11, en este caso el valor copiado al parámetro a es el valor de la
variable x, mientras que el parámetro b se le asigna el valor 20. Como x vale 40 (asignado en la línea
10), entonces a vale 40 y b vale 20. La figura siguiente ilustra el mecanismo:

1
Si se emplea el modificador static al momento de declarar una variable, ésta no deja de existir cuando termina la
función, sin que continúa existiendo a lo largo de todo el programa. Usted deberá justificar ampliamente por qué utiliza este
modificador

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 6


Como puede verse, el valor del parámetro siempre se copia. Por lo tanto cualquier modificación que
sufra el parámetro dentro de la función no afecta a la variable original. En la figura siguiente, la función
resta() recibe dos parámetros y aunque dentro de la función el parámetro a se modifica, el valor de x
permanece sin cambio al terminar la función.

Pero ¿qué pasa si deseamos modificar el valor de x, es decir que se haga algo en la función y que al salir
x haya sido modificada?

1.2.3 APUNTADORES COMO PARÁMETRO

De la misma manera en que podemos pasar un entero, también podemos pasar como parámetro una
dirección y su declaración es similar a la de cualquier variable tipo apuntador.

Considere el siguiente código:

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 7


Como se observa, la función inc()recibe como parámetro una dirección, en dicha dirección se
encuentra almacenado un entero (parámetro int *a) , la dirección se almacena en el parámetro a.
Dentro del cuerpo de la función (líneas 15 a 18) se utiliza el parámetro a para recuperar el valor entero
e incrementarlo.

La tabla de símbolos del programa podría ser:


Símbolo Tipo Dirección Función
x int 50 main()
a Int * 53 inc()

Y la memoria podría ser:


48
49
50
51
52
53
54
55

Justo en el momento en que se llama a la función inc() el funcionamiento seria más o menos:

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 8


La variable a ahora tiene un 50, y en esa dirección se encuentra un entero de valor 10.

Al comenzar a ejecutarse la función inc(), se emplea a la variable a para incrementar el 10 de la


dirección 50 -línea 15-

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 9


Con lo que al final de la función el valor almacenado en la dirección 50 se modifica a 11. Esto trae como
consecuencia que la variable x cambia de 10 a 11 imprimiéndose en pantalla un 11.

Este es el mecanismo que se debe seguir siempre que se quiera que una variable sea modificada dentro
de una función.

1.3 USO DE PROTOTIPOS

Siempre que se define una función es necesario que el compilador conozca cuál es la estructura del
encabezado de la función, a fin de verificar, en el programa, que el uso de esa función es correcto.

Por ejemplo, el siguiente programa en CodeBlocks genera una advertencia (warning):

Sin embargo, el compilador fue capaz de generar el archivo ejecutable (después de todo únicamente hay
advertencias y, nos han enseñado que esos no importan). Al ejecutar el programa obtenemos la siguiente

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 10


salida (el número puede variar según la computadora y otros factores), evidentemente no es el valor
correcto (debería ser 30):

Si regresamos a leer con cuidado la advertencia dice:

Que traducido seria algo así como:

advertencia: delaclaración implícita de la función ‘suma’

lo que indica esta advertencia básicamente es: “como el compilador no ha recibido la


declaración de la existencia de la función suma (recuerde que el proceso de un
archivo es de arriba abajo), el compilador ha hecho alguna suposición respecto a la
estructura de la función”, es como una apuesta, todo ello con la intención de poder generar un
archivo ejecutable, obviamente fue incorrecta.

Al colocar el prototipo de la función al principio del programa la situación se soluciona completamente,


como puede apreciarse en la figura siguiente, 0 warnings y corrida correcta.

Una posible alternativa hubiera sido mover toda la función antes de la primera llamada a la función. Sin
duda esto también soluciona el problema, pero, hay ocasiones donde ello no es viable o simplemente no
se desea modificar su posición.

M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 11


M en C Gabriel Castillo Hernández gch@pumas.iingen.unam.mx 12

You might also like