函数获取值:使用返回值还是指针传参更优?
返回值 vs 指针参数:两种获取函数值方式的差异与选择
这是C语言里非常常见的一个疑问,咱们来拆解清楚这两种写法的实质性差异,以及什么时候该用哪种方式~
一、实质性差异
1. 语义与可读性
返回值的写法(example_return())语义更直白:函数的核心作用就是生成并返回一个值,调用者一眼就能看懂“我要从这个函数拿个结果”。
而指针参数的写法(example_ptr(&value)),函数本身的名字和调用方式没法直接体现“我要修改传入的变量”,得看函数实现或者注释才能明白,可读性上弱了一截——尤其是刚接触代码的人,可能会疑惑“为什么要传地址进去?”
2. 返回值的数量限制
C语言的函数只能返回一个值,如果你的函数需要同时输出多个结果,返回值方式就搞不定了,这时候必须用指针参数(或者返回结构体,但结构体本质也是单个值)。比如一个计算矩形面积和周长的函数,就可以传两个指针进去,一次性把两个结果都填进去。
3. 性能与内存(大部分场景可忽略)
对于int这种基础小类型,两种方式的性能几乎没差别:
- 返回值通常会被编译器放在寄存器里,直接读取就行;
- 指针参数需要传递地址,然后解引用赋值,多了一步操作,但这步操作的开销微乎其微。
如果是大型结构体,返回值方式可能会涉及结构体拷贝,但现代编译器有返回值优化(RVO),会自动省去不必要的拷贝,所以也不用太担心。不过如果明确要避免拷贝,用指针传递会更直接。
4. 错误处理的灵活性
很多场景下,函数不仅要返回结果,还要告诉调用者“操作成功了吗?”。这时候:
- 用返回值表示错误状态(比如
0成功,-1失败),然后用指针参数传递真正的结果,是非常常见的做法(比如标准库的scanf()就是这么干的:返回成功读取的个数,结果存在传入的指针里); - 如果用返回值传递结果,错误状态就得靠全局变量或者额外参数来传递,代码会变得更复杂。
二、哪种方式更优?
没有绝对的“最优”,得看你的场景:
- 优先选返回值:当函数的唯一目的就是生成一个单一结果,且不需要额外返回错误状态时,返回值的写法更简洁、易读。比如你的示例代码里,只是要给变量赋值1,
value = example_return()明显比传指针更直观。 - 选指针参数的场景:
- 需要同时返回多个结果时;
- 函数需要返回错误状态,同时输出结果时;
- 操作大型数据结构,且明确要避免拷贝时;
- 遵循某些API的风格约定时(比如一些底层系统函数习惯用指针输出结果)。
内容的提问来源于stack exchange,提问作者lseiller
相关产品推荐
相关产品推荐

