共用方式為


初始化純量類型

初始化純量類型時,會將 assignment-expression 的值指派給變數。 指派適用的轉換規則。(如需轉換規則的詳細資訊,請參閱類型轉換)。

語法

  • declaration:
    declaration-specifiers init-declarator-list opt**;**

  • declaration-specifiers
    storage-class-specifier declaration-specifiers opt

    type-specifier declaration-specifiers opt

    type-qualifier declaration-specifiers opt

  • init-declarator-list:
    init-declarator

    init-declarator-list , init-declarator

  • init-declarator:
    宣告子

    declarator = initializer /* 純量初始化 */

  • initializer:
    assignment-expression

您可以在遵守下列規則的情況下初始化任何類型的變數:

  • 可以初始化在檔案範圍層級宣告的變數。 如果您未在外部層級明確初始化變數,該變數預設會初始化為 0。

  • 常數運算式可以用來初始化所有使用 static storage-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;

這個陳述式初始化具有另一個變數 x 之位址的指標 b。

int *const a = &z;

使用名為 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 儲存類別且在宣告函式的執行期間只具有位址。 因此,不允許使用 LOCAL 位址初始化 static 指標變數 lp。 因為這個位址永遠相同,所以 static 指標變數 gp 可以初始化為 GLOBAL 的位址。 同樣地,您可以初始化 *rp,因為 rp 是區域變數,並可能具有非常數的初始設定式。 每當進入區塊時,LOCAL 會擁有新的位址,接著再將其指派給 rp。

請參閱

概念

初始化