Tipos globales que se inicializan
Un tipo de “agregado” es una estructura, unión, o un tipo de matriz.Si un tipo global contiene miembros de tipos globales, las reglas de inicialización se aplican de forma recursiva.
Sintaxis
inicializador:
inicialización de agregado de**}** /* Forde la inicializador-lista de**{** *inicializador-lista ,}de**{**
inicializador-lista:
inicializadorinicializador de**,** de la inicializador-lista
La inicializador-lista es una lista de inicializadores separados por comas.Cada inicializador de la lista es una expresión constante o una lista de inicializadores.Por consiguiente, las listas de inicializadores pueden anidarse.Este formulario es útil para los miembros globales que se inicializan de un tipo global, como se muestra en los ejemplos de esta sección.Sin embargo, si el inicializador de un identificador automático es una única expresión, no necesita ser una expresión constante; solo necesita tener tipo apropiado para la asignación al identificador.
Para cada lista de inicializadores, los valores de las expresiones constantes están asignados, en orden, a los miembros correspondientes de la variable global.
Si la inicializador-lista tiene menos valores que un tipo global, los miembros o los elementos restantes de tipo global se inicializan en 0.el valor inicial de un identificador automático no explícitamente inicializado es indefinido.Si la inicializador-lista tiene varios valores que un tipo global, se producirá un error.Estas reglas se aplican a cada lista incrustada de inicializadores, así como al agregado en conjunto.
El inicializador de una estructura es una expresión del mismo tipo, o una lista de inicializadores para sus miembros agregados en entre llaves ().Los miembros sin nombre de campo de bits no se inicializan.
Cuando se inicializa una combinación, la inicializador-lista debe ser una expresión constante.El valor de la expresión constante se asigna al primer miembro de unión.
Si tiene una matriz tamaño desconocido, el número de inicializadores determina el tamaño de la matriz, y su tipo se completa.No hay ninguna forma de especificar la repetición de un inicializador en C, o de inicializar un elemento en medio de una matriz sin proporcionar todos los valores anteriores también.Si necesita esta operación en el programa, escriba la rutina en lenguaje de ensamblado.
Observe que el número de inicializadores puede establecer el tamaño de la matriz:
int x[ ] = { 0, 1, 2 }
Si se especifican el tamaño y proporciona el número incorrecto de inicializadores, sin embargo, el compilador genera un error.
Específicos de Microsoft
El tamaño máximo de una matriz está definido por size_t.definido en el archivo de encabezado STDDEF.H, size_t es unsigned int con el intervalo 0x00000000 a 0x7CFFFFFF.
Específico de Microsoft de FINAL
Ejemplos
Este ejemplo muestra los inicializadores para una matriz.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Esta instrucción declara P como a cuatro-por-tres la matriz e inicializa los elementos de la primera fila en 1, los elementos de la segunda fila a 2, etc. a través de la cuarta fila.Observe que la lista de inicializadores para la tercera y la cuarta filas contiene coma después de la expresión constante pasada.La lista del inicializador ({4, 4, 4,},) también va seguida por una coma.se permiten pero no se requieren estas comas adicionales; sólo comas que separan las expresiones constantes a partir de otras, y las que el un inicializador independiente enumerado de otro, se requiere.
Si un miembro global no tiene ninguna lista incrustada de inicializadores, los valores se asignan simplemente, en orden, a cada miembro del subagregado.Por consiguiente, la inicialización del ejemplo anterior es equivalente a la siguiente:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Las llaves también pueden aparecer alrededor de inicializadores individuales en la lista y ayudarían a clarificar el ejemplo anterior.
Cuando se inicializa una variable global, debe tener cuidado de utilizar llaves y las listas de inicializadores correctamente.El ejemplo siguiente se muestra la interpretación del compilador de llaves con más detalle:
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 */
};
En este ejemplo, se declara nlist como 2 by-3 una matriz de estructuras, cada estructura que tiene tres miembros.La fila 1 de inicialización asigna valores a la primera fila de nlist, como sigue:
La primera llave de apertura en señales de la fila 1 el compilador que se está iniciando la inicialización del primer miembro global de nlist (es decir, nlist[0]).
La segunda llave de apertura indica que se está iniciando la inicialización del primer miembro global de nlist[0] (es decir, la estructura en nlist[0][0]).
La primera llave finaliza la inicialización de la estructura nlist[0][0]; la llave de apertura siguiente inicia la inicialización de nlist[0][1].
El proceso continúa hasta el final de la línea, donde la llave de cierre finaliza la inicialización de nlist[0].
la fila 2 asigna valores a la segunda fila de nlist de una manera similar.Observe que requieren conjuntos externos de llaves que agregan los inicializadores en las filas 1 y 2.La construcción siguiente, que omite las llaves externas, provocaría un error:
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 */
};
En esta construcción, la primera llave de apertura en la línea 1 inicia la inicialización de nlist[0], que es una matriz de tres estructuras.Los valores 1, 2 y 3, se asignan a los tres miembros de la primera estructura.Cuando se encuentra la llave siguiente (después del valor 3), la inicialización de nlist[0] se completa, y las dos estructuras restantes de la matriz de la tres-estructura se inicializan automáticamente en 0.De igual forma, { 4,5,6 } inicializa la primera estructura en la segunda fila de nlist.Restantes las dos estructuras de nlist[1] se establecen en 0.Cuando el compilador encuentra la siguiente lista de inicializadores ({ 7,8,9 }), intenta inicializar nlist[2].Puesto que nlist solo tiene dos filas, este intento un error.
En este ejemplo siguiente, los tres miembros de int de x se inicializan en 1, 2, y 3, respectivamente.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
En la estructura de list anterior, los tres elementos en la primera fila de m se inicializan en 4,0; los elementos de la fila restante de m se inicializan con 0,0 de forma predeterminada.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
Inicializa la unión yvariable, en este ejemplo.El primer elemento join es una matriz, por lo que el inicializador es un inicializador global.El inicializador muestra valores de las asignaciones de {'1'} a la primera fila de la matriz.Como sólo un valor aparece en la lista, el elemento de la primera columna inicializa el carácter 1, y restantes los dos elementos de la fila se inicializan con el valor 0 de forma predeterminada.De igual forma, el primer elemento de la segunda fila de x inicializa el carácter 4, y restantes los dos elementos de la fila se inicializan con el valor 0.