結構體知識點總結

2021-08-17 02:43:27 字數 1971 閱讀 2669

對於結構體的知識點,我主要分為以下幾點來講解:結構體的宣告、結構體型別的建立、結構體成員的訪問、結構體的初始化、結構體內存對齊、位段。

1.結構體的宣告

struct stu;                  //分號不能丟
2.結構體型別的建立

有兩種建立的方法,第一種:

struct stu;     

struct stu s1 ; //定義了乙個結構體變數s1

第二種:

struct stus2;               //定義了乙個結構體變數s2
3.結構體成員的訪問  ->  點操作符  (.)

建立了結構體變數之後,以上面建立的結構體變數為例,對於結構體變數的訪問如下:

struct stu s1 ;             //定義了乙個結構體變數s1     

strcpy(s1.name,"zhangsan"); //使用 . 訪問name成員

s1.age=20; //使用 . 訪問age成員

4.結構體的初始化

struct stu;  

struct stu s3=; //初始化:定義變數的同時賦初值

struct stu;

n1=,null}; //結構體巢狀初始化

struct stu n2=,null}; //結構體巢狀初始化

5.結構體內存對齊

首先得了解   結構體對齊規則:

1)第乙個成員在與結構體變數偏移量為0的位置處。

2)其他成員變數要對齊到某個數字(對其數)的整數倍的位址處。對其數=編譯器預設的乙個對其數

與該成員大小的較小者。

vs中預設的值是8

linux中預設的值是4

3)結構體總大小為最大對其數(每乙個成員變數都有乙個對其數)的整數倍。

4)如果巢狀了結構體對齊到自己的最大對其數是整數倍處,結構體的整體大小就是最大對齊數(含嵌

套結構體的對齊數)的整數倍。

例如:

struct s1;  

printf("%d\n",sizeof(struct s1));//輸出的是 12 .

struct s2;

printf("%d\n",sizeof(struct s));//輸出的是 8.

總的來說,結構體的記憶體對齊是拿空間來換取時間的做法。

6.位段

位段的宣告和結構是類似的,有兩個不同:

1.位段的成員必須是int 、unsigned int 、或signed int。

2.位段的成員名後邊有乙個冒號和乙個數字。

比如:

struct a;
a就是乙個位段型別。

位段的記憶體分配:

位段的成員可以是int、 unsigned int 、 signed int或者是char(屬於整型家族)型別

位段的空間上是按照需要以4個位元組(int)或者1個位元組(char)的方式來開闢的。

位段涉及很多不確定因素,位段是不跨平台的,注意可移植的程式應該避免使用位段。

位段的跨平台的問題

int位段被當成有符號數還是無符號數是不確定的。

位段中最大位的數目不能確定。(16位機器最大16,32位機器最大32,寫成17,在16位機器會出問題。)

位段中成員在記憶體中從左到右分配,還是從右到左分配標準尚未定義。

當乙個結構包含倆個位段,第二個成員位段比較大,無法容納第乙個位段剩餘的位時,是是捨棄還是利用,這是不確定的。

總結:跟結構相比,位段可以達到同樣的效果,但是可以很好的節省空間,但有跨平台的問題存在。

知識點總結 7 結構體

if a 0 推薦 a 1 逼近條件 變數意義單一函式意義單一 資料區存放 全域性變數 靜態區域性 全域性變數 字串常量 區 堆區 棧區編譯時進行型別檢查 陣列名 例外 1 siezof 整個大小 首元素位址 函式在棧幀中退出時 棧幀被 但其中的資料還有殘留 只有在另乙個函式需開闢此棧幀前 wind...

結構體知識點梳理

typedef struct teacher teacher int main strcpy t0.name,t1name t1.操作符 定址操作,計算name相對於大變數的偏移量,在cup中計算,沒有操作記憶體 通過指標的方式 操作 記憶體空間 teacher p null p t0 printf...

結構體的簡單知識點

包括結構體的基本知識 結構體的記憶體對齊原理 結構體巢狀和結構體指標 include include struct 是乙個c語言的乙個關鍵字,用來宣告乙個結構體型別 宣告了乙個名字叫 student 的結構體型別 有兩個成員,分別是整型的 id 學號 字元陣列 name 名字 struct 只是宣告...