例解GNU C之指定初始化项目
来源:互联网 发布:抽数字软件 编辑:程序博客网 时间:2024/05/20 16:11
http://blog.csdn.net/npy_lp/article/details/7010886
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。
帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions
指定初始化项目(Designated Initializers):指的是可以对数组中的某些元素或结构体变量中的某些成员以任意的顺序进行选择性的初始化。
1、在数组中的应用
在数组的初始化列表中使用“[index]= value”这样的形式即可实现对指定(通过index指定)的某个元素进行初始化。
举例,如清单1:
- #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。
说明(1):如果在一个指定初始化项目后跟有不止一个值,如例子中的[3] =29, 18,则这些多余的数值将用来对后续的数组元素进行初始化,即数值18用来初始化arr[4]。
提醒:对C语言数组来说,在初始化一个或多个元素后,其中未经初始化的元素都将被自动地初始化为0或者NULL(针对指针变量而言)。未经过任何初始化的数组,其所有元素的值都将是不确定的(针对局部变量而言)。
同一元素被多次初始化的例子,如清单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
2、在结构体变量中的应用
在结构体变量的初始化列表中通过点运算符(.)和成员名的形式(.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 };
- 例解GNU C之指定初始化项目
- 例解GNU C之指定初始化项目
- 例解GNU C之指定初始化项目
- 例解GNU C之指定初始化项目
- 例解GNU C之typeof
- 例解GNU C之typeof
- 例解GNU C之typeof
- 数组初始化:指定初始化项目
- c99 指定初始化项目
- 例解GNU C之typeof (一)
- GNU C 之 __attribute__
- C语言的指定初始化
- C语言的指定初始化
- 例解GNU C之零长数组与变长数组
- 例解GNU C之表达式中的复合语句
- 例解GNU C之匿名联合或结构体
- 例解GNU C之匿名联合或结构体
- 例解GNU C之表达式中的复合语句
- 旅店管理系统(uml)
- Zoj 3502 Contest 状态压缩
- 白话经典算法系列之二 直接插入排序的三种实现
- wxPython进度条
- SQL Server 2008 数据库同步的两种方式 (发布、订阅)
- 例解GNU C之指定初始化项目
- Android.os.NetworkOnMainThreadException
- Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)
- 为什么不需要在 Docker 容器中运行 sshd
- 将真分数分解为埃及分数
- iptables禁止某个mac地址上网
- 白话经典算法系列之三 希尔排序的实现
- 三个数求最大数、最小数、中间数
- swap函數 进阶探讨与实现