为什么我会在C中按值传递函数参数?

c00*_*ter 3 c function pass-by-reference pass-by-value

我正在为我的一些C库工作的C技能除尘.在整理了第一个工作实现之后,我现在正在查看代码以提高它的效率.目前我的主题是通过引用或值传递函数参数.

我的问题是,为什么我会在C中按值传递任何函数参数?代码可能看起来更干净,但它不会总是比通过引用传递效率低吗?

per*_*eal 5

在C中,所有参数都按值传递.通过引用的真正传递是当您看到修改的效果而没有任何明确的间接时:

void f(int c, int *p) {
  c++; // in C you can't change the original paramenter passed like this
  p++; // or this
}
Run Code Online (Sandbox Code Playgroud)

通常需要使用值而不是指针:

int sum(int a, int b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

你不会这样写:

int sum(int *a, int *b) {
    return *a + *b;
}
Run Code Online (Sandbox Code Playgroud)

因为它不安全而且效率低下.效率低,因为还有一个额外的间接.此外,在C中,指针参数建议调用者通过指针修改该值(特别是当指向的类型的大小小于或等于指针本身时).

  • 现在调用者需要为a和b创建变量,不能传递任何常量.调用者还必须决定是否需要`malloc`值或传递变量的地址,并假设该值可能被修改,因为它们不是`const`(可能需要复制值).如果调用者传递"NULL",未初始化的指针和/或指向无效内存位置的指针,则解除引用指针也不安全. (4认同)

Bil*_*l K 5

因为为计算机编码并不像为下一个人编码那样重要.如果您正在传递引用,那么任何读者都必须假设任何被调用的函数都可以更改其参数的值,并且有义务在调用之前检查它或复制参数.

你的函数签名是一个契约,并将你的代码分开,这样你就不必将整个代码库放在脑中,以便理解某些领域的内容,通过传递你正在使下一个人的生活变得更糟的参考你作为程序员最大的工作应该是让下一个人的生活变得更好 - 因为下一个人可能就是你.