課堂總結5

2021-08-14 06:11:16 字數 3788 閱讀 6668

位元組對齊詳細講解

1、我們的結構體變數本身就是在4位元組對齊的位置,編譯器幫我們做的事。

2、第乙個成員,就從結構體開始的位址處,存放。這個元素,具體佔多少位元組,由緊挨著下個元素決定。

3、整個成員變數自身都對齊 了,還沒有結束。

4、整個結構體還要是預設位元組對齊的最小整數倍。

結構體預設的位元組對齊:成員變數最大的那個型別所佔位元組

64位機下在設定對齊時會將結構體最大的元素與8位元組比較,取其小

例如在如下例子中

最大的成員是a(4位元組)<8位元組

所以以4位元組對齊

typedef

struct data

d;//8位元組

下例中最大成員是b(8位元組)

根據上面的說法 以8位元組對齊

struct data1

d;//16位元組

位元組對齊命令

#pragma pack(n) (1、2、4、8、…..)

…… #pragma pack()

這兩個配合使用,表示乙個區間,只有這個區間內的結構體享受這個待遇。

設定 對齊。

設定為1,就是不對齊

1、充分利用記憶體空間,犧牲了速度,降低了訪問效率。

2、提高效率、效能,犧牲了記憶體空間。

總結:你指定的對齊方式和結構體自身預設對齊方式,倆者取最小的。

用法舉例:

下例的意思是以2位元組對齊

所以是s1結果是14

s1是2

#pragma pack(2)

struct data

s;struct data1

s1;#pragma pack()

位欄位

位欄位:專用於結構體,結構體成員的型別必須是:int || unsigned int

有時侯,結構體成員表示的資料很小,就用幾個位來表示。

下例1

a佔32位中的1bit

b佔2bit

c佔2bit

後面全部填充

struct data  //4

s, *p = &s;

例子2

struct data2    //12

s2;

例子3

struct data3   //8

s3;

linux核心裡的兩個巨集:在驅動應用中很廣泛。

1, off_set_of(type, member)計算結構體內元素的偏移量

2, containe_of(ptr, type, member),ptr是結構體裡成員的指標,通過呼叫這個巨集計算出結構體的首位址.包含兩句**(表示式),必須要加{}.

這兩個巨集:核心雙鏈表。

#define off_set_of(type, member) ((long)&(((type *)0)->member))

#define container_of(ptr, type, member) ()

分析:1、(type *)0指向結構體零位址 \

2、((type *)0)->member得到了結構體某個成元變數名 \

3、給這成員變數名,取位址(相對於零位址),此時&(((type *)0)->member)表示是指標型別 \

4、強制型別轉換成long。

struct da

; // 16

struct data

s = ;

int main(void)

struct data *p = container_of(p_e, struct data, e);
得到成員e的結構體首位址

列舉型別以及簡單密碼鎖的編寫

typedef enum

state

s;

如果

typedef

enum fangxiang // 識別符號

e;

在這裡sauth==100;

north==100;

簡單密碼鎖例項**

int main(void)

if (current_state == state5)

if (current_state == state1)

printf("初始狀態.\n");

}return

0;}

網路結構體ipv4

struct in_addr

;/* structure describing an internet socket address. */

struct sockaddr_in

;

標頭檔案:

#include 

#include

#include

#include

#include

#include

#include

型別定義/巨集定義

typedef uint32_t in_addr_t;

typedef uint16_t in_port_t;

#define port 0x1234

#define addr "192.168.1.22"

給每個成員賦值

void set_net_struct(struct sockaddr_in *p)

柔性陣列

柔性陣列:是在結構體裡,有乙個陣列,必須是結構體最後的乙個元素,而且由特定形式或[0];

整體的結構體至少有兩個成員變數。

typedef

struct

s;

//生成柔性陣列

void create_soft_arr(int len)

//看一下 用func

free(p);

}

結構體函式

typedef

int (*p_func)(int a, int b);

int add(int a, int b)

int mul_a_b(int a, int b)

//結構體各成員預設是public

//class在c++裡,是乙個類,所有成員和方法(函式)是si(private)有的,只能在類裡進行訪問

//struct裡面不能包含函式,但是可以包含函式指標

struct data

s;//填充結構體

void set_func(struct data *p)

//業務函式

int cnt_func(struct data *p_str)

課堂筆記5

1 語句 語句是完成某種特定任務的 要以英文的分號 結束 語句在定義的時候可以出現在一行中,也可以一行出現多條語句 表示式可以單獨出現在js 中,但是沒有任何意思 2 變數 變數是對 值 的引用。在其他的場合中,有時候把引用也成為位址或指標 在js中,定義變數用 var 關鍵字 var可以不出現變數...

課堂總結2

2019.09.06 上午主要是講了盒模型和display,點了一下float 盒模型主要講了border,margin 外邊距 盒子之間的距離 padding 內邊距 盒子邊緣與內容之間的距離 的使用,和在程式設計時的注意事項,和如何使用和調整,以及調整的技巧 其中需要注意的是 padding 1...

JAVA溫習課堂5

28 static 關鍵字 靜態的 非物件導向的 乙個類的多個物件共享乙個變數,需要用static修飾該變數 因為static修飾的變數為類的所有例項共享,所以static成員不屬於某個類的例項,而屬於整個類 所以在訪問允許的情況下,可以使用 類名.直接訪問靜態成員 成員包括屬性和方法 static...