方括号在C中的数组初始化中意味着什么?

时间:2012-03-24 06:44:01

标签: c arrays

static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

这里[0x3A]的含义是什么?我只学过像int a[2] = {1, 2};

这样的陈述

4 个答案:

答案 0 :(得分:79)

这意味着初始化数组的 n -th元素。您提供的示例意味着:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

这些被称为"designated initializers",实际上是C99标准的一部分。但是,没有=的语法不是。从该页面:

  

自GCC 2.5以来已经过时但GCC仍然接受的替代语法是在元素值之前写[index],没有=

答案 1 :(得分:40)

根据GCC docs,这符合ISO C99标准。他们将其称为“指定的初始化器”:

  

要指定数组索引,请在元素值之前写入`[index] ='。   例如,

 int a[6] = { [4] = 29, [2] = 15 };
     

相当于

 int a[6] = { 0, 0, 15, 0, 29, 0 };

我之前从未见过这种语法,但我只是用gcc 4.4.5和-Wall编译它。它成功编译并没有发出任何警告。

从该示例中可以看出,它允许您初始化特定的数组元素,而保持其他元素不受影响。

答案 2 :(得分:15)

这是在C99中引入的,它被称为designated initialiser

它基本上允许您在数组中设置特定值,其余部分为默认值。

在这种特殊情况下,数组索引是键盘扫描码。对于0x3a密钥,CapsLockscan code in set #1(请参阅第10.6节),0x45NumLock而0x46是ScrollLock

在上面的第一个链接上,它声明:

int a[6] = { [4] = 29, [2] = 15 };

相当于:

int a[6] = { 0, 0, 15, 0, 29, 0 };

有趣的是,尽管链接指出=是必要的,但这似乎并非如此。

答案 3 :(得分:13)

它是(接近)designated initializers的语法,是C99特征。

基本上,它初始化数组的一部分,例如;

int aa[4] = { [2] = 3, [1] = 6 };

将数组的第二个值初始化为6,将第三个值初始化为3。

在你的情况下,数组偏移恰好是十六进制(0x3a),它将数组的第58个元素初始化为CAPSLOCK的值,这可能是在你正在显示的代码上方的代码中定义的。

代码中没有=的版本似乎是gcc特定的扩展名。