結構體,指標巢狀記憶體對其位域條件編譯

2021-08-04 02:29:30 字數 3007 閱讀 4385

結構體

#include

#include

// struct 是乙個c語言的乙個關鍵字,用來宣告乙個結構體型別

// 宣告了乙個名字叫 student 的結構體型別

// 有兩個成員,分別是整型的 id(學號)  字元陣列 name(名字)

// struct 只是宣告了這樣一種資料型別,和普通的資料型別比如int、char

// 一樣本身是沒有分配空間的,只有在定義變數的時候才會為變數分配空間

struct student

; //用struct 宣告型別的時候要有 ;號,和函式相區分

#if 0

// 變數定義2:直接在結構型別宣告的時候定義變數

struct teacher

t1,t2;  // 定義了兩個老師的變數 變數名叫 t1、t2

// 變數定義3:結構型別可以不要名字,也就是說不能在其他地方使用了

// 只能在型別宣告的時候定義變數

struct 

a, b;  // 定義結構體變數a和b

// int main()

#endif

// 結構體變數的初始化和成員使用

int main1()

;struct student stu2 = ;

// 結構的成員變數的使用,結構變數使用成員變數,需要點 . 指明使用的是哪乙個成員

printf ("id = %d, name = %s\n", stu.id, stu.name);

}int main()

結構體的記憶體對齊

#include

struct a

;struct b

;struct c

;struct d

;struct e

;int main()

位域 #include

#include

struct a

;struct b

;struct c

;struct d

;int main()

int main3()

int main2()

int main1()

結構體巢狀

#include

struct a

;struct b

;int main()

結構體指標

#include

#include

struct student

;int main1()

void printa(struct student a)

void printb(struct student *a)

int main()

;struct student b;

b = a;// 結構體變數之間可以直接賦值

// 結構體變數之間可以直接賦值導致結構變數可以直接作為函式引數進行傳遞

printb(&b);

printf ("id = %d, name = %s\n", b.id, b.name);

return 0;}

共用體

#include

// union是c語言的關鍵字,用來宣告乙個共用體型別

union a

;int main()

判斷大小端

#include

// 小端返回真(1),大端返回假(0)

int islittleendian()

a;a.a = 1;

return (a.ch == 1);

}int main()

列舉 #include

// enum 是c語言的乙個關鍵字,用來宣告列舉型別

enum week;

int main()

巨集定義

#include

#define pi 3.1415926

void func()

int main1()

// 巨集函式,使用方式類似函式,但跟函式是有本質區別的

//#define mul(a, b)  a*b

#define mul(a, b)  ((a)*(b))

#define min(a, b)   (((a)>(b))?(b):(a))

#define size(a)  sizeof(a)/sizeof(a[0])

int func1(int a)

int main()

int main2()

條件編譯

#include

int main()

typedef關鍵字

#include

// typedef 用於給本來存在的型別重新起個名字

typedef int int;

// 給 int [20] 這樣的型別取個別名叫 arr

typedef int arr[20];

// 定義指標型別 pint是int *的別名

typedef int * pint;

struct student 

;// stu就是 struct student 這樣一種型別

typedef struct student stu;

// node是 struct _node 這個結構體型別的別名

typedef struct _node

node;

// pnode 是struct _node *這樣結構體指標型別

typedef node * pnode;

// pfunc 是乙個函式指標型別

typedef void (*pfunc)(int, char**);

void mymain(int count, char **argv)

// void (*p)(int, char**) = mymain;

pfunc p = mymain;

void func(pfunc p)

int main()

int main1()

結構體在記憶體中的對其規則

乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 voidmain 比如例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 siz...

結構體在記憶體中的對其原則

乙個結構體定義完了之後,其在記憶體中的儲存並不等於所有元素寬度之和。基本資料型別結構體遵循 原則一 結構體中的元素是按照定義的順序乙個個放到記憶體中去的,並不緊密排布。從記憶體儲存單元的首位址 0 開始,每乙個元素都認為記憶體根據它的大小來劃分,所以每乙個元素存放的位置從自己寬度的整數倍開始。原則二...

C 語言結構體及位域記憶體大小

c 語言結構體及位域記憶體大小 小白一枚,最近線學習野火stm32,寫個部落格記錄下自己學習之路。以下資料來自野火論壇以及其他 存對齊的規則很簡單 1.起始位址為該變數型別所佔記憶體的整數倍,若不足則不足部分用資料填充至所佔記憶體的整數倍。2.該結構體所佔總記憶體為結構體成員變數中最大資料型別的整數...