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