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-list
opt ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
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 comostatic
são inicializadas quando a execução do programa começa. Se você não inicializar uma variávelstatic
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
ouregister
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ávelauto
ouregister
, 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 ponteirostatic
declarada internamente. No entanto, o endereço de uma variávelauto
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áveisauto
eregister
.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 static
gp
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
.