Cosa significano le parentesi quadre nell'inizializzazione dell'array in C?


85

Qual è il significato di [0x3A]qui? Ho solo imparato affermazioni comeint a[2] = {1, 2};


Molto probabilmente è un'estensione del compilatore che ti consente di inizializzare voci di array specifiche (a determinati indici) senza riempire il resto.
Alexey Frunze

Risposte:


81

Significa inizializzare l' n -esimo elemento dell'array. L'esempio che hai fornito significherà che:

Questi sono chiamati "inizializzatori designati" e in realtà fanno parte dello standard C99. Tuttavia, la sintassi senza non lo =è. Da quella pagina:

Una sintassi alternativa per questo che è stata obsoleta da GCC 2.5 ma GCC accetta ancora è quella di scrivere [index]prima del valore dell'elemento, con no =.


41

Secondo i documenti di GCC questo è conforme a ISO C99. Lo chiamano "Designated Initialzers":

Per specificare un indice di matrice, scrivi "[index] =" prima del valore dell'elemento. Per esempio,

è equivalente a

Non ho mai visto questa sintassi prima, ma l'ho appena compilata con gcc 4.4.5, con -Wall. È stato compilato correttamente e non ha fornito avvisi.

Come puoi vedere da quell'esempio, ti consente di inizializzare specifici elementi dell'array, lasciando gli altri intatti.


15

È stato introdotto nel C99 e si chiama inizializzatore designato .

Fondamentalmente ti consente di impostare valori specifici in un array con il resto lasciato come predefinito.

In questo caso particolare, gli indici dell'array sono i codici di scansione della tastiera. 0x3aè il codice di scansione nel set # 1 (vedere la sezione 10.6) per la CapsLockchiave, 0x45è NumLocke 0x46 è ScrollLock.

Sul primo collegamento sopra, si afferma che:

è equivalente a:

È interessante notare che, sebbene il collegamento indichi che =è necessario, non sembra essere il caso qui.


13

È (vicino a) la sintassi degli inizializzatori designati , una funzionalità C99.

Fondamentalmente, inizializza parti di un array, per esempio;

Inizializza il secondo valore della matrice su 6 e il terzo su 3.

Nel tuo caso, gli offset dell'array sono in esadecimale (0x3a) che inizializza il 58 ° elemento dell'array al valore di CAPSLOCK che presumibilmente è definito nel codice sopra il codice che stai mostrando.

La versione nel codice senza =sembra essere un'estensione specifica di gcc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.