初始化的标量类型
当初始化标量类型时,该 赋值表达式的 值赋给变量。 分配的转换规则也适用。 (请参见 类型转换 有关转换规则的信息。)
语法
declaration:
声明说明符 init 公告列表opt**;**声明说明符:
存储类说明符声明说明符 opt类型说明符声明说明符 opt
类型限定符声明说明符 opt
init 公告列表:
init 声明init 公告列表 , init 声明
init 声明:
声明声明 标量初始化的**=** 初始值设定项 /* */
初始值设定项:
赋值表达式
,在您遵循以下规则条件下,您可以初始化任何类型的变量:
声明变量在文件范围级别进行初始化。 如果不显式初始化变量在该外部级别,默认情况下它初始化为 0。
常数表达式可用于初始化所有全局变量声明 静态存储类说明符。 ,当程序开始执行时,声明的变量是 静态 初始化。 如果不显式初始化全局 静态 变量,默认情况下它初始化为 0,因此,具有指针类型的每个成员分配 null 指针。
声明的变量 自动 或 注册 存储类说明符初始化,每次执行控制传递给它们声明的块。 如果省略 自动 或 注册 变量的声明的初始值设定项,则该变量的初始值为未定义。 对于自动和注册值,则初始值设定项不局限是常数;它可以是涉及到以前已定义的值的表达式,偶函数调用。
初始值外部变量声明的和所有 静态 变量的,外部或内部,是否必须是常数表达式。 (有关更多信息,请参见 常数表达式。)因为任何外部声明的变量或静态变量地址是常数,它可用于初始化一个在内部声明的 静态 指针变量。 但是,在中,因为它可能有所不同的块,的每执行 自动 变量的地址不能用作静态初始值设定项。 可以使用初始化 自动 和 注册 变量的常数或值。
如果标识符的声明具有块范围,因此,该标识符有外部链接,声明不能具有初始化。
示例
下面的示例演示初始化:
int x = 10;
整数变量 x 初始化为常数表达式 10。
register int *px = 0;
指针 px 初始化为 0,生产 “null”指针。
const int c = (3 * 1024);
此示例使用常数表达式 (3 * 1024) 初始化 c 到由于 const 关键字,而不能修改的常数值。
int *b = &x;
此语句初始化与另一个变量地址的指针 b , x。
int *const a = &z;
指针 a 初始化名为 z变量的地址。 但是,在中,由于指定是 const,可变 a 不能只初始化,修改。 它始终指向同一位置。
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
全局变量 GLOBAL 声明一个外部级别,因此,它具有全局生存期。 局部变量 LOCAL 具有 自动 存储类和只有地址在声明函数过程中执行。 因此,尝试初始化 静态 指针。 LOCAL 地址的变量 lp 是不允许的。 ,因为该地址总是相同的, 静态 指针变量的 gp 可以初始化为 GLOBAL 地址。 同样, *rp 初始化,因为 rp 是局部变量,还可能有一个用非常数初始值设定项。 每当块中输入, LOCAL 有一个新的地址,然后分配给 rp。