Partilhar via


Inicializando tipos escalares

Quando você inicializa tipos escalares, o valor de assignment-expression é atribuído à variável. As regras de conversão para a atribuição se aplicam. (Consulte Conversões de tipos para obter informações sobre regras de conversão.)

Sintaxe

declaration:
declaration-specifiers init-declarator-listopt ;

declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer /* Para inicialização escalar */

initializer:
assignment-expression

Você pode inicializar variáveis de qualquer tipo, desde que obedeça às seguintes regras:

  • Variáveis declaradas no nível de escopo de arquivo podem ser inicializadas. Se você não inicializar uma variável explicitamente no nível externo, ela será inicializada como 0 por padrão.

  • Uma expressão de constante pode ser usada para inicializar qualquer variável global declarada com o static storage-class-specifier. Variáveis declaradas como static são inicializadas quando a execução do programa começa. Se você não inicializar uma variável static global explicitamente, ela será inicializada como 0 por padrão e cada membro que tiver o tipo ponteiro receberá um ponteiro nulo.

  • As variáveis declaradas com o especificador de classe de armazenamento auto ou register são inicializadas sempre que o controle de execução passa para o bloco em que elas estão declaradas. Se você omitir um inicializador da declaração de uma variável auto ou register, o valor inicial da variável será indefinido. Para valores automáticos e de registro, o inicializador não está restrito a ser uma constante, ele pode ser qualquer expressão que envolva valores já definidos, até mesmo chamadas de função.

  • Os valores iniciais de declarações de variáveis externas e de todas as variáveis static, sejam externas ou internas, devem ser expressões de constantes. (Para mais informações, consulte Expressões de constante). Como o endereço de qualquer variável estática ou declarada externamente é constante, ele pode ser usado para inicializar uma variável de ponteiro static declarada internamente. No entanto, o endereço de uma variável auto não pode ser usado como um inicializador estático porque pode ser diferente para cada execução do bloco. Você pode usar valores de constantes ou de variáveis para inicializar as variáveis auto e register.

  • Se a declaração de um identificador tiver o escopo de bloco e o identificador tiver uma vinculação externa, a declaração não poderá ter uma inicialização.

Exemplos

Os exemplos a seguir ilustram inicializações:

int x = 10;

A variável de inteiro x é inicializada como a expressão de constante 10.

register int *px = 0;

O ponteiro px é inicializado como 0, gerando um ponteiro "nulo".

const int c = (3 * 1024);

Este exemplo usa uma expressão constante (3 * 1024) para inicializar c em um valor constante que não pode ser modificado devido à palavra-chave const.

int *b = &x;

Essa instrução inicializa o ponteiro b com o endereço de outra variável, x.

int *const a = &z;

O ponteiro a é inicializado com o endereço de uma variável nomeada z. No entanto, como é especificada como const, a variável a só pode ser inicializada, nunca modificada. Ela sempre aponta para o mesmo local.

int GLOBAL ;

int function( void )
{
    int LOCAL ;
    static int *lp = &LOCAL;   /* Illegal initialization */
    static int *gp = &GLOBAL;  /* Legal initialization   */
    register int *rp = &LOCAL; /* Legal initialization   */
}

A variável global GLOBAL é declarada no nível externo e, por isso, tem tempo de vida global. A variável local LOCAL tem a classe de armazenamento auto e tem apenas um endereço durante a execução da função em que está declarada. Portanto, não é permitida a tentativa de inicializar a variável lp de ponteiro static com o endereço LOCAL. A variável de ponteiro staticgp pode ser inicializada no endereço de GLOBAL porque esse endereço é sempre o mesmo. Da mesma maneira, *rp pode ser inicializada porque rp é uma variável local e pode ter um inicializador não constante. Cada vez que se entra no bloco, LOCAL tem um novo endereço, que é então atribuído a rp.

Confira também

Inicialização