Day 15 結構體,共用體, 列舉,鍊錶 。

2021-09-25 21:06:49 字數 4308 閱讀 4434

1.結構體:結構體是使用者自己定義的一種資料結構。(c語言中是允許使用者自己定義資料型別的。)它是使用者將不同的基本資料型別組合在一起,構成的一種新的資料型別。

這些組合在一起的資料型別是相互聯絡的。這種結構體的寫法,對於有時候的引用會非常方便。

struct student

; //記得要加封號

此齣結構體 struct student 在定義後共佔108個位元組

struct student

; //記得要加封號

按理此時應該在定義後佔106個位元組但是實際。

此齣結構體 struct student 在定義後共佔108個位元組

原因是結構體在記憶體中的儲存形式決定的。gcc 編譯器下,在結構體中預設為最大可以為四個位元組,當大於四個位元組的型別時按四個位元組儲存整除對齊,

當資料型別都小於四個位元組的時侯,按照可以被型別中最大的那個型別位元組數整除。 比如上面的106位元組,(上面最大的資料型別為int 四位元組)因為不能被四整除,所以擴充套件到108位元組。

2.結構體是允許巢狀的。

struct date

;struct student

;//此處按理說是118位元組,但實際上在定義後為120位元組,牢記gcc 編譯環境下要為4整除。

struct bar

;struct demo

;//此處實際結果為3

struct bar

;struct demo

;//此處實際結果為6 (要可以整除以2)

struct bar

;struct demo

;按理為1+8 為九個位元組, 但是要對齊位元組, 此處雖然最大的為 double 8位元組 但實際結果不整除8,而是要整除以4

//此處實際結果為12 (要可以整除以4)

struct bar

;struct demo

;按理說為 1+2+2+8 =13位元組。但是對齊問題要能被四整除。

//此處實際結果為16(要可以整除以4)

struct bar

;struct demo

;1+2+2+2

//此處結果為 8(要為2整除)

3.有一種辦法可以規定按幾個位元組對齊。

#pragma pack(1) //此處定義按乙個位元組對齊。

#pragma pack(1) //規定對齊方式。

struct bar

;struct demo

;1+2+2+2

//此處結果為 7(要為1整除)

小結: 關於在編譯器下是否規定按幾位元組對齊的問題,

如果規定按乙個位元組對齊,雖然省下了空間但會降低cpu的處理資料的效率,

如果不規定按照編譯器預設的來則會提高處理效率但會浪費空間資源。

另外在一些實際專案中往往會規定按幾位元組處理對齊,這會方便通訊交流。

4.結構體不允許使用關係運算子。

5.結構體允許整體賦值。

struct date

;struct student

; struct student s = };

6.共用體 : 要注意不能把共用體作為函式引數。

//共用體與結構體的宣告, 定義非常類似, 不同的是儲存的不同

union demo

;union ip

;union aaa

;//共用體不能作為函式的引數

void fn(union aaa a) //此種寫法為錯誤的。

int main(void)

else

*/ union demo d;

d.i = 12345678;

d.s = 12345;

d.c = 100;

union demo *p;

p = &d;

p->c = 100;

printf("%d\n", sizeof(union demo));

return 0;

}***

***用共用體的方法判斷電腦是大端還是小端儲存模式。

union demo

;int main(void)

7.列舉

(1) 不應該把整型給列舉型別賦值,雖然這樣做編譯器不會報錯,但這要程式會亂掉。

enum week //列舉是可以確定乙個範圍的。

;int main(void)*/

return 0;

}***

***使用結構體,初始化並列印出結構體裡面的元素值。使用 scanf() 向結構體中輸入相應的值並且列印出來。

struct date

;struct student

;//列印結構體中成員的值。

void printstudent(struct student *st)

//輸入相應的值

void scanstudent(struct student *st)

//列印結構體陣列。

void printstudents(struct student *st, int len)

}void sortstudent(struct student *st, int len) //排序可以按照結構體中的任何乙個成員來比較排序。

} }}

int scorcmp(const void *p1, const void *p2) //此函式要自己定義。

else if(q1 ->score < q2 ->score)

else

*/ if(strcmp(q1 -> name, q2 ->name) > 0) //在此處只需要判斷比較成員的大小,返回結果即可自動排序。

else if(strcmp(q1 ->name, q2 ->name) < 0)

else }

int main(void)

}, },

}};qsort(s, sizeof(s) /sizeof(s[0]), sizeof(s[0]), scorcmp); //此句為呼叫系統的qsort函式。

//scorcmp為乙個函式指標變數。

// sortstudent(s,sizeof(s) / sizeof(s[0])); //此句為自己寫的排序

printstudents(s, sizeof(s) / sizeof(s[0]));

return 0;

}***

***鍊錶:

#include struct node

;//前加

void push_front(struct node *phead, int n)

//判斷是否為空

int isempty(struct node *phead)

//後加

void push_back(struct node *phead, int n)

while(p ->next != null)

p ->next = pnew;

}//前刪

void pop_front(struct node *phead)

struct node *p = phead ->next;

phead -> next = p -> next;

free(p);

}//後刪

void pop_back(struct node *phead)

else if(length(phead) == 1)

else

free(p->next);

p->next = null; }}

void showlist(struct node *phead)

puts("\b ");

}//找節點

size_t findnode(struct node *phead)

return couter;

}int main(void)

; struct node *phead = &head;

/* push_front(&head, 4);

push_front(&head, 3);

push_front(&head, 2);

push_front(&head, 5);*/

push_front(&head, 4);

push_back(phead, 3);

push_back(phead, 2);

push_back(phead, 5);

pop_front(phead);

showlist(&head);

printf("%d\n", findnode(&head));

pop_front(phead);

return 0;

}

結構體 共用體 列舉

結構體 共用體 列舉 分析 首先宣告的結構體元素year的位址是最低的 0012ff74 而最後宣告的day的位址是最高的 0012ff7c 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...

列舉,結構體,共用體

列舉的定義 enum log level dbg,inf,war,err,fat,all,offvoid writeinfor log level level switch level case dbg printf d n dbg 上述定義的列舉型別,預設為dbg 0,inf 1,依次類推。1 列...

結構體 共用體 列舉

一 結構體 1.結構體和類一樣定義時最後要加分號 2.結構體型別定義變數時struct關鍵字不能省略 3定義好的結構體,系統對之不分配儲存單元 4.c99標準允許對某一成員初始化 5.不能企圖輸出結構體變數名來達到輸出結構體的目的 6.同類結構體間可以相互賦值 二 共用體 1.幾個不同的變數共享同一...