舉例,乙個結構體的定義如下:
typedef struct_foo foo;
如果直接對上面的結構体作sizeof()運算:
printf("%d\n
", sizeof(foo)); //
40
如果在成員名後面加上冒號,指定占用的bits數,可以節省結構體的大小,例如:
typedef struct_foo foo;
可以使用下面的巨集計算結構體中某個成員的偏移位置:
#define offset(type, member) ((int) &((type*)0) ->member)
演示如何計算成員的位置:
foo f1 = ;char *p = &f1;
int age = *(int*) (p + offset(foo, age)); //
equivalent f1->age
結構體變數在定義的同時進行初始化,類似於陣列的初始化:
foo f1 = ;
也可以只對部分成員進行初始化:
foo f2 = ;
未顯示初始化的成員會有預設值。
還可以使用如下的初始化方法:
foo f3 =;
這種方法可以打亂結構體成員賦值的順序,在linux核心中經常使用這種賦值方法,增強**的可移植性(比如有些成員在不同平台可能被編譯,可能不編譯)。
下面這種寫法也是一樣的:
foo f4 =;
同型別的結構體變數之間可以互相賦值:
foo f1 = ;foo f2 = f1;
但如果有指標成員,就要特別小心了,例如:
typedef struct_foo foo;
foo f1;
f1.name = strdup("
bush");
f1.age = 31
; f1.*** = 0
; foo f2 = f1;
這裡的 f1.name 和 f2.name 兩個成員指標指向的是同一塊記憶體(即淺拷貝),釋放其中任何乙個,都會影響另外乙個。
C語言的結構體
c語言中的基本資料型別有 整形 浮點型 字元型,復合資料型別 陣列。還有一種構造資料型別,叫 結構體 宣告結構體的形式 struct 結構體名 成員列表可以是c語言的任何資料型別,如 整形 浮點型 字元型 陣列,指標,結構體 共用體 列舉。宣告了乙個結構體,相當於構造了一種新的資料型別,此時系統並不...
c語言的結構體
1.結構體的概念 結構體是一種複合型資料型別,同屬於複合型資料型別的還有聯合體。結構體可以理解為是一種自定義型別,用於對其他資料型別 什麼int型,double型,float型等等 的打包。c語言中正是因為結構體的存在,使其 具有封裝性,可以基於物件導向思想來程式設計。2.結構體的宣告 定義 假設我...
C語言結構體
1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...