初始化的标量类型

当初始化标量类型时,该 赋值表达式的 值赋给变量。 分配的转换规则也适用。 (请参见 类型转换 有关转换规则的信息。)

语法

  • 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。

请参见

概念

初始化