《C語言結構體史上最詳細的講解》

2021-09-03 08:22:07 字數 4843 閱讀 5587

我們知道,在c語言中有一些基本的資料型別,如

結構體的宣告語法如下

struct

[structure tag]

/*結構體的標籤*/

[one or more structure variables]

;/*乙個或多個結構體變數的定義*/

結構體標籤(structure tag)是可選的,但是推薦還是寫上,這樣使得**更加規範清晰,成員變數的定義一般為基本資料型別,如int age;char name[10]等,成員變數之間使用;隔開,最後乙個成員變數後面的;可選, 如下面定義乙個圖書資訊的結構體變數

struct books  book;
如下所示

struct books  book;
我省略了最後乙個成員變數後面的分號;**可以正常執行,但是當我使用gcc編譯的時候,出現了下面資訊

gcc struct.c
output

struct.c:8:1: warning: no semicolon at end of struct or union

} book;

^

這是警告提示,提示我們需要在structunion資料型別定義的後面加上分號;,這樣的好處就是當我們需要再新增乙個成員變數的時候,只需寫上該成員變數的定義,而無需先敲;,我太機智了,手動滑稽…

沒有成員變數的結構體

我們也可以定義乙個空的結構體,有時候我們需要某乙個結構體資料型別,但是暫時又不知道如何填充裡面的成員變數,我們可以有如下定義

struct books  book;
定義完結構體積後接下來就是去訪問它並給他賦值,為了訪問乙個結構體成員變數,我們可以使用成員操作符(.)成員訪問運算子被編碼為結構變數名稱和我們希望訪問的結構成員之間的句點(.)如下所示的完整**

struct.c

#include

#include

struct books

;int

main()

編譯並執行

gcc struct.c && ./a.out
輸出

book 1 title : c programming

book 1 author : nuha ali

book 1 subject : c programming tutorial

book 1 book_id : 6495407

book 2 title : telecom billing

book 2 author : zara ali

book 2 subject : telecom billing tutorial

book 2 book_id : 6495700

同樣的,我們也可以像基本資料型別一樣,把結構體作為函式的引數,如下所示我們定義乙個列印結構體的函式

#include

#include

struct books

;/* function declaration */

void

printbook

(struct books book )

;int

main()

void

printbook

(struct books book )

編譯執行

gcc struct.c && ./a.out
輸出

book 1 title : c programming

book 1 author : nuha ali

book 1 subject : c programming tutorial

book 1 book_id : 6495407

book 2 title : telecom billing

book 2 author : zara ali

book 2 subject : telecom billing tutorial

book 2 book_id : 6495700

我們也可以定義結構體指標,像這樣

struct books *struct_pointer;
現在你可以存放結構體變數的位址在結構體變數指標中.和基本資料型別的變數一樣,我們使用&操作符取乙個變數的位址

struct_pointer =

&book1;

接下來就是使用結構體指標去訪問成員變數了,訪問的操作符我們由原來的.變為->,沒錯,這個是不是很形象呢?完整**如下

#include

#include

struct books

;/* function declaration */

void

printbook

(struct books *book )

;int

main()

void

printbook

(struct books *book )

編譯執行

gcc struct.c && ./a.out
輸出

book 1 title : c programming

book 1 author : nuha ali

book 1 subject : c programming tutorial

book 1 book_id : 6495407

book 2 title : telecom billing

book 2 author : zara ali

book 2 subject : telecom billing tutorial

book 2 book_id : 6495700

#include

#include

struct books

;/* function declaration */

void

printbook

(struct books *book )

;int

main()

void

printbook

(struct books *book )

編譯執行

gcc struct.c && ./a.out
輸出

book 1 title : c programming

book 1 author : nuha ali

book 1 subject : c programming tutorial

book 1 book_id : 6495407

book 2 title : telecom billing

book 2 author : zara ali

book 2 subject : telecom billing tutorial

book 2 book_id : 6495700

沒錯,估計你已經知道了,結構體變數的所占用記憶體空間的大小為各成員變數所佔空間之和,如下所示的結構體占用記憶體大小在注釋裡面

#include

#include

struct books

;int

main()

#include

#include

struct books

;int

main()

有時候我們記憶體緊張的時候,我們可以使用位域定義結構體成員變數,比如當我們需要定義乙個表示truefalse的時候,如果想這樣定義

int isopen;
明顯很浪費空間,因為乙個真假值只需要乙個字位表示,所以我們可以這樣定義

unsigned

int isopen:

1;

但是如果你直接寫在函式中是會報錯的,我們應該寫在結構體中

int

main()

正確姿勢

struct packed_struct  pack;
c盡可能緊湊地自動打包上述位欄位,前提是字段的最大長度小於或等於計算機的整數字長。如果不是這種情況,那麼一些編譯器可能允許字段儲存器重疊,而其他編譯器會將下乙個字段儲存在下乙個字中。

#include

#include

struct packed_struct pack;

intmain()

輸出結果

8

史上最詳細webpack講解

webpack是前端方面的靜態資源打包工具,能夠讓瀏覽器也支援模組化,他會根據模組的依賴關係進行靜態分析,然後按照某種規則生成靜態資源 安裝webpack 安裝webpack npm install g webpack 或者 安裝最新版webpack npm install g webpack 如果...

史上最詳細的C 函式指標

每乙個函式都占用一段記憶體單元,它們有乙個起始位址,指向函式入口位址的指標稱為函式指標 指向函式的指標變數的一般定義形式為 資料型別 指標變數名 參數列 1 函式指標的定義形式中的資料型別是指函式的返回值的型別。2 區分下面兩個語句 int p int a,int b p是乙個指向函式的指標變數,所...

史上最詳盡的LCT講解

摘自popoqqq 優秀的學姐 lct能幹嘛 1 維護乙個序列,支援下列操作 區間求和 區間求最值 區間修改 求連續子段和 這個線段樹就可以解決 具體做法不加累述了 2 維護乙個序列,支援下列操作 區間求和 區間求最值 區間修改 求連續子段和 新增一段區間 刪除一段區間 翻轉一段區間 splay的基...