Visibilidade Escopo e Tempo de Vida de Variáveis

Existem dois tipos básicos de escopo: escopo local e escopo global.

Uma variável declarada fora de todas as funções está localizada no escopo global. O acesso a tais variáveis pode ser feito de qualquer lugar no programa. Estas variáveis são localizadas no conjunto (pool) global de memória, assim seus tempos de vida coincidem com o tempo de vida do programa.

Uma variável declarada dentro de um bloco (parte do código entre chaves) pertence ao escopo local. Tal variável não é visível (e portanto não é disponível) fora do bloco no qual está definida. O caso mais comum de declaração local é uma variável declarada dentro de uma função. Uma variável declarada localmente está localizada na pilha (stack), e o tempo de vida de tal variável é igual ao tempo de vida da função.

Já que o escopo de uma variável local é o bloco em que ela está declarada, é possível declarar variáveis com o mesmo nome que variáveis declaradas em outros blocos, mesmo aquelas declaradas em níveis mais acima, até o nível global.

Exemplo:

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- define valor vazio para primeiras barras limite
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calcula primeiro valor visível
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }

Preste atenção na variável i, declarada na linha

      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }

Seu escopo é somente o ciclo do for; fora deste ciclo existe uma outra variável com o mesmo nome, declarada no começo da função. Além disso, a variável k está declarada no corpo do loop, seu escopo é o corpo do loop.

Variáveis locais podem ser declarados com o especificador de acesso static. Neste caso, o compilador tem uma variável no conjunto (pool) global de memória. Portanto, o tempo de vida de uma variável estática é igual ao tempo de vida do programa. Aqui o escopo de tal variável é limitado ao bloco no qual ela está declarada.

Também Veja

Data Types, Encapsulation and Extensibility of Types,Initialization of Variables, Creating and Deleting Objects