Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Quando você inicializa tipos escalares, o valor do assignment-expression é atribuído à variável. Aplicam-se as regras de conversão para a atribuição. (Consulte Conversões de tipo para obter informações sobre regras de conversão.)
Sintaxe
declaration:
declaration-specifiers
init-declarator-list
optar por;
declaration-specifiers:
storage-class-specifier
declaration-specifiers
optar por
type-specifier
declaration-specifiers
optar por
type-qualifier
declaration-specifiers
optar por
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:
As variáveis declaradas no nível do escopo do arquivo podem ser inicializadas. Se você não inicializar explicitamente uma variável no nível externo, ela será inicializada como 0 por padrão.
Uma expressão constante pode ser usada para inicializar qualquer variável global declarada com o
staticstorage-class-specifier. As variáveis declaradas são inicializadas quando astaticexecução do programa começa. Se você não inicializar explicitamente uma variável globalstatic, ela será inicializada como 0 por padrão, e cada membro que tiver um tipo de ponteiro receberá um ponteiro nulo.As variáveis declaradas com o especificador de classe de armazenamento ou
autosão inicializadas cada vez que oregistercontrole de execução passa para o bloco no qual são declaradas. Se você omitir um inicializador da declaração de umaautoouregistervariável, o valor inicial da variável será indefinido. Para valores automáticos e de registro, o inicializador não se restringe a ser uma constante; Pode ser qualquer expressão que envolva valores previamente definidos, até mesmo chamadas de função.Os valores iniciais para declarações de variáveis externas e para todas as
staticvariáveis, sejam elas externas ou internas, devem ser expressões constantes. Para obter mais informações, consulte Expressões constantes. Como o endereço de qualquer variável estática ou declarada externamente é constante, ela pode ser usada para inicializar uma variável de ponteiro declaradastaticinternamente. No entanto, o endereço de umaautovariável não pode ser usado como um inicializador estático porque pode ser diferente para cada execução do bloco. Você pode usar valores constantes ou variáveis para inicializarautoeregistervariáveis.Se a declaração de um identificador tiver escopo de bloco e o identificador tiver vinculação externa, a declaração não poderá ter uma inicialização.
Exemplos
Os exemplos a seguir ilustram as inicializações:
int x = 10;
A variável x inteira é inicializada para a expressão 10constante .
register int *px = 0;
O ponteiro px é inicializado como 0, produzindo um ponteiro "nulo".
const int c = (3 * 1024);
Este exemplo usa uma expressão (3 * 1024) constante para inicializar c para um valor constante que não pode ser modificado devido à palavra-chave const .
int *b = &x;
Esta 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 chamada z. No entanto, como é especificado para ser um const, a variável a só pode ser inicializada, nunca modificada. Aponta sempre 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 a nível externo, pelo que tem um tempo de vida global. A variável LOCAL local tem auto classe de armazenamento e só tem um endereço durante a execução da função na qual é declarada. Portanto, tentar inicializar a static variável lp de ponteiro com o endereço de LOCAL não é permitido. A static variável gp de ponteiro pode ser inicializada para o endereço de GLOBAL porque esse endereço é sempre o mesmo. Da mesma forma, *rp pode ser inicializado porque rp é uma variável local e pode ter um inicializador não constante. Cada vez que o bloco é inserido, LOCAL tem um novo endereço, que é então atribuído a rp.