You are on page 1of 6

Variables locales y variables globales.

Una variable es local a una funcin cuando se la declara dentro de la funcin. En este caso, las variables son accesibles slo desde dentro de la funcin donde se la declara. Esto es, se las puede acceder para leer o escribir slo desde dentro de la funcin (alcance). Por otro lado, durante la ejecucin del programa estas variables son creadas en su declaracin y se destruyen al terminar la ejecucin de la funcin donde se las declara (tiempo de vida). En el ejemplo 2, las variables i y j son locales a cada funcin. Notar que en ambas funciones los nombres de las variables son las mismas. En C esto no lleva a error ya que durante la ejecucin de cada funcin, los nombres de las variables iguales se solapan : se consideran las variables declaradas en la funcin en ejecucin. En el ejemplo 2, desde la funcin main no se puede hacer uso de las variables i y j ya que son locales a cada una de las funciones implementadas.

Variables globales
Las variables globales son variables declaradas antes de la funcin main. Es variables son tas accesibles desde todas las funciones del programa (incluida la funcin main). Estas variables pueden ser ledas y modificadas por todas las funciones del programa (alcance). Son creadas al ser declaradas y se destruyen al terminar la ejecucin del programa (tiempo de vida). Aunque parezce ms simple la utilizacin de este tipo de variables, su utilizacin no es recomendada ya que pueden llevar a errores de programacin: Al ser accesibles desde cualquier funcin, se pueden modificar y alterar desde cualquier punto del programa, es necesario ser muy prolijos enl a programacin para no alterar errneamente sus valores: una funcin puede asignar un valor especfico a una variable global. Posteriormente, en otra funcin, y por olvido, se pued hacer en cambios en la misma variable. Estos cambios dificultarn la localizacin de errores. Como su tiempo de vida es toda la ejecucin del programa, se est alocando memoria para estas variables cuando tal vez se utilicen en determinados puntos del programa.

Por estas razones se recomienda evitar la utilizacin de variables globales. Devolucin de resultados Cuando una funcin finaliza su ejecucin, devuelve el control de la ejecucin a la parte del programa desde donde se hizo la llamada. Para concluir la ejecucin de una funcin se utiliza la sentencia return, que fuerza la salida de la funcin en el punto donde se ha especificado dicha sentencia. Si no existe ninguna sentencia return, la funcin termina con la llave que cierra el cuerpo. Si la funcin no es de tipo void, la sentencia return, adems de especificar la terminacin de la funcin, puede especificar la devolucin de un valor para que pueda ser utilizado en el punto donde se hizo la llamada. El valor devuelto, y por ende el tipo de la funcin, puede ser cualquiera de los tipos bsicos (primitivos), estructurados o definidos por el programador (los veremos prximamente), excepto arreglos. Cuando se desea que una funcin devuelva tipos

de datos complejos o ms de un valor, se utiliza el paso de parmetros por referencia que veremos ms adelante.

Paso de Parmetros Los parmetros (o argumentos) son datos comunicados entre funciones: entre la funcin invocadora y la funcin invocada. Los parmetros que aparecen en el encabezamiento de una funcin se llaman parmetros formales y los parmetros que aparecen en la invocacin son llamados parmetros reales. Existen 2 formas de paso de parmetros: por valor y por referencia.

Parmetros pasados por valor


Al entrar a la funcin, se realiza una copia local del valor de los parmetros reales. Por esto, las modificiaciones hechas a los parmetros formales son locales y no afectan a los parmetros reales. Ejemplo:
#include <stdio.h> void siguiente ( int x ) { x = x + 1; printf( "Dentro x = %d \ n", x ); }
n g

void main() { int x = 5; printf( "Antes x = %d n", x ); siguiente( x ); printf( "Despues x = %d \n", x );
n

Entonces, la salida de la ejecucin de este programa es:


Antes x = 5 Dentro x = 6 Despues x = 5

Se puede ver que las modificaciones hechas al parmetro formal no es vista desde afuera de la funcin. Los parmetros formales pasados por valor actan como variables locales de la funcin: se crean (copindose el valor del parmetro real) y cuando finaliza la ejecucin de la funcin se destruye dicha variable.

Paso de parmetros por referencia


Muchas veces es necesario que las modificaciones hechas a los parmetros formales sean permanentes fuera de la funcin. Adems, podemos necesitar que una funcin retorne ms de un valor (de esta forma no es suficiente con la instruccin return ). En este caso es necesaria la utilizacin de parmetros por referencia: los parmetros reales

son una referencia (puntero) a las variables de la parte del programa que realiza la llamada y no las variables en s. La referencia se copia en los parmetros formales, de forma que dentro de la funcin puede usarse dicha referencia para modificar una variable que, de otra forma, no sera accesible desde el interior de la funcin (modificar el valor referenciado). En C se deben utilizar operadores de punteros para implementar el paso de parmetros por referencia: & (direccin) y * (puntero). El operador & antes de una variable permite obtener la direccin de dicha variable. Se usa en los parmetros reales en la invocacin de la funcin para pasarle por referencia dicha variable. El operador * se utiliza tanto en la declaracin de los parmetros formales (en el encabezamiento de una funcin) como en el cuerpo de la misma. En el encabezamiento indica que la variable ser pasada por referencia (ser un puntero) y en el cuerpo se utiliza para acceder al valor de la variable externa de la funcin (referenciada por el parmetro formal). Veamos un ejemplo: funcin swap (intercambio): se intercambian los valores de dos variables.
#include <stdio.h> void swap(int *x, int *y) { int aux; aux = *x; *x = *y; *y = aux; }
g

Parmetros formales pasados por referencia (operador*)

Uso de * para referenciar el valor del parmetro real

void main() { Parmetros reales pasados int a, b; por referencia (operador &) scanf( "%d %d", &a, &b ); swap( &a, &b ); printf( "Los nuevos valores son a=%d y b=%d \n", a, b ); }

Vectores o matrices como parmetros


Una variable de tipo arreglo (en nuestro caso, vector o matriz) es en s un puntero al primer elemento del arreglo (el elemento en la posicin 0). Para pasar arreglos enteros (vectores o matrices enteras) como parmetros a una funcin, en C se puede hacer slo por referencia. NO se usan los operadores & y *, en su lugar se utiliza directamente el nombre de la variable. Esto se debe a lo anteriormente dicho: una variable de tipo arreglo es un puntero al primer elemento de dicho arreglo. El parmetro formal de una funcin debe ser un puntero tambin para obtener la direccin del comienzo del arreglo. Cuando se pasa un arreglo a una funcin, se pasa realmente slo la direccin de la celda de memoria donde comienza el arreglo. Este valor se representa por el nombre del arreglo. La funcin puede cambiar entonces el contenido del arreglo accediendo directamente a las celdas de memoria en donde se almacenan los elementos del arreglo (mediante el uso de [ y ]). As,

aunque el nombre del arreglo se pasa por valor, sus elementos se pueden cambiar como si se hubieran pasado por referencia. Ejemplo: se pide leer del teclado 20 nmero enteros. Luego se pide un nmero y se pide informar cuntas veces apareci ese nmero en el vector.
#include <stdio.h> #define N 20 int inicializar(int v[]) { int i; for (i=0; i< N; i++) { scanf("%d", &v[i]); } return(0); }

int ocurrencias(int v[], int n) { int i, cant=0; for (i=0; i<N; i++) { if (v[i] == n) cant+; } return(cant); } int main() { int v[N]; int x; inicializar(v); printf("Ingrese el nro que quiere buscar \n"); scanf("%d", &x); printf("Las ocurrencias son: %d \n ", ocurrencias(v,x)); return(0); }

La cabecera de la funcin ocurrencias (o inicializar ) se podran haber escrito de las siguientes formas:
int ocurrencias(int *v , int dimension, int n) int ocurrencias(int v[N], int n) // donde N DEBE ser constante

En el primer caso, usando la opcin *v es posible utilizar la misma funcin para vectores de distinto tamao. Claro que es necesario entonces pasar como parmetro la dimensin real del vector (int dimension en el caso anterior):
#include <stdio.h> #define N 5 #define M 7 int inicializar(int *v, int X) { int i; for (i=0; i< X; i++) { scanf("%d", &v[i]); } return(0); }

int ocurrencias(int *v, int B, int n) { int i, cant=0; for (i=0; i<B; i++) { cant += (v[i] == n) ? 1:0; } return(cant); } int main() { int v1[N], v2[M] ; int x; inicializar(v1, N); inicializar(v2, M); printf("Ingrese el nro que quiere buscar \n"); scanf("%d", &x); printf("Las ocurrencias son: %d \n ", ocurrencias(v1,N,x)); printf("Las ocurrencias son: %d \n ", ocurrencias(v2,M,x)); return(0); }

Por otro lado, en el caso de matrices, es posible utilizar:


void nombre_funcion(int matriz[][N]) void nombre_funcion(int matriz[N][N])
Es necesario especificar el tamao de cada fila de la matriz en los encabezamientos de las funciones.

You might also like