在C语言中,初始化器(Initializer)是一种特殊的语法,用于在变量定义时设置初始值。对于不同类型的变量(如基本类型、数组、结构体和联合体),初始化器的用法有所不同。
1. 基本类型
对于基本数据类型,比如int
、float
等,初始化很简单,只需在声明变量的同时赋予它一个值:
int a = 10;
float b = 3.14f;
2. 数组
对于数组,可以初始化所有元素或数组的一部分:
int numbers[] = {1, 2, 3, 4, 5}; // 初始化一个有5个元素的数组
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 初始化一个2x3的矩阵
3. 结构体和联合体
对于结构体(struct)和联合体(union),可以初始化它们的成员:
struct Point {int x;int y;
};struct Point p = {10, 20}; // 初始化结构体的两个成员// C99后,使用指定初始化器语法来初始化特定成员
struct Point p1 = {.y = 20, .x = 10}; // 成员可以不按声明顺序初始化
联合体初始化类似,但只能初始化第一个成员,因为联合体中的所有成员共用同样的内存位置。
4. 指定初始化器(Designated Initializers)
C99标准引入了指定初始化器,这使得在初始化数组和结构体时可以指定某个特定成员或索引的初始值:
int numbers[10] = {[0] = 1, [9] = 10}; // 只初始化第一个和最后一个元素
struct Point point = {.x = 5}; // 其他成员如未指定将被初始化为零值
注意: 这里的
int numbers[10] = {[0] = 1, [9] = 10}; // [0] = 1, [9] = 10 这种初始化语法 可以对数组的指定对象进行初始化
struct Point point = {.x = 5}; // 其他成员如未指定将被初始化为零值
然后 再结合宏定义使用
如:
#define TABLE
{
[0] = {.name = "W25Q128JV", .spi.name = "SPI0"},
}
static struct_flash table[] = TABLE; //实现对 结构体数组中的指定序号的对象初始化
然后再结合 枚举 使用
enum {
DEVICE_INDEX = 0,
};
#define TABLE
{
[DEVICE_INDEX ] = {.name = "W25Q128JV", .spi.name = "SPI0"},
}
、、、、、、、、、、、、、、、、、、、、、
static struct_flash table[] = TABLE;