首页
/
每日頭條
/
圖文
/
struct結構體使用心得
struct結構體使用心得
更新时间:2026-01-09 16:59:27

By Long Luo

在上一篇大話結構體之一: 從女孩怎麼選男朋友開始...Struct是為了解決什麼問題?裡我們講了為什麼我們要引入Struct這個數據類型,我們了解到Struct是一種聚合數據類型,是為了用戶描述和解釋一些事物的方便而提出的,Struct是一種用戶自定義數據類型,如下圖所示:

struct結構體使用心得(大話結構體之二)1

其實從理論上講,數據類型就是人為制訂的如何解釋内存中的二進制數的協議,也就是說一個數字對應着一塊内存(可能4字節,也可能20字節),而這個數字的類型則是附加信息,以告訴編譯器當發現有對那塊内存的操作語句(即某種操作符)時,要如何編寫機器指令以實現那個操作。比如兩個char類型的數字進行加法操作符操作,編譯器編譯出來的機器指令就和兩個long類型的數字進行加法操作的不一樣,也就是所謂的“如何解釋内存中的二進制數的協議”。

具體到我們之前的例子來說,隻是指定了一種結構體類型,它相當于一個模型,但其中并無具體數據,系統也不為之分配實際的内存單元。為了能在程序中使用結構體類型的數據,應當定義結構體類型的變量,并在其中存放具體的數據。

本篇将詳細對Struct的聲明、定義和初始化進行分析。

一、Struct的聲明

要了解Struct的聲明,我們需要首先了解聲明的含義到底是什麼?

---聲明是要求編譯器産生映射元素的語句

所謂的映射元素,就是前面介紹過的變量及函數,都隻有3欄(或3個字段):類型欄、名字欄和地址欄(成員變量類型的這一欄就放偏移值)。即編譯器每當看到聲明語句,就生成一個映射元素,并且将對應的地址欄空着,然後留下一些信息以告訴連接器——此.obj文件(編譯器編譯源文件後生成的文件)需要一些符号,将這些符号找到後再修改并完善此.obj文件,最後鍊接。

具體到上一回的例子,我們假如在另外一個源文件中需要使用struct ExpectedBoyFriend,那麼就需要在該源文件使用之前處使用下面的聲明語句:

extern struct ExpectedBoyFriend;

二、Struct的定義

上一小節我們了解了聲明的定義,那麼定義是什麼呢?

---定義是要求編譯器填充前面聲明沒有書寫的地址欄。 也就是說某變量對應的地址,隻有在其定義時才知道。

因此實際的在棧上分配内存等工作都是由變量的定義完成的,所以才有聲明的變量并不分配内存。但應注意一個重點,定義是生成映射元素需要的地址,因此定義也就說明了它生成的是哪個映射元素的地址,而如果此時編譯器的映射表(即之前說的編譯器内部用于記錄映射元素的變量表、函數表等)中沒有那個映射元素,即還沒有相應元素的聲明出現過,那麼編譯器将報錯。

在這裡我們需要說下C和C 在定義Struct的區别, 先看下面2段代碼:

#include <iostream> using namespace std; struct SIMPLE { int a; char b; float c; }; SIMPLE x;

再看下面一段源碼:

#include <stdio.h> struct S0 { char mName[10]; int mBornYear; }; typedef struct _S1 { char mName[10]; int mBornYear; } S1; S0 sa; S1 sb;

那麼上面的代碼中對Struct的定義都對了嗎?

熟悉C/C 的同學應該能夠馬上知道第二段的代碼錯了。

為什麼呢?

因為C語言中對于Struct的定義是需要使用struct S0 sa這種方式。

三、C99标準下的Struct的初始化方法

Struct的常見初始化方法我們可以在任何一本關于C語言書裡面都可以找到,這裡就不贅述了。我們先看下面一段代碼:

static struct usb_driver usb_storage_driver = { .owner = THIS_MODULE, .name = \"usb-storage\", .probe = storage_probe, .disconnect = storage_disconnect, .id_table = storage_usb_ids, };

我們在閱讀GNU/Linux内核代碼時,我們會經常遇到上述這樣一種特殊的結構初始化方式,這種方式稱為指定初始化。這種初始化方法源自C99标準。

以下文字摘錄了C Primer Plus第五版中相關章節的内容,從而就可以很好的理解Linux内核采用這種方式的優勢就在于由此初始化不必嚴格按照定義時的順序。

已知一個結構,定義如下:

struct Book { char title[MAXTITLE]; char author[MAXAUTHOR]; float value; };

C99支持結構的指定初始化項目,其語法與數組的指定初始化項目近似。隻是,結構的指定初始化項目使用點運算符和成員名(而不是方括号和索引值)來标識具體的元素。例如,隻初始化book結構的成員value,可以這樣做:

struct Book surprise = { .value = 10.99 };

可以按照任意的順序使用指定初始化項目:

struct Book gift = { .value = 25.99, .author = \"James Broadfool\", .title = \"Rue for the Toad\" };

正像數組一樣,跟在一個指定初始化項目之後的常規初始化項目為跟在指定成員後的成員提供了初始值。另外,對特定成員的最後一次賦值是它實際獲得的值。例如,考慮下列聲明:

struct Book gift = { .value = 18.90, .author = \"hilionna pestle\", 0.25 };

這将把值0.25賦給成員value,因為它在結構聲明中緊跟在author成員之後。新的值0.25代替了早先的賦值18.90。

這一篇内容會比較枯燥,大量的代碼及大段的文字内容可能會讓你比較迷糊,但還是多看看,看懂它們。

我們知道C裡面隻有Struct,而在C 裡面則引入了ClassStruct,那麼我們就要問了,C 中的ClassStruct有什麼區别呢?

答案将在下一篇裡揭曉!

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
魯迅先生有沒有罵過日本人(魯迅從來不罵蔣介石)
魯迅先生有沒有罵過日本人(魯迅從來不罵蔣介石)
     魯迅罵蔣介石為“法斯斯蒂”   中評社北京7月17日電(作者 汪毅夫)近有友人垂問:魯迅從來不罵蔣介石嗎?幷說網上盛傳“魯迅不罵蔣介石”的相關文章。我的回應是:如果“罵”是“批評”的意思,則魯迅罵過蔣介石,我很快就會寫短文說明和證明。同時,我的反應是,從網上搜索,看到了許多“相關文章” :有著名的李敖大師的, 也有不具名的無名氏的;有主張和附議的,...
2026-01-09
樹莓派3和樹莓派3b(測試樹莓派3B:)
樹莓派3和樹莓派3b(測試樹莓派3B:)
        開發能力進一步增強需使用專用電源适配器   -      樹莓派屬于起步很早但配置較低的電子制作模闆之一,很長時間以來性能落後是一大诟病,今天,最新的樹莓派3B型将有助于改變這一尴尬現狀。   樹莓派(Raspberry Pi)是流行的電子制作模闆之一,類似于PC上的準系統,它将除了存儲之外的功能整合在撲克大小的主闆上,剩下的就是系統安裝和軟...
2026-01-09
薩克斯演奏之前的組裝方法(薩克斯演奏技巧探究)
薩克斯演奏之前的組裝方法(薩克斯演奏技巧探究)
     接着,當然要說說吹奏薩克斯的基本方法了:   要成功地演奏好薩克斯管,首先必須訓練自己對音樂的感受力及理解能力,平時要多學習一點薩克斯管以外的理論。薩克斯管的演奏其實包括兩個大部分,其一就是對基本功的訓練,内容包括:好的演奏姿勢、口形、運氣的方法、音色、熟練的指法、清晰敏捷的吐音;其二就是技巧。技巧是建立在基本功的基礎上的,奏效果。一般情況下常用的...
2026-01-09
你真的看懂犬夜叉了嗎(你從沒注意到的暖心時刻)
你真的看懂犬夜叉了嗎(你從沒注意到的暖心時刻)
  《犬夜叉》主要講述的是要與人之間的故事與大部分同類的故事相同,大部分劇情都是以戰鬥為主,但是《犬夜叉》在戰鬥的同時,卻與其他同類動漫有所不同,《犬夜叉》除了暢快淋漓的打鬥以外,還是部非常虐心的作品,劇中《犬夜叉》與桔梗的接吻不知道看哭了多少人,所以《犬夜叉》中很少有熱血,有的隻是各種感人的暖心、虐心瞬間。      有很多瞬間是作者可以表達出來的,但是也...
2026-01-09
武林外傳郭芙蓉裝病要瓜子(郭芙蓉怒砸同福店)
武林外傳郭芙蓉裝病要瓜子(郭芙蓉怒砸同福店)
  《武林外傳》是我回看次數最多的電視劇,也是我最喜歡的電視劇。第一次看的時候隻覺好笑,後面多看幾次才發現編劇其實設了很多伏筆,很有趣。《武林外傳》劇情緊湊有趣,演員表現自然,會揭示深刻的道理但又不是毒雞湯。最近十年這樣優秀的情景喜劇已不多見,盡管之後甯财神又寫了《龍門客棧》,但總覺得少了些味道。所以我計劃做《武林外傳》的系列劇情品讀,除了回憶經典,也一起來...
2026-01-09
Copyright 2023-2026 - www.tftnews.com All Rights Reserved