結構體知識總結

2021-08-11 05:54:21 字數 2116 閱讀 2837

struct b
關於結構體,我們一定不會陌生,結構體可以說和類的用法類似,但是也有不同之處,總的來說,結構體的使用使我們可以更加方便的儲存和使用資料。我在上面就定義了乙個結構體,裡面有兩個元素,乙個是int型別的,乙個是char型別的,因此,結構體裡面可以放進去不同型別的資料,這跟結構體的空間開闢有很大的關係。

結構體的空間開闢都是一整塊的開闢,所以他的儲存又和陣列中元素儲存類似,不過有一點需要區別的就是,陣列中的元素都是連續存放的,結構體不是的。如果定義乙個指標指向這個結構體,那麼指標的位址一定和結構體的第乙個元素的位址相同,但是,作為不同型別元素的共同儲存空間,結構體裡面的資料存放位址不是連續存放的。還是拿上面的舉例子,char只佔乙個位元組,而int佔四個位元組,當要訪問int型別的資料的時候,位址會出現衝突,因為int型別資料都是每4個4個訪問的,所以,這樣做的話,必須要先訪問char 型別資料的位址,然後才能通過這個位址找到int 的位址,增加了訪問時間,不太推薦這種訪問型別。

這裡就涉及到了記憶體對齊

記憶體對齊簡單點來說,就是要讓結構體當中存放的資料能夠順利的一次就能訪問成功,但是,相對的來說,它會犧牲一點記憶體空間來節省執行時間。

下面舉個栗子

struct fm

在上面,我定義了乙個結構體 fm ,裡面有三個元素,兩個char型別,乙個int型,如果要你計算這個結構體占用的位元組數,你或許會說是6,因為乙個char型別的資料佔乙個位元位,乙個int型別佔4個位元位,那麼加起來不就是6嗎?

其實,想的是麼錯,但是實際上答案是12,為什麼是這樣呢,簡單點說,結構體存在記憶體對齊,出現記憶體對齊有兩個原因

1. 不是所有的硬體平台都能任意訪問任意位址上的任意資料

2.為了訪問未對齊的資料,處理器需要做兩次記憶體訪問

基於這兩點,軟體工程師為了打破硬體的限制以及為了節省訪問時間,所以就提出了記憶體對齊這麼乙個概念。

記憶體對齊有幾條規則,只要掌握了這幾條規則,那麼不管是什麼資料都可以計算清楚到底花費了多少記憶體,那我就把這幾條規則寫在下面吧,雖然有些跑題,不過還是讓你們看看吧

1.第乙個成員在與結構體偏移量為0的位址處

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處    vs預設為8,linux下預設為4

3.結構體總大小為最大對齊數的整數倍

4.如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的  整數倍

好了,關於記憶體對齊,其他的也就不多說了,還是轉回結構體吧

結構體作為乙個特殊的型別,也可以像函式一樣進行巢狀,比如下面的這個例子

struct a     //定義了乙個結構體a

struct b //定義了乙個結構體b

這就是典型的結構體巢狀,但是,有一點問題需要你們注意,在巢狀的時候,因為編譯器並不知道你在後面才定義了乙個結構體b,它會預設不存在結構體b,所以你必須在a之前就定義b,這樣程式才不會報錯,雖然是巢狀,但是a,b裡面的資料還是會原封不動的輸出,不會產生多大影響,除非它內部的資料進行了一些運算。

結構體指標

定義乙個指標指向這個結構體,那麼這個指標就可以通過結構體的位址訪問裡面的元素,這個用法和函式指標的用法類似。因為指標作為一種資料型別,它也有自己的位址,而只要有位址,就可以用乙個指標來訪問其內部元素,當然,這樣也確實比再寫下結構體的一大串**方便多了,我在下面就定義乙個* p指向結構體a

struct a

*p //指向結構體a的指標

這樣做,我想訪問哪個元素,就可以直接訪問到了,十分方便,當然,你也得清楚一點,結構體的位址和第乙個元素的位址一致,要想驗證,只需要%p,就可以取出來位址驗證了。

結構體的自引用

在結構體中還可以包含乙個型別為該結構體本身的成員,這就叫做結構體的自引用,下面,我就舉乙個簡單的例子

struct b

值得注意的是,在進行自引用的時候,必須寫出結構體的名字,然後再用解引用符號*,這樣才可以正確的進行自引用的操作

關於結構體,我就說這麼多啦,前面說的有些贅述,後面就精簡一些了,大佬們,歡迎多交流啊。

結構體相關知識總結

結構體傳參 1.結構體的簡單認識 struct s int main 這是乙個最簡單的結構體傳參,先定義結構體 struct s 然後在主函式中賦值,列印。2結構體進行傳參 傳值和傳址的區別 以下有幾種不同的情況 一.struct s void init struct s tmp intmain i...

結構體知識點總結

對於結構體的知識點,我主要分為以下幾點來講解 結構體的宣告 結構體型別的建立 結構體成員的訪問 結構體的初始化 結構體內存對齊 位段。1.結構體的宣告 struct stu 分號不能丟2.結構體型別的建立 有兩種建立的方法,第一種 struct stu struct stu s1 定義了乙個結構體變...

初學結構體的知識總結

struct student stu1,stu2,stu3 int main 匿名結構體 struct stu1 struct ps int main struct node int main typedef struct node node int main include offsetof的標頭...