Las variables de tipo static son variables permanentes que se encuentran dentro de una función o de un archivo fuente. Se diferencian de las variables globales en que no pueden verse desde el exterior del bloque o del archivo donde fueron declaradas. Sin embargo (a diferencia de las auto variables) conservan su existencia así como su valor fuera del bloque o del archivo de su declaración.
Cuando se aplica el modificador static a una variable local, el compilador asigna a esta un área de memoria permanente, exactamente como sucede con una variable global. La diferencia fundamental entre las dos es que la variable local static solo puede ser vista desde el interior del bloque donde ha sido declarada. Se trata de una variable local que mantiene el propio valor entre una llamada y otra.
Aplicando el especificador static a una variable global el compilador crea una variable global cuya validez se extiende solo a las funciones definidas dentro del archivo donde dicha variable fue declarada.
En general existen dos modos para pasar argumentos a una función. El primero es lo que se llama llamada por valor (call by value). El segundo es la llamada por referencia (call by reference).
La llamada por valor copia el valor de un argumento en el parámetro formal de la función. Ello consigue que eventuales modificaciones de dicho parámetro dentro de la función no tenga ningún efecto sobre la variable utilizada para ser pasada a la función.
En este ejemplo, el valor del argumento de cuadrado(), 20, es copiado en el parámetro x. Cuando tiene lugar la asignación x=x*x, el único elemento modificado es la variable local x, mientras la variable i utilizada para llamar a cuadrado(), mantiene su valor original 20. La visualización sería: 400=20^2.
En este caso es la dirección (puntero, en inglés pointer) del argumento lo que se copia en el parámetro. En el interior de la función dicho puntero permite acceder al argumento utilizado en la llamada. Esto significa que todo cambio aportada al parámetro incide sobre la variable utilizada para llamar a la función.
Los punteros en una función son pasados como cualquier otro valor. Obviamente es necesario que los parámetros sean declarados de tipo puntero (pointer).
Cuando se utiliza como argumento un vector para llamar a una función se le pasa la dirección de dicho vector y no una copia de del mismo. La dirección de un vector es un puntero su primer elemento.
El vector k es pasado a la función minimo() como un puntero a un valor de tipo entero. Dado que el lenguaje C no prevé el control sobre el límite de los vectores, las dimensiones reales del mismo son irrelevantes para el parámetro (aunque naturalmente no para el programa).
La función minimo se podría haber declarado:
Quiere decir que está permitido atribuir a todo puntero un índice con [], como si se tratara de un vector.