Inicializando tipos agregados
Um tipo de "agregar" é uma estrutura, união ou tipo de matriz.Se um tipo de agregação contém membros de tipos de agregados, as regras de inicialização aplicadas recursivamente.
Sintaxe
inicializador de:
{ lista do inicializador } / * para a inicialização do agregado * /{ initializer-list , }
lista do inicializador:
inicializadorlista do inicializador , inicializador
O lista do inicializador é uma lista de inicializadores separados por vírgulas.Cada inicializador na lista é uma expressão de constante ou uma lista de inicializador.Portanto, o inicializador listas podem ser aninhadas.Este formulário é útil para inicializar agregados membros de um tipo de agregação, conforme mostrado nos exemplos nesta seção.No entanto, se o inicializador de um identificador automático for uma única expressão, ele não precisa ser uma expressão de constante; ele meramente precisa ter o tipo apropriado de atribuição para o identificador.
Para cada lista do inicializador, os valores das expressões constantes são atribuídos, em ordem, aos membros da variável agregada correspondentes.
Se lista do inicializador tem menos valores de um tipo de agregação, os membros restantes ou elementos do tipo agregado são inicializados como 0.O valor inicial de um identificador automático não inicializado explicitamente é indefinido.Se lista do inicializador tem mais valores que um tipo de agregação, ocorrerá um erro.Essas regras se aplicam para cada lista do inicializador incorporado, bem como à agregação como um todo.
Inicializador de uma estrutura é uma expressão do mesmo tipo, ou uma lista de inicializadores de seus membros delimitados por chaves ({}).Os membros sem nome de campo de bits não são inicializados.
Quando uma união é inicializada, lista do inicializador deve ser uma única expressão de constante.O valor da expressão constante é atribuído ao primeiro membro da união.
Se uma matriz tem desconhecido tamanho, o número de inicializadores determina o tamanho da matriz, e seu tipo torna-se completa.Não há nenhuma maneira para especificar a repetição de um inicializador em c ou inicializar um elemento no meio de uma matriz sem fornecer valores de todas as anteriores também.Se você precisar esta operação em seu programa, escreva a rotina em linguagem assembly.
Observe que o número de inicializadores pode definir o tamanho da matriz:
int x[ ] = { 0, 1, 2 }
Se você especifica o tamanho e o número errado de inicializadores, no entanto, o compilador gerará um erro.
Específicos do Microsoft
O tamanho máximo para uma matriz é definido por size_t.Definido no arquivo de cabeçalho STDDEF.H, size_t é um unsigned int com o intervalo 0x00000000 para 0x7CFFFFFF.
Específicos do Microsoft final
Exemplos
Este exemplo mostra os inicializadores de uma matriz.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Esta instrução declara P como uma matriz de quatro x-3 e inicializa os elementos de primeira linha para 1, os elementos da segunda linha para 2, e assim por diante até a quarta linha.Observe que a lista do inicializador para as terceira e quarta linhas contém vírgulas depois da última expressão constante.A última lista de inicializador ({4, 4, 4,},) também é seguido por uma vírgula.Essas vírgulas extras são permitidas, mas não forem necessárias. somente por vírgulas que separam as expressões constantes umas das outras e aqueles que separam uma lista de inicializador de outro, são necessárias.
Se um membro agregado não tiver nenhuma lista de inicializador incorporado, valores são simplesmente atribuídos, em ordem, a cada membro do subaggregate.Portanto, a inicialização no exemplo anterior é equivalente à seguinte:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Chaves também podem aparecer em torno de inicializadores individuais na lista e ajudam a esclarecer o exemplo acima.
Ao inicializar uma variável agregada, você deve ter cuidado ao usar chaves e lista de inicializador corretamente.O exemplo a seguir ilustra a interpretação do compilador de chaves mais detalhadamente:
typedef struct
{
int n1, n2, n3;
} triplet;
triplet nlist[2][3] =
{
{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, /* Row 1 */
{ { 10,11,12 }, { 13,14,15 }, { 16,17,18 } } /* Row 2 */
};
Neste exemplo, nlist é declarada como uma matriz de 2-por-3 de estruturas, cada estrutura tendo três membros.Linha 1 da inicialização atribui valores a primeira linha da nlist, da seguinte forma:
A primeira chave esquerda na linha 1 sinaliza ao compilador que a inicialização do primeiro membro agregado de nlist (ou seja, nlist[0]) é o início.
A segunda chave esquerda indica que a inicialização do primeiro membro agregado de nlist[0] (ou seja, a estrutura em nlist[0][0]) é o início.
A primeira chave direita termina a inicialização da estrutura nlist[0][0]; a próxima chave esquerda começa a inicialização de nlist[0][1].
O processo continua até o final da linha, onde a chave de fechamento direito termina a inicialização do nlist[0].
Linha 2 atribui valores a segunda linha da nlist de maneira semelhante.Observe que os conjuntos externos de chaves ao redor de inicializadores em linhas 1 e 2 são necessários.A seguinte construção, que omite as chaves externas, causaria um erro:
triplet nlist[2][3] = /* THIS CAUSES AN ERROR */
{
{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }, /* Line 1 */
{ 10,11,12 },{ 13,14,15 },{ 16,17,18 } /* Line 2 */
};
Desta construção, a primeira chave esquerda na linha 1 começa a inicialização do nlist[0], que é uma matriz de estruturas de três.Os valores 1, 2 e 3 são atribuídos aos três membros da estrutura primeiro.Quando a próxima chave direita é encontrada (após o valor 3), a inicialização do nlist[0] for concluída, e as duas estruturas restantes na matriz de estrutura de três são automaticamente inicializadas como 0.Da mesma forma, { 4,5,6 } inicializa a primeira estrutura na segunda linha de nlist.As estruturas de dois restantes do nlist[1] são definidos como 0.Quando o compilador encontra a lista de inicializador próxima ( { 7,8,9 } ), ele tentará inicializar nlist[2].Uma vez que nlist tem apenas duas linhas, essa tentativa causa um erro.
Neste próximo exemplo, os três int os membros do x são inicializados para 1, 2 e 3, respectivamente.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
No list estrutura acima, os três elementos na primeira linha de m são inicializados para 4.0; os elementos da linha restante da m são inicializadas como 0,0 por padrão.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
A variável de união y, neste exemplo, é inicializado.O primeiro elemento da união é uma matriz, então o inicializador é um inicializador agregado.A lista do inicializador {'1'} atribui valores a primeira linha da matriz.Uma vez que apenas um valor é exibido na lista, o elemento na primeira coluna é inicializado para o caractere 1, e os dois elementos restantes na linha são inicializados para o valor 0 por padrão.Da mesma forma, o primeiro elemento da segunda linha da x é inicializada com o caractere 4, e os dois elementos restantes na linha são inicializados para o valor 0.