最全面的C結構體的初始化和賦值

2021-10-10 06:36:57 字數 1749 閱讀 6924

結構體是常用的自定義構造型別,是一種很常見的資料打包方法。結構體物件的初始化有多種方式,分為指定初始化、順序初始化、建構函式初始化。假如有如下結構體。

struct a

(1)指定初始化(designated initializer)實現上有兩種方式,一種是通過點號加賦值符號實現,即「.fieldname=value」,另外一種是通過冒號實現,即「fieldname:value」,其中fieldname為指定的結構體成員名稱。前一種是c99標準引入的結構體初始化方式,但在c++中,很多編譯器並不支援。

//點號+賦值符號

struct a a=

;//冒號

struct a a=

linux核心喜歡用「.fieldname=value」的方式進行初始化,使用指定初始化,乙個明顯的優點是成員初始化順序和個數可變,並且擴充套件性好,比如增加欄位時,避免了傳統順序初始化帶來的大量修改。

(2)順序初始化是我們最常用的初始化方式,因為書寫起來較為簡約,但相對於指定初始化,無法變更初始化順序,靈活性較差。

struct a a1=

;

(3)建構函式初始化常見於c++**中,因為c++中的struct可以看作class,結構體也可以擁有建構函式,所以我們可以通過結構體的建構函式來初始化結構體物件。給定帶有建構函式的結構體:

struct a 

;int b;

int c;

}

那麼結構體物件的初始化可以像類物件的初始化那樣,如下形式:

struct a a(1

,2);

注意: struct如果定義了建構函式的話,就不能用大括號進行初始化了,即不能再使用指定初始化與順序初始化了。

變數的賦值和初始化是不一樣的,初始化是在變數定義的時候完成的,是屬於變數定義的一部分,賦值是在變數定義完成之後想改變變數值的時候所採取的操作。還是給定結構體a:

struct a

注意:結構體變數的賦值是不能採用大括號的方式進行賦值的,例如下面的賦值是不允許的。

struct a  a;

//錯誤賦值

a=;

下面列出常見結構體變數賦值的方法。

(1)使用memset對結構體變數進行置空操作:

//按照編譯器預設的方式進行初始化(如果a是全域性靜態儲存區的變數,預設初始化為0,如果是棧上的區域性變數,預設初始化為隨機值)

struct a a;

memset

(&a,0,

sizeof

(a))

;

(2)依次給每乙個結構體成員變數進行賦值:

struct a a; 

a.b=1;

a.c=

2;

(3)使用已有的結構體變數給另乙個結構體變數賦值。也就是說結構體變數之間是可以相互賦值的。

struct a a=

;struct a aa;

aa=a;

//將已有的結構體變數付給aa

初始化與賦值有著本質的區別,初始化是變數定義時的第一次賦值,賦值則是定義之後的值的變更操作,概念上不同,所以實現上也不一樣。

結構體和陣列的初始化和賦值

這種語法不能用於結構體的賦值,只能用於初始化。例如這樣是錯誤的 struct complex struct z1 z1 結構體變數之間使用賦值運算子是允許的,用乙個結構體變數初始化另乙個結構體變數也是允許的 陣列不能相互賦值或初始化 既然不能相互賦值,也就不能用陣列型別作為函式的引數或返回值 voi...

C 結構體初始化

今天在看mfc結構時,順便看了看 深入淺出mfc 發現有這麼一行 m pmainwnd new cmyframewnd 乍一看,很正常啊,再仔細一看,貌似 new cmyframewnd 的時候少了一對括號。奇怪!之後又翻了翻書,發現好多處都是這樣的。難道我弄錯了,不可能啊,一般情況下在new乙個新...

c 結構體初始化

在 系統程式設計師成長計畫 看到的,好像有點道理。宣告 struct s 習慣的初始化 struct s h 這種初始化是按結構體成員宣告的順序進行初始化的,即利用了struct記憶體布局的方法。若struct成員順序被修改了,初始化將引入隱患。幸運的話會收到編譯器的warning或error,否則...