添加到所有这些好的回答总结如何在C中初始化一个结构(联合和数组),特别是设计的初始化器。
标准的初始化
struct point
{
double x;
double y;
double z;
}
p = {1.2, 1.3};
指定初始化
指定初始化式出现于ISO C99,是在C语言中初始化struct、union或数组时的一种不同的、更动态的初始化方式。
与标准初始化的最大区别是,您不必按固定顺序声明元素,也可以省略元素。
摘自GNU指南:
标准C90要求初始化式的元素以固定的顺序出现,与初始化数组或结构中元素的顺序相同。
在ISO C99中,您可以以随机顺序给出元素,指定它们应用的数组下标或结构字段名,GNU C也允许在C90模式中作为扩展
例子
1. 数组索引
标准的初始化
int a[6] = { 0, 0, 15, 0, 29, 0 };
指定的初始化
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. 结构或联合:
标准的初始化
struct point { int x, y; };
指定的初始化
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3.将命名元素与连续元素的普通C初始化结合起来:
标准的初始化
int a[6] = { 0, v1, v2, 0, v4, 0 };
指定的初始化
int a[6] = { [1] = v1, v2, [4] = v4 };
4. 其他:
标记数组初始化式的元素
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
写一系列的“。”' = '前面的Fieldname '和' [index] '指示符指定要初始化的嵌套子对象
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
指南
Designated-initializers-c | geeksforgeeks.org
using-designated-initializers
Tutorialspoint.com |designing-initializs-inc