En C una función es una subroutina que contiene una o más instrucciones y que efectúa una o más operaciones. Las funciones están constituidas por un nombre y una lista de argumentos. En general es posible asignar a una función cualquier nombre excepto main, que está reservado a la función que inicia la ejecución del programa. Dentro de una función no se puede definir ninguna otra.
tipo_f es opcional e indica el tipo de valor que la función retorna con la instrucción return. Si se omite el tipo la función da un valor de tipo entero. declaración_parametros es una lista de variables con sus tipos donde cada par (tipo y variable) va separado por comas. Estas variables contienen el valor de los argumentos cuando se llama a la función
La instrucción return tiene dos objetivos precisos. Primero permite terminar anticipadamente la ejecución de una función y segundo pasa un valor a la función que la llama.
Antes de poder ser llamada una función el compilador tiene que conocer un prototipo de la misma. Esto se consigue definiendo (es decir programando) la función en un lugar del código fuente que venga antes del que contiene a la función que la llama o declarando al inicio del programa un prototipo que dice el nombre y la forma que ha de tener la misma.
Con el prototipo se consiguen dos objetivos. El primero el de indicar el tipo valor que retorna la función y el segundo es el de especificar el número de parámetros y el tipo de los mismos.
Generalmente el prototipo que se encuentra antes de cualquier llamada a la función va puesto en la parte superior del programa o en un archivo de cabecera (#include <archivo.h>).
Una función que no retorna valor alguno se declara como de tipo void. De esta forma se impide que la función pueda ser utilizada en una expresión.
El standard ANSI del lenguaje C establece que cuando un prototipo de función no include parámetros la función puede ser llamada con cualquier número y cualquier tipo de ellos. Si se quiere señalar explícitamente que la función no tiene parámetros se debe especificar con void en la lista de los mismos.
En C cada función constituye un bloque de código por sí mismo cuyas instrucciones están reservadas a la función que las contiene y ninguna otra función tiene acceso a ellas si no es a través de una llamada de función.
Variables locales son aquellas que solo pueden ser utilizadas por la función que las contiene o para ser más precisos por el bloque que las contiene. A este respecto es importante señalar que dichas variables solo tienen vida mientras se ejecuta el bloque de programa donde han sido declaradas desapareciendo cuando se sale de dicho bloque dejando así el espacio de memoria que ocupaban a otras variables locales de otros bloques del programa.
Como es notorio, si en una función se preve el uso de argumentos es necesario declarar variables que reciban los valores de tales argumentos. Se trata de los llamados parámetros formales que nos indican la forma (número de ellos y tipo) de los argumentos (valores o expresiones) que se pasan a la función a través de la lista de parámetros. Las variables que constituyen la lista de parámetros actúan como cualquier variable local interna en la función.
Es oportuno asegurarse que los parámetros formales declarados son del mismo tipo que los utilizados para llamar la función.
Las variables globales están a disposición de cualquier instrucción del programa, independientemente de la función donde se encuentre. Su campo de visibilidad abarca todo el ámbito del programa.
Las variables globales se declaran fuera de cualquier función, normalmente al inicio del programa.
Si bien ni en main() ni en func1() ha sido declarada la variable counter, las dos la pueden utilizar. func2() sin embargo ha declarado una variable local counter. Cualquier referencia a counter en la función func2() se atribuye a la variable local counter y no a la global.
Las variables globales son útiles cuando se utilizan los mismos datos en muchas funciones. Sin embargo es mejor evitarlas pues quitan flexibilidad al programa.