C語言結構體

2021-10-02 12:41:02 字數 1367 閱讀 5372

c語言結構體(struct)從本質上講是一種自定義的資料型別,只不過這種資料型別比較複雜,是由 int、char、float 等基本型別組成的。你可以認為結構體是一種聚合型別。

在c語言中,可以使用結構體(struct)來存放一組不同型別的資料。結構體的定義形式為:

struct 結構體名

;

既然結構體是一種資料型別,那麼就可以用它來定義變數。例如:

struct stu stu1, stu2;
理論上講結構體的各個成員在記憶體中是連續儲存的,和陣列非常類似,

但是在編譯器的具體實現中,各個成員之間可能會存在縫隙。

cpu 通過位址匯流排來訪問記憶體,一次能處理幾個位元組的資料,就命令位址匯流排讀取幾個位元組的資料。32 位的 cpu 一次可以處理4個位元組的資料,那麼每次就從記憶體讀取4個位元組的資料;少了浪費主頻,多了沒有用。64位的處理器也是這個道理,每次讀取8個位元組。

對於程式來說,乙個變數最好位於乙個定址步長的範圍內,這樣一次就可以讀取到變數的值;如果跨步長儲存,就需要讀取兩次,然後再拼接資料,效率顯然降低了。

將乙個資料盡量放在乙個步長之內,避免跨步長儲存,這稱為記憶體對齊。

獲取結構體成員的一般格式為:

結構體變數名.成員名;
所謂結構體陣列,是指數組中的每個元素都是乙個結構體。在實際應用中,c語言結構體陣列常被用來表示乙個擁有相同資料結構的群體,比如乙個班的學生、乙個車間的職工等。

當乙個指標變數指向結構體時,我們就稱它為結構體指標。c語言結構體指標的定義形式一般為:

struct 結構體名 *變數名;
注意:結構體變數名和陣列名不同,陣列名在表示式中會被轉換為陣列指標,而結構體變數名不會,無論在任何表示式中它表示的都是整個集合本身,要想取得結構體變數的位址,必須在前面加&

通過結構體指標可以獲取結構體成員,一般形式為:

(

*pointer)

.membername

或者:

pointer->membername
->是乙個新的運算子,習慣稱它為「箭頭」,有了它,可以通過結構體指標直接取得結構體成員;這也是->在c語言中的唯一用途。

結構體變數名代表的是整個集合本身,作為函式引數時傳遞的整個集合,也就是所有成員,而不是像陣列一樣被編譯器轉換成乙個指標。如果結構體成員較多,尤其是成員為陣列時,傳送的時間和空間開銷會很大,影響程式的執行效率。所以最好的辦法就是使用結構體指標,這時由實參傳向形參的只是乙個位址,非常快速。

本文章主要摘自c語言中文網

C語言結構體

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

C語言 結構體

宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...

c語言 結構體

1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...