使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。
二.結構體指標
結構體指標型別
匿名結構體型別
三.結構體的自引用
四. 結構體的記憶體對齊
修改預設對齊數
為什麼需要結構體對齊
總結結構體型別 char short ....... 內建型別 - (c語言自己的資料型別)
複雜物件
複雜型別
自定義型別 : 結構體、列舉、聯合體
宣告一乙個學生型別,通過學生型別來建立學生變數(物件)
描述學生 : 屬性名字 + ** + 性別 + 年齡
struct stu
;
建立結構體區域性變數
struct stu s1;
全域性變數
struct stu
s1,s2;
//全域性結構體變數
初始化結構體和列印.呼叫成員變數操作符
結構體變數.成員名
struct s s1 =
;printf
("%c %c %c %d\n"
, s.name,
s.tele, s.***, s.age)
;
結構體的重新命名(typedef)typedef
struct stu
stu2;
//重新起名字
(結構體指標)stu * ps=&s(建立的結構體區域性變數)
結構體變數->成員名訪問
printf
("name: %s\n"
, ps-
>name)
;printf
("age : %d\n"
, ps-
>age)
;printf
("tele: %s\n"
, ps-
>tele)
;printf
("*** : %s\n"
, ps-
>***)
;
print1(s)(傳引數傳的是整個結構體的臨時拷貝)和print2(&s)(傳入的是位址結構位址)
print1(s)(傳引數傳的是整個結構體的臨時拷貝這種操作是會壓棧的)
先進的後面出,後進的先出,如果你要拿先進的資料,進必須然後後面的資料進行出棧操作操作拿到你要的棧地的資料
struct
*psa;
struct
x;
通過x呼叫
struct node
;
在乙個結構體裡儲存著另乙個的相同結構體型別的位址,而在另乙個的結構體又儲存著另乙個的相同型別的結構體型別的指標,形成資料結構的鍊錶形式和鍊錶一樣
結構體的初始化2
struct s s =
,100
,3.14
,"hello bit"};
printf
(" %lf\n"
, s.st, s.st.weight )
;
結構體的記憶體對齊
1.第乙個成員在與結構體變數偏移量為0的位址處。
2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
對齊數 = 編譯器預設的乙個對齊數與該成員大小的較小值。
●vs中預設的值為8
3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
4.如果巢狀了結構體的情況, 巢狀的結構體對齊到自己的最大對齊數的整數倍處, 結構體的整
體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
;
//修改預設對齊數
//設定預設對齊數字4
#pragma pack(4)
//取消設定
#pragma pack()
先假設不存在記憶體對齊的情況
32位的機器(二進位制),32根位址線32個資料線
每次讀取一4個位元組(32個位元位)
例由於一次性取4個位元組的(32個位元位)如果說char型別和int型別沒有對齊的情況下5位元組第一次讀4位元組那麼讀取int的時候就要讀取兩次
第一次是char一位元組和int的3位元組組成的4位元組。第二次讀取int剩餘的乙個位元組(光是資料讀取兩次)
所以記憶體對齊可以大大提公升記憶體訪問速度,是一種用空間換時間的方法。
記憶體不對齊會有可能導致每次讀取資料都會讀取兩次,使得記憶體讀取速度減慢
我們既要滿足對齊, 又要節省空間, 如何做到:
讓占用空間小的成員盡量集中在一 起。
c語言 結構體學習筆記
一般形式 struct 結構體名 示例struct student 注意最後的分號2.1.先宣告結構體型別,再定義該型別的變數示例 struct student student1,student2 2.2.在宣告型別的同時定義變數 一般形式 struct 結構體名變數名表列 示例struct stu...
C語言學習筆記 結構體
1 結構體定義 結構體是將不同型別的資料按照一定的功能需求進行整體封裝,封裝的資料型別與大小均可以由使用者指定。2 結構體宣告 宣告乙個結構體型別的一般形式為 struct 結構體名 例如 struct book 注意 結構體名 的命名規範是全部使用大寫字母。3 定義結構體變數 定義結構體型別變數有...
C語言學習筆記 結構體
struct stu 順帶宣告 在結構體宣告的最後的分號前加stu1,stu2這樣的變數名,不需要寫結構體的名字。利用結構體名來宣告變數 struct stu stu3 struct stu stu1,stu2,stu3 這樣的語句中struct stu就可以理解成變數宣告前的int,double等...