(一).結構體是一種自定義型別
1.結構體是一種型別
2.結構體是使用者自定義的型別
原因:1.系統提供的資料型別均是單一的資料型別
2.現在的資料型別無法復合儲存多個資料
(二).結構體的定義
1.結構體型別是乙個復合型別;
2.結構體型別由成員構成
3.定義
struct 結構體成員名 型別名
例:struct node
(1)行為:定義了一種型別
型別名稱: struct node
大小: 不僅是各個成員變數之和,還要位元組對齊
(2)結構體型別成員
①表示乙個結構體由哪些成員組成
②系統不為每個成員分配單元
意義:struct node 這種資料型別有三個成員組成
③乙個結構體型別的定義即該結構體型別成員的定義
(三).結構體型別變數
1.系統不會為結構體型別分配儲存單元
(1)只有使用者先定義的資料型別,然後通過結構體型別定義變數
(2)系統會按照結構體大小為結構體型別變數分配單元
2.結構體型別變數的定義
struct 結構體名 變數名;
(結構體型別名)
例:struct node
;//通過結構體型別定義變數
struct node s;
(1)系統通過struct node型別為變數s分配單元
(2)變數s由三個成員構成
(3)結構體變數成員的引用
結構體變數名.成員名
① . 成員運算子(雙目)
優先順序最高
②功能:引用乙個結構體變數單元的分量子單元
struct node s, t;
s: 中有一組
t:中有一組
注意:s.x與t.x沒有一毛錢關係
分別給變數s的x, y, c 分量成員賦值
s.x = 15;
s.y = 3.1;
s.c = 'j';
將結構體變數s各個分量成員的值存入變數單元
方法1:
s.x = t.x;
s.y = t.y;
s.z = t.z;
方法2:
t = s;
兩個同型別的結構體變數單元之間可直接賦值
3.結構體陣列的定義
struct 結構體型別名 陣列名[個數];
例:struct node s[3];
s[0].x = 12;
s[0].y = 1.3;
s[0].c = '4';
通過鍵盤給s[2]的成員賦值
scanf("%d",&s[2].x);
scanf("%f",&s[2].y);
scanf("%c",&s[2].c);
(四)型別重新命名
1.對已存在的型別名進行重新命名:
typedef 原型別名 重新命名
例:typedef int elemint;
2.結構體的重新命名:
1)先定義結構體型別再重新命名
struct node
;typedef struct node elems; //重新命名
struct node s;//定義結構體變數s
elems t;//定義結構體變數t
2)定義結構體型別同時重新命名
(1)方法1:
typedef struct node
elems;
(2)方法2:
typedef struct
elems;
(五)結構體的儲存方式(位元組對齊)
1.對於char型別資料自身的對齊值為1位元組,對於short型為2位元組,int、float型別為4位元組,double、long型別為8位元組。
2.結構體自身對齊值(預設):其所有基本成員中那個對齊值最大的值。
3.指定對齊值:#pragma pack (vale),其中對齊值為vale。
4.有效對齊值:自身對齊值和指定對齊值中小的那個值。
5.當結構體中含有空陣列時,空陣列所佔位元組數為0.
(六)柔性陣列
1.柔性陣列的標誌是結構體的最後乙個成員是乙個沒有定義大小的陣列,需要malloc動態申請陣列大小後使用(需要加入標頭檔案#include )
(1)int型陣列
typedef struct
s;s* create_soft_arr(int len)
(2)char型陣列(一般用於操作字串,加入標頭檔案#include )
typedef struct
s;int main(void)
2.柔性陣列其實就是對「空陣列所佔空間為零」和「指標可以越界」的一種綜合應用。
(七)結構體與函式
typedef int (*pfun)(int a, int b);//重新命名函式型別為函式指標
int add(int a, int b)
struct data
s;void set_func (struct data *s)//結構體賦值
int ret_func (struct data *s)//使用,在主函式呼叫該函式即可
(八)網路結構體
#include
#include
#include
#include
#include
#include
#include
#define port 1234
#define addr "172.25.10.10"
void set_struct (struct sockaddr_in *p)
int main(void)
(九)列舉
1.定義常量符號,就是巨集定義常數的集合體。如四季,星期,意義相關的常數
例子:typedef enum
s;void main(void)
注意:列舉型別定義的變數,只能賦已經定義過的值
(十)linux核心裡的兩個巨集:在驅動應用中很廣泛
1.off_set_of(type, member)
計算元素在結構體內的偏移量
偏移量 = 當前成員的位址 - 成員所在結構體的首位址
如果結構體的首位址為0時
偏移量 = 當前成員的位址
巨集定義為:#define off_set_of(type, member) ((long)&((type*)0->member))
2.containe_of(ptr, type, member)
計算成員變數所在結構體的首位址,
成員所在結構體的首位址 = 當前成員的位址 - 偏移量
巨集定義為:#define container_of(ptr, type, member) ()
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 定義結構體變數...