對於結構體的知識點,我主要分為以下幾點來講解:結構體的宣告、結構體型別的建立、結構體成員的訪問、結構體的初始化、結構體內存對齊、位段。
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 只是宣告...