O que os colchetes significam na inicialização do array em C?

85

Qual é o significado disso [0x3A]aqui? Eu só aprendi afirmações comoint a[2] = {1, 2};

Akirast
fonte
Provavelmente é uma extensão do compilador que permite inicializar entradas de array específicas (em determinados índices) sem preencher o resto.
Alexey Frunze

Respostas:

81

Significa inicializar o n elemento -ésimo da matriz. O exemplo que você deu significa que:

Eles são chamados de "inicializadores designados" e, na verdade, fazem parte do padrão C99. No entanto, a sintaxe sem o =não é. A partir dessa página:

Uma sintaxe alternativa para isso, que está obsoleta desde o GCC 2.5, mas o GCC ainda aceita, é escrever [index]antes do valor do elemento, sem =.

Huon
fonte
41

De acordo com os documentos do GCC, isso é compatível com ISO C99. Eles se referem a ele como "Inicializadores designados":

Para especificar um índice de array, escreva `[index] = 'antes do valor do elemento. Por exemplo,

é equivalente a

Nunca vi essa sintaxe antes, mas apenas a compilei com o gcc 4.4.5, com -Wall. Compilou com sucesso e não deu avisos.

Como você pode ver nesse exemplo, ele permite inicializar elementos específicos do array, deixando os outros intocados.

Jonathon Reinhart
fonte
15

Isso foi introduzido no C99 e é chamado de inicializador designado .

Basicamente, ele permite que você defina valores específicos em uma matriz com o resto deixado como padrão.

Nesse caso específico, os índices de matriz são os códigos de varredura do teclado. 0x3aé o código de varredura no conjunto # 1 (consulte a seção 10.6) para a CapsLockchave, 0x45é NumLocke 0x46 é ScrollLock.

No primeiro link acima, ele afirma que:

é equivalente a:

Curiosamente, embora o link indique que =é necessário, não parece ser o caso aqui.

paxdiablo
fonte
13

É (perto de) a sintaxe dos inicializadores designados , um recurso C99.

Basicamente, ele inicializa partes de um array, por exemplo;

Inicializa o segundo valor da matriz para 6 e o ​​terceiro para 3.

No seu caso, os deslocamentos do array estão em hexadecimal (0x3a), o que inicializa o 58º elemento do array com o valor CAPSLOCK, que presumivelmente está definido no código acima do código que você está mostrando.

A versão em seu código sem o =parece ser uma extensão específica do gcc.

Joachim Isaksson
fonte