Ambito de Variables
Existe una clasificación de las variables, según dónde y cómo se declaren:
- Variables locales o automáticas: son las que se declaran en el interior de un bloque y valen solo allí. Solamente tienen visibilidad dentro de ese bloque y su valor se pierde al finalizar éste. Estas variables se crean al entrar a ejecutarse el bloque en el stack, y desaparecen al finalizar; esto hace que de llamada en llamada de una misma función puedan ocupar distintas posiciones en la memoria, y por lo tanto no conservan su valor.
- Variables externas o globales: Son definidas fuera de las funciones, y ocupan una posición de memoria fija. Para usarlas dentro de una función debo declararlas (explícita o implícitamente). Como externa (forma explícita) o por el contexto (forma implícita). La declaración es implícita si la declaración de la variable se encuentra antes en el archivo. Hay que tener en cuenta que estas variables pueden ser modificadas desde cualquier función, y por lo tanto aumenta la posibilidad de modificar inadvertidamente su valor.
- Variables estáticas: son permanentes y privadas a la función que las declara. Una variable estática global, es privada al archivo donde se la define. Una variable estática declarada dentro de una función, trabaja como una variable automática, con la diferencia que como ocupa un lugar permanente y fijo en la memoria, guarda su valor de llamada en llamada. Una función es normalmente externa, pero declarada estática es privada al archivo que la declara..
Las variables pueden declararse al comienzo de cualquier proposición compuesta, teniendo como visibilidad la duración de esa sentencia compuesta. De la misma manera, si una variable local posee el mismo nombre que una variable externa, u otra variable local pero de un "scope" más global, entonces la variable de visibilidad más profunda es la que se ve..
Ejemplos
ejem_ambito1.c
/* Uso de variable con distintos ámbitos */
#include <stdio.h>
void Func(void);
int VarX = 25; /* Variable global */
void main()
{
printf("Valor de VarX: %d\n", VarX);
Func();
printf("Valor de VarX: %d\n", VarX);
{
int VarX = 32; /* Local al bloque, oculta la global */
printf("Valor de VarX: %d\n", VarX);
}
printf("Valor de VarX: %d\n", VarX);
}
void Func()
{
int VarX = 40; /* Local a la función, oculta la global*/
printf("Valor de VarX: %d\n", VarX);
}
ejem_ambito2.c
/* Uso de variable con distintos ámbitos */
#include <stdio.h>
void Func1(void);
void Func2(void);
void main()
{
int Contador;
for(Contador = 0; Contador < 10; Contador++)
printf("Valor retornado por Func1: %d\n", Func1());
for(Contador = 0; Contador < 10; Contador++)
printf("Valor retornado por Func2: %d\n", Func2());
}
void Func1()
{
int VarX = 40; /* Variable local */
VarX++;
return VarX;
}
void Func2()
{
static int VarX = 40; /* Variable estática */
VarX++;
return VarX;
}