
不起眼
- 前言
- 結構體
- 結構體的宣告
- 結構體變數的定義和初始化
- 結構體大小計算
- 列舉
- 聯合
- 總結
前言
自定義型別連續劇
結構體
結構是一些值的集合,這些值稱為成員變數,結構的每個成員是不同型別的變數,
- 為什么要有結構體
比如說,描述一個學生時,需要有
名字
性別
年齡
身高
來一起描述,需要不同的變數,便有了結構體型別來描述
結構體的宣告
struct tag
{
member-lest//成員串列
}variable-list;//變數串列
例如一個學生
struct stu
{
char name[20];
char sex[5];
int age;
int hight;
};//這里有沒有變數串列都可以

struct stu
{
char name[20];
char sex[5];
int age;
int hight;
}s2,s3,s4;//s2,s3,s4全域變數
struct stu s5;
int main()
{
struct stu s1;//結構體變數
}
- 特殊宣告
在宣告結構體時候,可以不完全宣告
struct
{
char c;
int a;
double a;
}sa;//匿名結構體變數,必須在此處定義變數,否則以后不能使用
int main()
{
return 0;
}

編譯器認為ps和&sa是兩種型別,這種寫法是錯誤的
資料結構:資料在記憶體中存盤的結構

- 關于串列
struct node
{
int date;
struct node next;
};
int main()
{
return 0;
}

這樣無法判斷結構體大小
只需在結構體存放能找到下一個結構體內容的指標即可

struct node
{
int date;
struct node* next;
};
int main()
{
return 0;
}

也可以這樣(重命名使用舉例)
typedef struct node
{
int date;
struct node* next;
}node;
int main()
{
struct node n2 = { 0 };//2者都可以使用
node n = { 0 };//盡量不對結構體使用typedef
}
結構體變數的定義和初始化
struct point
{
int x;
int y;
}p1; //宣告型別同時定義變數p1
struct point p2;//定義結構體變數p2
//初始化:定義變數的同時賦初值
struct point p3 = { 1,2 };
struct stu //型別宣告
{
char name[15];//名字
int age; //年齡
};
struct stu s = { "zhangsan",20 };//初始化
struct node
{
int date;
struct point p;
struct node* next;
}n1 = { 10,{4,5},NULL }; //結構體嵌套初始化
struct node n2 = { 20,{5,6},NULL };//結構體嵌套初始化
結構體大小計算
先來觀察下列代碼
#include <stdio.h>
int main()
{
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
//練習2
struct S2
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));
//練習3
struct S3
{
double d;
char c;
int i;
};
printf("%d\n", sizeof(struct S3));
//練習4-結構體嵌套問題
struct S4
{
char c1;
struct S3 s3;
double d;
};
printf("%d\n", sizeof(struct S4));
return 0;
}

發現并不是資料型別大小的簡單相加
存在對齊
如何計算?
首先得掌握結構體的對齊規則:
1. 第一個成員在與結構體變數偏移量為0的地址處,
2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處,
對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值,
VS中默認的值為8
3. 結構體總大小為最大對齊數(每個成員變數都有一個對齊數)的整數倍,
4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整
體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍,
為什么存在記憶體對齊 ?
大部分的參考資料都是如是說的:
1. 平臺原因(移植原因):
不是所有的硬體平臺都能訪問任意地址上的任意資料的;某些硬體平臺只能在某些地址處取某些特
定型別的資料,否則拋出硬體例外,

預告內容
列舉
聯合
總結
現在開始分欄寫博,準備兩個系列,一個是上次的總復習,一個是這次深層掌握的歸納,完結后會有總結篇哦(僅限C語言)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423862.html
標籤:AI
下一篇:三種梯度下降方法與代碼實作
