我正在清理我在我的一些C库上工作的C技能。在整理了第一个工作实现之后,我现在正在查看代码以提高它的效率。目前我的主题是通过引用或值传递函数参数。
我的问题是,为什么我会在C中按值传递任何函数参数?代码可能看起来更干净,但它不总是比通过引用传递效率低吗?
答案 0 :(得分:5)
在C中,所有参数都按值传递。通过引用的真正传递是当您看到修改的效果而没有任何明确的间接:
void f(int c, int *p) {
c++; // in C you can't change the original paramenter passed like this
p++; // or this
}
通常需要使用值而不是指针:
int sum(int a, int b) {
return a + b;
}
你不会这样写:
int sum(int *a, int *b) {
return *a + *b;
}
因为它不安全而且效率低下。效率低,因为还有一个额外的间接。此外,在C中,指针参数建议调用者通过指针修改该值(特别是当指向的类型的大小小于或等于指针本身时)。
答案 1 :(得分:5)
因为为计算机编码并不像为下一个人编码那样重要。如果您正在传递引用,那么任何读者都必须假设任何被调用的函数都可以更改其参数的值,并且有义务在调用之前检查它或复制参数。
你的函数签名是一个契约并将你的代码分开,这样你就不必将整个代码库放在脑中,以便通过传递你正在进行下一个领域的引用来理解某些领域的内容。男人的生活更糟糕,你作为程序员的最大工作应该是让下一个人的生活更美好 - 因为下一个人可能就是你。
答案 2 :(得分:1)
请参阅Passing by reference in C。通过引用传递是C中的误称。它指的是传递变量的地址而不是变量,但是您传递指向变量按值的指针。
那就是说,如果你把变量作为指针传递,那么是的,它会稍微提高效率,但主要原因是能够修改它指向的原始变量。如果您不希望这样做,建议您按值进行以明确您的意图。
当然,就Cs较重的数据结构而言,所有这些都没有实际意义。无论你喜欢与否,数组都会通过指针传递给它们的第一个变量。
答案 3 :(得分:0)
有两个原因:
很多时候你必须多次取消引用你传递的指针(想想一个很长的for循环)。您不希望每次想要在该地址查找值时取消引用。直接访问速度更快。
有时您想要修改函数内部的传入值,但不能在调用者中修改。例如:
void foo( int count ){
while (count>0){
printf("%d\n",count);
count--;
}
}
如果您想通过引用传递的内容执行上述操作,您可能需要在函数内创建另一个变量来存储它。