初始化标量类型

初始化标量类型时,会将 assignment-expression 该值分配给变量。 分配的转换规则适用。 (有关转换规则的信息,请参阅 类型转换

语法

declaration:
declaration-specifiers init-declarator-list 选择;

declaration-specifiers:
storage-class-specifier declaration-specifiers 选择
type-specifier declaration-specifiers 选择
type-qualifier declaration-specifiers 选择

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer /* 用于标量初始化 */

initializer:
assignment-expression

只要遵守以下规则,就可以初始化任何类型的变量:

  • 可以在文件范围级别声明的变量进行初始化。 如果未在外部级别显式初始化变量,则默认将其初始化为 0。

  • 常量表达式可用于初始化使用 staticstorage-class-specifier.. 在程序执行开始时,声明要 static 初始化的变量。 如果未显式初始化全局 static 变量,则默认将其初始化为 0,并且具有指针类型的每个成员都会分配一个 null 指针。

  • 每次执行控件传递到声明它们的块时,都会初始化使用 autoregister 存储类说明符声明的变量。 如果从变量声明autoregister中省略初始值设定项,则未定义变量的初始值。 对于自动值和寄存器值,初始值设定项不限于为常量;它可以是涉及以前定义的值的任何表达式,甚至涉及函数调用。

  • 外部变量声明和所有 static 变量的初始值(无论是外部变量还是内部变量)必须是常量表达式。 有关详细信息,请参阅 常量表达式。 由于任何外部声明的变量或静态变量的地址都是常量,因此可用于初始化内部声明的 static 指针变量。 但是,变量的 auto 地址不能用作静态初始值设定项,因为它对于块的每个执行可能有所不同。 可以使用常量或变量值来初始化 autoregister 变量。

  • 如果标识符的声明具有块范围,并且标识符具有外部链接,则声明不能具有初始化。

例子

以下示例演示初始化:

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 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 具有 auto 存储类,并且在执行声明它的函数期间只有一个地址。 因此,不允许尝试使用 地址初始化指针变量static指针变量gp可以初始化为地址,GLOBAL因为该地址始终相同。 同样, *rp 可以初始化,因为 rp 是局部变量,并且可以具有非常量初始值设定项。 每次输入块时, LOCAL 都有一个新地址,然后分配给 rp该地址。

另请参阅

初始化