前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被普遍应用。 html
帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 程序员
指定初始化项目(Designated Initializers):指的是能够对数组中的某些元素或结构体变量中的某些成员以任意的顺序进行选择性的初始化。 数组
一、在数组中的应用 app
在数组的初始化列表中使用“[index]= value”这样的形式便可实现对指定(经过index指定)的某个元素进行初始化。 spa
举例,如清单1: .net
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[6] = { [3] = 29, 18, [0] = 12, 33}; //等价于int arr[6] = { [3] = 29, [4] = 18, [0] = 12, [1] = 33};
- //也就是等价于int arr[6] = {12, 33, 0, 29, 18, 0};
-
- for (i = 0; i < 6; i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子输出结果: 指针
- arr[0]: 12
- arr[1]: 33
- arr[2]: 0
- arr[3]: 29
- arr[4]: 18
- arr[5]: 0
如例子中的第6行,经过[3] = 29把arr[3]初始化为29,经过[0] = 12把arr[0]初始化为12。 htm
说明(1):若是在一个指定初始化项目后跟有不止一个值,如例子中的[3] =29, 18,则这些多余的数值将用来对后续的数组元素进行初始化,即数值18用来初始化arr[4]。 blog
提醒:对C语言数组来讲,在初始化一个或多个元素后,其中未经初始化的元素都将被自动地初始化为0或者NULL(针对指针变量而言)。未通过任何初始化的数组,其全部元素的值都将是不肯定的(针对局部变量而言)。 ip
同一元素被屡次初始化的例子,如清单2:
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[5] = {23, 3, 45, [1] = 34, 8};
-
- for (i = 0; i < 5; i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子输出结果:
- arr[0]: 23
- arr[1]: 34
- arr[2]: 8
- arr[3]: 0
- arr[4]: 0
如例子中的第6行,元素arr[1]和arr[2]先被分别初始化为3和45,后又经过指定初始化项目[1] = 34, 8把arr[1]和arr[2]的值改变为34和8。
说明(2):若是屡次对同一个元素进行初始化,则最后一次初始化的值有效。这也很好理解,由于数组的每一个元素都是一个变量,不断对同一变量赋不一样值,固然这个变量的最终值为最后赋的值。
指定初始化项目的特性在ISO C99中已经被支持。
GNU C还支持“[first … last] = value”的形式,即一个范围内的几个元素被初始化为同一值,举例,如清单3:
- #include <stdio.h>
-
- int main(void)
- {
- int i;
- int arr[] = { [0 ... 3] = 1, [4 ... 5] = 2, [6 ... 9] = 3};
-
- for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
- printf("arr[%d]: %d\n", i, arr[i]);
-
- return 0;
- }
例子输出结果:
- arr[0]: 1
- arr[1]: 1
- arr[2]: 1
- arr[3]: 1
- arr[4]: 2
- arr[5]: 2
- arr[6]: 3
- arr[7]: 3
- arr[8]: 3
- arr[9]: 3
二、在结构体变量中的应用
在结构体变量的初始化列表中经过点运算符(.)和成员名的形式(.fieldname= value)来指定初始化其中的某些成员。
举例,如清单4:
- #include <stdio.h>
-
- struct mystruct {
- int num;
- char ch;
- float fl;
- };
-
- int main(void)
- {
- struct mystruct mystruct = { .ch ='M' };
-
- printf(" num = %d\n ch = %c\n fl = %f\n",
- mystruct.num, mystruct.ch, mystruct.fl);
-
- return 0;
- }
例子输出结果:
- num = 0
- ch = M
- fl = 0.000000
前面两个说明中的特色一样适用于结构体变量。
注意:旧式的GCC 2.5编译器还使用过如下的形式(成员名加冒号)来初始化指定的结构体成员:
- struct point { int x, y; };
- struct point p = { y: yvalue, x: xvalue };
在联合体(共用体)中也可使用指定初始化项目的特性,如:
- union foo { int i; double d; };
- union foo f = { .d = 4 };