C語言的結構體

2022-09-16 01:48:09 字數 1202 閱讀 4581

舉例,乙個結構體的定義如下:

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 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...