先记住一句宇宙真理(C 语言永远不变):
函数传参,默认都是传副本(假盒子)!

你传什么进去,函数都会复制一份,
改假盒子 → 外面真盒子纹丝不动!

一、第 1 种:传值(直接传结构体)

void 函数名(结构体名 变量名) {

}
就是:

void fun(Triplet t) {

}

大白话
把真盒子复制一份,把假盒子传给函数
发生了什么?

你把原件给函数
函数偷偷复印一份
函数拿着复印件乱写乱画
原件一点没变!

特点
**

函数里拿到的是假盒子 函数里怎么改,外面真盒子都不变 只能读,不能改!*

**

void fun(Triplet t) {
t.e1 = 100; // 改假盒子
}

int main() {
Triplet T; // 真盒子
T.e1 = 10;
fun(T); // 传假盒子进去
printf(“%d”, T.e1); // 输出 10,没变!
}

总结 传值 = 传假盒子 = 不能改外面!

二、第 2 种:传指针(传地址)✅ 最常用、最重要 写法

void 函数名(结构体名 *指针名) {

}

就是
void fun(Triplet *t) {

}

不传盒子,只传盒子的门牌号(地址

我不要你的身份证复印件,
我只要你家地址,
我直接去你家改原件!

特点
传的是地址,不是盒子
函数通过地址直接找到真盒子
想修改外面结构体,必须用这种

void fun(Triplet *t) {
t->e1 = 100; // 改真盒子
}

int main() {
Triplet T;
T.e1 = 10;
fun(&T); // 传地址!
printf(“%d”, T.e1); // 输出 100,改成功!

}
超级重点
指针访问成员必须用 ->
超级重点
指针访问成员必须用 ->

*

总结 传指针 = 传地址 = 能改真盒子!

三、第 3 种:传引用(C++ 才有,纯 C 不能用) 写法

void fun(Triplet &t) {

}

大白话
给真盒子起个别名,函数直接用别名操作真盒子
特点
也是改真盒子
写法简单,不用 ->,用 .
❌ 你现在学纯 C 语言 + 数据结构,不能用!

在这里插入图片描述
C 语言函数传参,永远是:传一份复制的!
你把变量传给函数,
函数拿到的永远是复印件,不是原件!

要修改,传指针!
不修改,传值就行!

原件 = 外面真正的结构体变量(真盒子)
复印件 = 函数里拿到的(假盒子)

根本原理

  1. 传值(传结构体)原理

void fun(Triplet t) {
t.e1 = 100;
}

fun(T);

底层发生了什么?(一步一步)
外面有一个真变量 T,
住在地址

0x100

调用 fun(T)
电脑立刻复制一份一模一样的新变量
把复制的这份,放在新的房间

0x200

函数里的 t 用的是 0x200 这个假房间
你改 t.e1 → 改的是 0x200
外面真房间 0x100

完全没被碰

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐