Classes de armazenamento em C: Auto, Extern, Static, Register (exemplos)
O que é classe de armazenamento em C?
Uma classe de armazenamento representa a visibilidade e a localização de uma variável. Diz a partir de qual parte do código podemos acessar uma variável. Uma classe de armazenamento em C é usada para descrever o seguinte:
- O escopo da variável.
- O local onde a variável será armazenada.
- O valor inicializado de uma variável.
- Um tempo de vida de uma variável.
- Quem pode acessar uma variável?
Assim, uma classe de armazenamento é usada para representar as informações sobre uma variável.
OBSERVAÇÃO: Uma variável não está associada apenas a um tipo de dados, seu valor, mas também uma classe de armazenamento.
Quais são os tipos de classes de armazenamento em C?
Existem quatro tipos de classes de armazenamento padrão. A tabela abaixo representa as classes de armazenamento em C.
| Classe de armazenamento | Propósito |
|---|---|
| auto | É uma classe de armazenamento padrão. |
| externo | É uma variável global. |
| estático | É uma variável local capaz de retornar um valor mesmo quando o controle é transferido para a chamada da função. |
| cadastre-se | É uma variável armazenada dentro de um registrador. |
Classe de armazenamento automático em C
As variáveis definidas usando a classe de armazenamento automático são chamadas de variáveis locais. Auto significa classe de armazenamento automático. Uma variável está na classe de armazenamento automático por padrão se não for especificada explicitamente.
O escopo de uma variável automática é limitado apenas ao bloco específico. Assim que o controle sai do bloco, o acesso é destruído. Isso significa que apenas o bloco no qual a variável auto é declarada pode acessá-la.
Uma palavra-chave auto é usada para definir uma classe de armazenamento automático. Por padrão, uma variável automática contém um valor lixo.
Example, auto int age;
O programa abaixo define uma função que possui duas variáveis locais
int add(void) {
int a=13;
auto int b=48;
return a+b;}
Pegamos outro programa que mostra o nível de escopo “nível de visibilidade” para variáveis automáticas em cada código de bloco que são independentes entre si:
#include <stdio.h>
int main( )
{
auto int j = 1;
{
auto int j= 2;
{
auto int j = 3;
printf ( " %d ", j);
}
printf ( "\t %d ",j);
}
printf( "%d\n", j);}
SAÍDA:
3 2 1
Classe de armazenamento externo em C
Extern significa classe de armazenamento externo. A classe de armazenamento externo é usada quando temos funções ou variáveis globais que são compartilhadas entre dois ou mais arquivos.
Palavra-chave externo é usado para declarar uma variável ou função global em outro arquivo para fornecer a referência de variável ou função que já foi definida no arquivo original.
As variáveis definidas usando uma palavra-chave externa são chamadas de variáveis globais. Essas variáveis estão acessíveis em todo o programa. Observe que a variável extern não pode ser inicializada, pois já foi definida no arquivo original.
Example, extern void display();
Primeiro arquivo: main.c
#include <stdio.h>
extern i;
main() {
printf("value of the external integer is = %d\n", i);
return 0;}
Segundo arquivo: original.c
#include <stdio.h> i=48;
Resultado:
value of the external integer is = 48
Para compilar e executar o código acima, siga as etapas abaixo
Passo 1) Criar novo projeto,
- Selecione o aplicativo do console
- Clique em Ir
Passo 2) Selecione C e clique em Avançar
Passo 3) Clique em Avançar
Passo 4) Insira os detalhes e clique em Avançar
Passo 5) Clique em Concluir
Passo 6) Coloque o código principal conforme mostrado no programa anterior no arquivo main.c e salve-o
Passo 7) Crie um novo arquivo C [Arquivo -> novo -> Arquivo Vazio, salve (como original.c) e adicione-o ao projeto atual clicando em “OK” na caixa de diálogo.
Passo 8) Coloque e salve o código C do arquivo original.c mostrado no exemplo anterior sem a função main().
Passo 9) Crie e execute seu projeto. O resultado é mostrado na próxima figura
Classe de armazenamento estático em C
As variáveis estáticas são usadas na função/arquivo como variáveis estáticas locais. Eles também podem ser usados como variável global
- Variável local estática é uma variável local que retém e armazena seu valor entre chamadas de função ou bloco e permanece visível apenas para a função ou bloco no qual está definida.
- Variáveis globais estáticas são variáveis globais visíveis apenas para o arquivo em que é declarado.
Example: static int count = 10;
Tenha em mente que a variável estática tem um valor inicial padrão zero e é inicializada apenas uma vez em seu tempo de vida.
#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
while(counter<10) {
next();
counter++; }
return 0;}
void next( void ) { /* function definition */
static int iteration = 13; /* local static variable */
iteration ++;
printf("iteration=%d and counter= %d\n", iteration, counter);}
Resultado:
iteration=14 and counter= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
As variáveis globais são acessíveis em todo o arquivo, enquanto as variáveis estáticas são acessíveis apenas para uma parte específica de um código.
A vida útil de uma variável estática está em todo o código do programa. Uma variável que é declarada ou inicializada usando a palavra-chave estática sempre contém zero como valor padrão.
Registrar classe de armazenamento em C
Você pode usar a classe de armazenamento de registradores quando quiser armazenar variáveis locais dentro de funções ou blocos em registradores de CPU, em vez de RAM para ter acesso rápido a essas variáveis. Por exemplo, “contadores” são bons candidatos para serem armazenados no registro.
Example: register int age;
A palavra-chave cadastre-se é usado para declarar uma classe de armazenamento de registro. As variáveis declaradas usando a classe de armazenamento de registro têm vida útil durante todo o programa.
É semelhante à classe de armazenamento automático. A variável é limitada ao bloco específico. A única diferença é que as variáveis declaradas usando a classe de armazenamento de registros são armazenadas dentro dos registros da CPU em vez de na memória. O registro tem acesso mais rápido que o da memória principal.
As variáveis declaradas usando a classe de armazenamento de registro não possuem valor padrão. Estas variáveis são frequentemente declaradas no início de um programa.
#include <stdio.h> /* function declaration */
main() {
{register int weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}
SAÍDA:
error: address of register variable 'weight' requested
A próxima tabela resume os principais recursos de cada classe de armazenamento que são comumente usados na programação C
| Classe de armazenamento | Declaração | Armazenamento | Valor inicial padrão | Objetivo | Lifetime |
|---|---|---|---|---|---|
| auto | Dentro de uma função/bloco | Memória | Imprevisível | Dentro da função/bloco | Dentro da função/bloco |
| cadastre-se | Dentro de uma função/bloco | Registros de CPU | Garbage | Dentro da função/bloco | Dentro da função/bloco |
| externo | Fora de todas as funções | Memória | zero | Todo o arquivo e outros arquivos onde a variável é declarada como externa | tempo de execução do programa |
| Estático (local) | Dentro de uma função/bloco | Memória | zero | Dentro da função/bloco | tempo de execução do programa |
| Estático (global) | Fora de todas as funções | Memória | zero | Cobertura | tempo de execução do programa |
Resumo
Neste tutorial discutimos classes de armazenamento em C, para resumir:
- Uma classe de armazenamento em C é usada para representar informações adicionais sobre uma variável.
- A classe de armazenamento representa o escopo e a vida útil de uma variável.
- Também informa quem pode acessar uma variável e de onde?
- Auto, extern, Register, static são as quatro classes de armazenamento diferentes em um programa C.
- Um especificador de classe de armazenamento em Linguagem C é usado para definir variáveis, funções e parâmetros.
- auto é usado para uma variável local definida dentro de um bloco ou função
- registrador é usado para armazenar a variável nos registros da CPU, em vez do local da memória para acesso rápido.
- Static é usado para variáveis globais e locais. Cada um tem seu caso de uso dentro de um programa C.
- Extern é usado para compartilhamento de dados entre arquivos de projeto C.








