C語言中為什么會有結構體
主要是基本數據類型沒有辦法展現我們需要的實體。比如我們要表現一個實體————人,那么我們需要姓名name,年齡age,性別sex,家庭關系如父母parent等等。
C語言如何定義結構體
在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:
struct 結構體名{
結構體所包含的變量或數組
};
結構體是一種集合,它里面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員(Member)。請看下面的一個例子:
struct Person {
char* name; // 姓名
int age; // 年齡
int sex; // 姓名
struct Person* parent; // 父母
};
注意點1:以分號結尾
注意大括號后面的分號;不能少,這是一條完整的語句。
如果不加這個分號,會出現編譯錯誤: error C2628: “Person”后面接“int”是非法的(是否忘記了“;”?)
注意點2:結構體成員類型為自身
當結構體內的成員變量的類型是自身時,需要用指針。
比如Person中引用Person類型的變量parent,此時需要用指針來保存引用。否則會出現編譯錯誤:error C2460: “Person::parent”: 使用正在定義的“Person”
C語言結構體的大小
我們先在32位編譯模式下編譯以下程序:
#include <stdio.h>
#include <stdlib.h>
struct A {
char c1;
char c2;
int i;
};
struct B {
char c1;
int i;
char c2;
};
int main()
{
printf("Size of A: %d bytes.\n", sizeof(struct A));
printf("Size of B: %d bytes.\n", sizeof(struct B));
struct A a = {'a', 'b', 1024};
printf("&a.c1:0x%08X\n&a.c2:0x%08X\n&a.i:0x%08X\n", &a.c1, &a.c2, &a.i);
struct B b = {'A', 65536, 'B'};
printf("&b.c1:0x%08X\n&b.i:0x%08X\n&b.c2:0x%08X\n", &b.c1, &b.i, &b.c2);
system("pause");
return 0;
}
&是取地址符,可以獲取變量的內存地址%08X表示以16進制表示,字母大寫,最小寬度為8,如果不足8位,以0補足。
一次實驗的輸出結果如下:

- 結構體A與結構體B的大小不等。結構體A的大小為8字節,結構體B的大小為12字節。

- 上圖中一個單元格表示一個字節單元;
- 每個字節單元都對應一個內存地址;
- 內存地址由下向上依次增加;
成員的獲取與賦值
1. 定義變量
struct Person person1;
2. 給結構體成員賦值
struct Person person1;
person1.age = 10;
3. 訪問結構體成員
printf("%d", person1.age);
4. 整體賦值
之前用到的這兩條語句就是整體賦值的例子:
struct A a = {'a', 'b', 1024};
struct B b = {'A', 65536, 'B'};
- 不過整體賦值僅限於定義結構體變量的時候,在使用過程中只能對成員逐一賦值,這和數組的賦值非常類似。
5. 定義結構體和定義變量結合
struct Student {
char *name; //姓名
int num; //學號
int age; //年齡
char group; //所在小組
float score; //成績
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };
上面這段代碼相當於把定義結構體和定義變量的代碼組合起來了:
// 定義結構體Student
struct Student {
char *name; //姓名
int num; //學號
int age; //年齡
char group; //所在小組
float score; //成績
};
並且,變量stu1沒有賦值,而變量stu2進行了整體賦值:
// 定義變量
struct Student stu1;
struct Student stu2 = { "Tom", 12, 18, 'A', 136.5 };
typedef struct
typedef struct Student {...} Stu;與struct Student {...} stu;不同,前者Stu表示的是類型(相當於Student的別名),后者stu表示的是變量;typedef struct Student {...} Stu;相當於定義結構體語句struct Student {...};與定義類型語句typedef Student Stu;的組合;struct Student {...} stu;相當於定義結構體語句struct Student {...};與定義變量語句Student stu的組合;
我們再來看一個 typedef struct 的復雜例子:
typedef struct Student {
char *name; //姓名
int num; //學號
int age; //年齡
char group; //所在小組
float score; //成績
} Stu, *PStu;
此時,我們可以簡化 struct Student 為 Stu:
// 定義變量
Stu stu1;
Stu stu2 = { "Tom", 12, 18, 'A', 136.5 };
這就等同於:
// 定義變量
struct Student stu1;
struct Student stu2 = { "Tom", 12, 18, 'A', 136.5 };
然后,我們可以用 PStu 來表示指針類型:
PStu stu1 = (PStu)malloc(sizeof(Stu));
stu1->age = 11;
上面這段代碼就等同於
Stu* stu1 = (Stu*)malloc(sizeof(struct Student));
stu1->age = 11;
Learn More
《C語言結構體詳解,C語言struct用法詳解》閱讀
