C 語言中的結構體與函數

你好,未來的編程大師!今天,我們將踏上一段令人興奮的旅程,探索 C 語言中的結構體和函數。作為你們親切友善的計算機科學老師,我會帶著大量的範例和解釋來引導你們進行這次冒險。所以,拿起你的虛擬背包,讓我們一起深入探討吧!

C - Structures and Functions

什麼是結構體?

在我們開始像傳熱山芋一樣傳遞結構體之前,讓我們先了解一下它們是什麼。在 C 語言中,結構體就像一個容器,可以存放不同類型的數據。想像你正在為旅行打包 - 你可能會有一個行李箱(結構體),裡面裝著你的衣服、洗漱用品,還有一本好書(不同的數據類型)。

以下是如何定義一個簡單的結構體:

struct Student {
char name[50];
int age;
float gpa;
};

這個 Student 結構體可以存放一個名字(作為字符串)、年齡(作為整數)和平均學業成績(作為浮點數)。很棒吧?

如何傳遞結構體元素

現在,讓我們看看如何傳遞結構體的單個元素給函數。這就像請你的朋友從你的行李箱中只拿你的牙刷,而不是整個行李箱。

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void printAge(int age) {
printf("學生的年齡是:%d\n", age);
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printAge(john.age);
return 0;
}

在這個範例中,我們只將我們 Student 結構體的 age 元素傳遞給 printAge 函數。這簡單又直接!

如何傳遞結構變量

但是,如果我們想傳遞整個“行李箱”呢?我們也可以做到!以下是如何將整個結構體傳遞給函數:

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void printStudent(struct Student s) {
printf("姓名:%s\n", s.name);
printf("年齡:%d\n", s.age);
printf("平均學業成績:%.2f\n", s.gpa);
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printStudent(john);
return 0;
}

在這裡,我們將整個 john 結構體傳遞給 printStudent 函數。這就像把整個行李箱遞給你的朋友。

如何從函數返回結構體

現在,讓我們來點花哨的。如果我們想要一個函數創建並返回整個結構體呢?這就像請你的朋友為你打包一個行李箱並把它帶回來。以下是如何操作:

#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

struct Student createStudent(char *name, int age, float gpa) {
struct Student s;
strcpy(s.name, name);
s.age = age;
s.gpa = gpa;
return s;
}

int main() {
struct Student newStudent = createStudent("Jane Doe", 22, 3.9);
printf("已創建新學生:%s,%d 歲,平均學業成績:%.2f\n",
newStudent.name, newStudent.age, newStudent.gpa);
return 0;
}

在這個範例中,我們的 createStudent 函數就像一台學生創造機。你提供細節,它會給你一個打包好的“學生行李箱”!

如何透過引用傳遞結構體

有時候,我們想在函數內部修改原始結構體。這就像請你的朋友在不帶回整個行李箱的情況下,向你的行李箱中添加一些東西。為此,我們使用指針:

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

void updateAge(struct Student *s, int newAge) {
s->age = newAge;
}

int main() {
struct Student john = {"John Doe", 20, 3.8};
printf("John 的年齡之前:%d\n", john.age);
updateAge(&john, 21);
printf("John 的年齡之後:%d\n", john.age);
return 0;
}

在這裡,我們將我們的 john 結構體的地址傳遞給 updateAge 函數。然後,函數使用 -> 運算符直接訪問和修改 age 字段。

如何返回結構指針

最後,讓我們看看如何返回結構指針。當我們處理大型結構體或當我們想要創建的結構體在函數結束後仍然存在時,這非常有用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

struct Student* createStudentPointer(char *name, int age, float gpa) {
struct Student *s = malloc(sizeof(struct Student));
strcpy(s->name, name);
s->age = age;
s->gpa = gpa;
return s;
}

int main() {
struct Student *newStudent = createStudentPointer("Bob Smith", 19, 3.7);
printf("已創建新學生:%s,%d 歲,平均學業成績:%.2f\n",
newStudent->name, newStudent->age, newStudent->gpa);
free(newStudent);  // 記得釋放分配的記憶體!
return 0;
}

在這個範例中,我們的 createStudentPointer 函數就像一個禦者服務。它不僅為你打包行李箱,還記得它放在哪裡,並給你存放的位置(指針)。

結論

好了,各位!我們已經以各種方式打包、解包、修改和創建了結構體。記住,熟能生巧,所以不要害怕嘗試這些概念。誰知道呢?也許你會結構出自己的道路,成為編程界的下一個大人物!

這裡是一個我們所涵蓋方法的快速參考表:

方法 描述
傳遞結構體元素 將結構體的單個字段傳遞給函數
傳遞結構變量 將整個結構體傳遞給函數
從函數返回結構體 從函數創建並返回結構體
透過引用傳遞結構體 使用指針在函數內修改結構體
返回結構指針 在堆上創建結構體並返回其指針

開心地編程,願你的結構總是井井有條!

Credits: Image by storyset