按值传递结构体
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 46 课,共 63 课。
现在你已经知道如何使用结构体和指向结构体的指针,接下来该学习如何将整个结构体传递给函数了。将结构体作为参数传递给函数时,C 使用按值传递,这意味着函数会收到该结构体的完整副本。
下面是接受结构体参数的函数语法:
void functionName(struct StructureName parameterName) {
// 函数体
}以我们熟悉的 Point 结构体为例:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}需要理解的关键概念是,你在函数内部对结构体所做的任何更改都不会影响调用函数中的原始结构体。这是因为函数处理的是数据的副本。
当你想读取或显示 struct 数据,又不想意外修改原始数据时,这种方法很有用。不过,请记住,复制大型 struct 可能会降低内存和性能方面的效率。
挑战
简单编写一个 C 程序,演示如何按值将结构体传递给函数。你的程序应当:
- 定义一个名为
Rectangle的struct,其中包含以下成员:- 一个整数
width,用于存储矩形的宽度 - 一个整数
height,用于存储矩形的高度 - 一个大小为 15 的字符数组
color,用于存储矩形的颜色
- 一个整数
- 编写一个名为
displayRectangle的函数,该函数:- 接收一个
Rectangle结构体作为参数(按值传递) - 按照以下确切格式输出矩形信息:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- 计算并输出面积(宽度 × 高度)
- 接收一个
- 编写一个名为
modifyRectangle的函数,该函数:- 接收一个
Rectangle结构体作为参数(按值传递) - 将矩形的宽度和高度都加倍
- 将颜色改为 "Modified"
- 输出
Inside modifyRectangle function: - 调用
displayRectangle显示修改后的矩形
- 接收一个
- 在 main 函数中:
- 创建一个名为
rect的Rectangle变量 - 从输入中读取宽度、高度和颜色,并将它们赋给结构体成员
- 输出
Original rectangle: - 调用
displayRectangle显示原始矩形 - 使用该矩形调用
modifyRectangle - 输出
After modifyRectangle call: - 再次调用
displayRectangle,以显示原始矩形未发生变化
- 创建一个名为
这个挑战演示了结构体按值传递的关键概念:将结构体传递给函数时,函数会收到该结构体的完整副本。在函数内部进行的任何修改都只会影响副本,不会影响调用函数中的原始结构体。
亲手试试
#include <stdio.h>
#include <string.h>
// TODO: 在这里定义 Rectangle 结构体
// TODO: 在这里编写 displayRectangle 函数
// TODO: 在这里编写 modifyRectangle 函数
int main() {
// 读取输入
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: 创建 Rectangle 变量并赋予输入值
// TODO: 打印 "Original rectangle:" 并调用 displayRectangle
// TODO: 调用 modifyRectangle
// TODO: 再次打印 "After modifyRectangle call:" 并调用 displayRectangle
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器