C語言結構體詳解


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 StudentStu:

// 定義變量
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用法詳解》閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM