目錄
結構體
結構體的聲明
定義結構體變量
訪問結構體成員進行初始化
通過結構體變量名訪問結構體成員
結構體指針
結構體指針的定義
通過結構體指針訪問結構體成員
結構體數組
結構體數組的定義
遍歷結構體數組
結構體的長度(筆試重點)
上一篇復習了最后6道編程題,這一節開始復習結構體的內容。
說明:我們學過單片機的一般都是有C語言基礎的了,網上關于C語言的資料有很多,大家如果對C語言不熟悉的話可以先去詳細學一下,再以這篇博文作為復習資料學習。
這篇博文的目的是復習C語言,我們會陸續以30多個編程題作為復習要點,這30多個編程題基本涵蓋了C語言所有的內容了,只要你掌握了這30多個編程題,那么你的C語言基本就沒什么問題了。
注意:由于本專欄是嵌入式全棧開發專欄,為了我們能熟悉以后實際工作中的開發環境,我們寫C語言全部在Linux中的vim編輯器中寫,這么做事為了我們能夠熟練掌握Linux系統的常用命令以及Linux上的vim編輯器的常用工作命令,以達到對口訓練的目的!
vim編輯器的一些工作命令在上一篇博文中已經詳細介紹過了,如果不了解可以先去看看。
我們正式開始:
結構體
為什么要學習結構體?
我們以往存儲數據都是用數組來存儲的,但是數組有個缺點就是存儲的數據的類型必須是一樣的。如果我們想要存儲一個人的信息,比如,身高、年齡等,身高是浮點型,年齡是整型,那這種數據用數組來存儲是不行的,因此我們需要學習結構體。
結構體的聲明
struct的語法格式如下:
struct ?結構體名 {成員表列}; //分號不能丟
比如:
struct student
{
????????int num;
????????char name[20];
????????float score;
????????char addr[30];
} ; //注意:這個分號不能丟
注:struct是一個關鍵字,結構體內部的各變量為結構體成員。
結構體聲明后之后可以定義結構體變量:
定義結構體變量
例如:struct student s1;
定義結構體變量初始化
和其它類型變量一樣,對結構體變量可以在定義時指定初始值。
例如:struct student s2={“jack”,1,’m’};
訪問結構體成員進行初始化
通過結構體變量名訪問結構體成員
我們前面的s1沒有初始化,如果你想要讓它初始化時,可以通過“結構體變量名.成員名”來訪問結構體中的成員,例如:s1.id=2; s1.sex=’f’;
注意:如果要通過結構體變量名來訪問數組成員進行初始化,不能直接寫成s1.name=”tom”;//這樣寫等價于char name[32];name=”aaa”;由于name數組名是個地址常量,因此不能被修改。
可以這樣寫:strcpy(s1.name,”tom”);
也可以在結構體聲明時直接初始化:
struct Books
{
???char ?title[50];
???char ?author[50];
???char ?subject[100];
???int ??book_id;
} book = {"C 語言", "RUNOOB", "編程語言", 123456};
如果嫌結構體的聲明部分太長,可以將結構體聲明改個名字:
例如:
typedef struct Books
{
???char ?title[50];
???char ?author[50];
???char ?subject[100];
???int ??book_id;
}stu?;
這樣我們就把
struct Books
{
???char ?title[50];
???char ?author[50];
???char ?subject[100];
???int ??book_id;
};
這么一大串改成了stu。
通過結構體變量名輸出結構體成員,只能一位一位輸出,例如:printf(“%s %d %c\n”,s1.name, s2.id, s1.sex);
結構體指針
結構體指針的定義
結構體指針應該指向結構體變量,我們要先申請一塊內存給結構體變量,然后再讓結構體指針指向這塊內存。
stu?*ps=(stu*)malloc(sizeof(stu)*1);
通過結構體指針訪問結構體成員
通過“結構體指針變量名->成員名”來訪問結構體成員并初始化
ps->id=3;
ps->sex=’m’;
注意:如果是訪問數組成員,應寫成strcpy(ps->name,”boy”);
如果要通過指針輸出結構體成員,應該寫成例如:printf(“%s %d %c\n”,ps->name, ps->id, ps->sex);
結構體數組
結構體數組的定義
數組中的每個元素都是一個結構體
例如:
stu s3[5]={{“aa”,4,”f”},{”bb”,5,’f’}};
遍歷結構體數組
int i;
for(i=0;i<5;i++)
{
????????printf(“%s %d %c\n”,s3[i].name,s3[i].id,s3[i].sex);
}
結構體的長度(筆試重點)
計算結構體的長度有兩個原則:
- 結構體的總長度一定是最長成員的數據類型的整數倍;
- 每個成員的偏移量一定是該成員長度的整數倍;
例如:
struct test
{
int a;
int b;
char c;
char d;
} ;
這樣運行出來的結果是12
因為該結構體有4個成員,要保證結構體的總長度一定是最長成員的數據類型的整數倍,因此要在后面補兩個字節。
如果我們將該結構體成員調整一下順序,
例如:
struct test
{
int a;
char c;
int b;
char d;
} ;
這樣運行出來的結果是16
因為char后面是int,為了保證int偏移量是自己的整數倍,因此char后面要空出三個字節,然后又由于int是最長成員,為了保證int總長度是int的整數倍,因此在后面補3個字節,所以總長度是16
但是筆試的時候會有更加復雜的情況,比如結構體中嵌套結構體
例如:
struct test 2
{
int z;
struct test t;
char e;
};
注意:不要以為總長度是struct test t長度的整數倍,我們計算的時候還是要把struct test t拆開,最長成員還是int。計算的時候要保證struct test t在內存中的完整性,不能拆開。
這樣運行的結果是24
以上就是這篇內容,如想了解更多,歡迎訂閱本專欄!
如有問題可評論區或者私信留言,如果想要進交流群請私信!