|
|
你说得对!这正是函数参数传递中“值传递”和“地址传递”的关键区别。让我用一个例子来清晰说明这两种情况:
假设我们有一个表示点的结构体:
- #include <stdio.h>
- struct Point {
- int x;
- int y;
- };
复制代码
**情况1:值传递(实参不变)**
当结构体作为普通参数传递时,函数内部得到的是实参的完整副本:
- // 值传递,不会改变实参
- void movePoint1(struct Point p, int dx, int dy) {
- p.x += dx; // 修改的是副本
- p.y += dy;
- printf("函数内:(%d, %d)\n", p.x, p.y);
- }
- int main() {
- struct Point pt = {10, 20};
- movePoint1(pt, 5, 5);
- printf("函数外:(%d, %d)\n", pt.x, pt.y); // pt仍然是(10, 20)
- return 0;
- }
复制代码
输出:
函数内:(15, 25)
函数外:(10, 20)
**情况2:地址传递(实参会改变)**
通过传递结构体指针,可以修改原结构体的值:
- // 传递指针,会改变实参
- void movePoint2(struct Point *p, int dx, int dy) {
- p->x += dx; // 通过指针修改原结构体
- p->y += dy;
- }
- int main() {
- struct Point pt = {10, 20};
- movePoint2(&pt, 5, 5);
- printf("函数外:(%d, %d)\n", pt.x, pt.y); // pt变成了(15, 25)
- return 0;
- }
复制代码
输出:
函数外:(15, 25)
**总结一下:**
* 当结构体作为普通参数(值传递)时,函数内修改的是副本,所以实参不变
* 当传递结构体指针(地址传递)时,函数可以通过指针直接修改原结构体
* 返回值的函数通常用于创建新的结构体或返回计算结果,而不是修改原参数
在实际编程中,如果结构体很大,值传递会造成较大的复制开销,所以通常建议使用指针传递,除非结构体很小或者确实需要副本。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|