C陣列 結構體 聯合體快速初始化

2021-09-08 10:15:37 字數 2518 閱讀 4371

背景

c89標準規定初始化語句的元素以固定順序出現,該順序即待初始化陣列或結構體元素的定義順序。

c99標準新增指定初始化(designated initializer),即可按照任意順序對陣列某些元素或結構體某些成員進行選擇性初始化,只需指明它們所對應的陣列下標或結構體成員名。gnu c將其作為c89模式的擴充套件。

借助指定初始化特性,可實現陣列或結構體元素的快速初始化。

1陣列初始化

在陣列初始化列表中使用「[index常量表示式]=value」形式可對index所指定的某個元素進行初始化。如:

int arr[6] = ; 或

int arr[6] = ; 或

int arr[6] = ; (指定順序可變)

均等效於:int arr[6] = ;

說明:1) 若在某個指定初始化專案後跟有不至乙個值,如[3]=10,11。則多出的數值用於對後續的陣列元素進行初始化,即數值11用來初始化arr[4]。

2) c陣列初始化乙個或多個元素後,未初始化的元素將被自動地初始化為0或null(針對指標變數)。未經過任何初始化的陣列,所有元素的值都是不確定的。

當下標是字元或屬於列舉型別時,標識陣列初始化語句的元素特別有用。如:

int whitespace[256] = ;

static const char* gmsgname = ; //列舉值變化時,陣列自動同步更新

這種初始化方式可實現簡化的對映表,不過在下標指示符跨度較大時稍顯浪費記憶體。

gnu c還支援」[first … last]=value」(…兩側有空格)的形式,將該範圍內的若干元素初始化為相同值。如:

int arr=; 或

int arr=;

均等效於:int arr[10] = ;

注意,陣列長度為指定的最大下標值加1。

這種初始化方式比memset高效且用途更廣,如:

int arr=;

等效於:memset(arr, 0xff, sizeof(arr));

int arr=;

不等效於:memset(arr, 1, sizeof(arr));

2結構體初始化

結構的指定初始化語法與陣列類似,只不過使用點運算子和成員名(而不是方括號和索引值)標識具體的元素。例如,對於結構體

struct structure;或struct structure;

有以下幾種初始化方式:

struct structure tstct = ;

核心結構體多採用第一種初始化方式,如linux-2.6.x/drivers/usb/storage/usb.c裝置驅動程式中: 

static struct usb_driver usb_storage_driver = ;

也可只初始化結構體成員value:

struct book surprise = ;

正如陣列一樣,跟在指定初始化專案後且沒有指示符(「[index]」或「fieldname」)的常規初始化專案為跟在指定成員後定義的下個成員提供初始值。此外,若對特定成員初始化多次,則最後一次賦值是它實際獲得的值。

考慮下列宣告:

struct book gift = ;

將把值0.25賦給成員value,因為它在結構體定義中緊跟在author成員之後。新值0.25覆蓋前值18.90。

若覆蓋初始化有***(如型別不相容),則gnu c可能會產生編譯警告。

利用指定初始化特性,可方便地編寫如下的測試例程:

agent_pw_psn tpwpsn = ,

.dwvlanid = 300,

.dwpriority = 7

omcisetpwpsn(&tpwpsn, sizeof(tpwpsn), aucbufout, &dwoutlen);

3聯合體初始化

可用「.fieldname」 (或已廢棄的「fieldname:」)指示符來指定使用聯合體的哪個元素,如:

union uniont ;

union uniont tunion = ;

使用第二個元素將4轉換為double型別存入聯合體。相反,將4轉換為union uniont型別則會把它作為整數i存入聯合體。

4結構體陣列初始化

struct structure ptstct[10] = ;

5 gcc擴充套件結構體賦值

對於上文定義的結構體structure可整體賦值:

struct structure tstct1, tstct2;

tstct2 = tstct1;

結構體也可作為函式返回值對另乙個結構體賦值:

struct structure func1();

struct structure tstct = func1();

C 結構體 聯合體

結構體是特殊形態的類,與類的區別 結構體的預設訪問許可權是public,也就是說當你建立資料成員的時候,預設是屬於public類,存在的主要原因 與c語言保持相容。結構體 struct 學生資訊 include include include using namespace std struct s...

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...

C 結構體和聯合體

結構體資料對齊問題 使用union定義的是聯合體 利用union可以用相同的儲存空間儲存不同型別的資料型別,從而節省記憶體空間。當訪問其內成員時可用 和 來直接訪問。當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 在c programming language 一書中...