C - 结构体数组
你好,有抱負的程序员們!今天,我們將踏上一段令人興奮的旅程,進入C程式設計的世界,特別是探索結構體數組。別擔心你對程式設計還是新手;我會以多年來在課堂上使用的同樣耐心和熱情引導你走過每一步。讓我們一起來看看吧!
結構體和數組是什麼?
在我們跳進結構體數組之前,讓我們快速複習一下結構體和數組各自是什麼。
結構體
在C語言中,結構體就像一個容器,可以存放不同類型的數據。想像一下一個背包,你可以在其中存放各種物品 - 那就是你的結構體!例如:
struct Student {
char name[50];
int age;
float gpa;
};
在這裡,我們的Student
結構體可以存放一個名字、年齡和GPA。很棒吧?
數組
另一方面,數組是同一類型項目的集合。想像一下一排相同的鎖櫃,每個鎖櫃都存放同種類的物品。例如:
int numbers[5] = {1, 2, 3, 4, 5};
這個名為numbers
的數組可以存放5個整數。
現在,如果我們將這兩個概念結合起來會怎麼樣?那就是魔法的發生!
結構體數組
結構體數組正如其名 - 一個數組,其中每個元素都是一個結構體。這就像有一個滿是學生的教室,每個學生都有自己的特點。
讓我們探討一下如何使用這些強大的構造!
聲明結構體數組
要聲明一個結構體數組,我們首先定義我們的結構體,然後創建一個該結構體類型的數組。這是它的樣子:
struct Student {
char name[50];
int age;
float gpa;
};
struct Student class[30];
在這個例子中,我們創建了一個名為class
的數組,可以存放30個學生的信息。這就像有30個學生卡片,每個都包含名字、年齡和GPA。
初始化結構體數組
現在,我們已經聲明了我們的數組,讓我們用一些數據填充它。我們可以通過兩種方式來做到這點:
- 在聲明時初始化:
struct Student class[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
- 在聲明後初始化:
strcpy(class[0].name, "Alice");
class[0].age = 20;
class[0].gpa = 3.8;
strcpy(class[1].name, "Bob");
class[1].age = 22;
class[1].gpa = 3.5;
// ... 然後依此类推
記住,當在C語言中處理字符串時,我們使用strcpy
來將值分配給字符數組。
讀取結構體數組
從結構體數組中讀取是直接了當的。我們可以使用數組索引和結構成員的點運算符來訪問個別元素:
printf("學生名字: %s\n", class[0].name);
printf("學生年齡: %d\n", class[0].age);
printf("學生GPA: %.2f\n", class[0].gpa);
我們也可以使用循環來讀取整個數組:
for (int i = 0; i < 3; i++) {
printf("學生 %d:\n", i+1);
printf("名字: %s\n", class[i].name);
printf("年齡: %d\n", class[i].age);
printf("GPA: %.2f\n\n", class[i].gpa);
}
這段代碼將打印我們class
數組中所有三個學生的信息。
對結構體數組進行排序
對結構體數組進行排序要複雜一些,但別擔心 - 我們會一步步分解。讓我們假設我們要按照學生的GPA從高到低對學生進行排序:
#include <string.h>
void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}
void sortByGPA(struct Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].gpa < arr[j+1].gpa) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
// 使用方法:
sortByGPA(class, 3);
這段代碼使用冒泡排序算法來排列我們的學生基於他們的GPA。調用sortByGPA
後,class
數組將會以最高GPA為首進行排序。
聲明指向結構體數組的指針
指針是C語言中的強大工具,我們也可以將它們與我們的結構體數組一起使用。這是怎樣聲明指向結構體數組的指針:
struct Student *classPtr = class;
現在,classPtr
指向我們class
數組的第一個元素。我們可以使用這個指針來訪問元素:
printf("第一個學生的名字: %s\n", classPtr->name);
printf("第二個學生的年齡: %d\n", (classPtr+1)->age);
注意在使用指向結構的指針時使用箭頭運算符(->
)。
結論
恭喜你!你剛剛在C程式設計的旅程中迈出了重要的一步。結構體數組在現實世界的編程場景中非常有用。想像一下管理學校數據庫、組織圖書館目錄或跟踪商店庫存 - 所有這些任務在有了結構體數組後都會變得更加容易。
記住,熟能生巧。嘗試創建你自己的結構體數組,用數據填充它們,對它們進行排序,並嘗試不同的方法來操作數據。在你還沒有察覺之前,你將會像專家一樣構建你的代碼!
快樂編程,願你的數組總是正確索引!
Credits: Image by storyset