Lenguaje 'C'

De Documentacion NexuN

Ámbito de las 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 una función y valen solo allí. Solamente tienen visibilidad dentro
de esa función y su valor se pierde al finalizar ésta. Estas variables se crean en memoria
al entrar a ejecutarse la función, y desaparecen al finalizar; esto hace que de llamada en
llamada de una misma función, las variables puedan ocupar distintas posiciones en la memoria,
y por lo tanto no conservan su valor.
Si en el programa que llama a una función, existen variables con el mismo nombre que otras
definidas en la función, no se interfieren entre sí.

Ejemplo:

#include <stdio.h>
void fun();
void  main(){
	 int var=10;
 	 printf("\nvar en main = %d\n",var);
 	 fun();
 	 printf("\nvar en main = %d\n",var);
}
         void fun(){
         int var=20;
         printf("\n      var en fun = %d\n",var);
         var+=10;
         printf("\n      var en fun = %d\n",var);
}

La salida del código anterior es:
	var  en  main  = 10
		var en fun =20
		var en fun =30
	var en main = 10

Variables globales
Son definidas fuera de las funciones, y ocupan una posición de memoria fija. 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.

• Si estas variables globales, se utilizan en varias funciones, ahora si se interfieren entre sí.

Ejemplo:

#include <stdio.h>
void fun();
void fun1();
int var=10;       //variable global
void  main()
{
 	 printf("\nvar en main = %d\n",var);
	 fun();
  	 printf("\nvar en main = %d\n",var);
 	 fun1();
	 printf("\nvar en main = %d\n",var);
}
void fun()
 {
	//la variable var se puede utilizar en esta función, pues al ser global la conocen
	//todas las funciones por debajo de su definición
	printf("\n      var en fun = %d\n",var);
 	var+=25;
	printf("\n      var en fun = %d\n",var);
}

/*Si dentro de la función se la vuelve a definir,  la usa como local en la función*/

void fun1()
 {
	 int var=20;   //esta variable var es local a esta función
 	 printf("\n      var en fun1 = %d\n",var);
	 var+=30;
	 printf("\n      var en fun1 = %d\n",var);
 }
La salida del código anterior es:
	var  en  main  = 10
		var en fun =10
		var en fun =35
	var en main = 35
		var en fun1 = 20
		var en fun1 = 50
	var  en  main  = 35
•	Si se desea que una variable sea global solo para un grupo de funciones,
	se definiría fuera de la primera función del grupo.

Ejemplo:
En el siguiente programa la variable var será  global para todo el programa y la
variable var1 sólo para las funciones fun() y fun1().

#include <stdio.h>
void fun();
void fun1();

int var=10;

void  main()
{
  printf("\nvar en main = %d\n",var);
  fun();
  printf("\nvar en main despues de fun = %d\n",var);
  fun1();
  printf("\nvar en main despues de fun1 = %d\n",var);
}

 int var1=55;

 void fun()
 {
  printf("\n      var en fun = %d\n",var);
  var+=25;
  var1+=5;
  printf("\n      var en fun = %d\n",var);
  printf("\n      var1 en fun = %d\n",var1);
  fun1();
  printf("\n      var1 en fun = %d\n",var1);

 }
 void fun1()
 {
  var+=30;
  var1+=15;
  printf("\n            var en fun1 = %d\n",var);
  printf("\n            var1 en fun1 = %d\n",var1);
 }
Variables estáticas
Son permanentes y privadas a la función que las declara. 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. 
Ejemplo:
void estatica();   // Prototipo de la función 
void main()
{
    int i;
    for (i=1; i<=5; ++i)
        estatica();
}
void estatica()
{
    auto int var1 = 0;     //variable local o automática
    static int var2 = 0; //variable estática

    printf("automatica = %d, estatica = %d \n", var1, var2);
    ++var1;
    ++var2;
}
La salida del código anterior es:
automatica = 0, estatica = 0
automatica = 0, estatica = 1
automatica = 0, estatica = 2
automatica = 0, estatica = 3
automatica = 0, estatica = 4
 Ir a Módulo programación en lenguajes estructurados (ple)