怎么做
  1. 题面里的虚线方框就是要填的空
  2. 点候选项,它会填进当前高亮的那个空
  3. 点已填好的空,可以把选项取回来重选
  4. 全部填满后「提交」才会亮起
卡住了就点右下角的 👩‍🏫 问 AI 老师,她会给提示但不直接给答案。

结构体传给函数:复印件还是原件

👁️ 24 人浏览 💬 0 人评论 ❤️ 添加收藏

函数拿到的是复印件,还是原件的地址?

传值 f(a):函数里改的是副本,原件不变

原件 85
副本 90
副本已销毁

传地址 f(&a):函数顺着地址改原件

原件 85

原件 90

←
p->score

结构体可以当函数的参数,有两种传法,效果完全不同:

#include <stdio.h>

typedef struct {
    char name[20];
    int score;
} STU;

void add1(STU s)          /* 传值:s 是 a 的一份复制 */
{
    s.score = s.score + 10;
}

void add2(STU *p)         /* 传地址:p 指向 a 本身 */
{
    p->score = p->score + 10;
}

int main(void)
{
    STU a = {"小林", 70};
    add1(a);
    printf("%d\n", a.score);
    add2(&a);
    printf("%d\n", a.score);
    return 0;
}
  • 传结构体变量 add1(a):形参 s 是整张卡片的复印件,函数结束复印件就销毁,改了也白改。
  • 传结构体指针 add2(&a):函数拿到 a 的地址,用 p->成员 改的就是 a 本身;而且不用复制整张卡片,更省。
  • 只读不改的函数,两种都行;要改原件,就传地址。

程序第一行输出【0】,第二行输出【1】;调用 add2 时实参写的是【2】。

请登录后作答。
去登录
👩‍🏫
AI
💬 题目评论
🔒 登录并作答后可看讨论