什么是在C中传递的byValue和byReference参数?
这个问题在这里已经有了答案:
除了数组和函数(见下文)之外,C总是通过`value'传递参数:每个参数值的一个副本被传递给函数; 该函数不能修改传递给它的实际参数:
void foo(int j) {
j = 0; /* modifies the copy of the argument received by the function */
}
int main(void) {
int k=10;
foo(k);
/* k still equals 10 */
}
如果你想要一个函数来修改它的参数,你可以使用指针参数来获得所需的效果:
void foo(int *j) {
*j = 0;
}
int main(void) {
int k=10;
foo(&k);
/* k now equals 0 */
}
这有时被称为其他语言中的“通过引用传递”。
在c语言中没有引用
按值传递:意味着您正在创建变量的临时副本并发送给参数。
通过引用传递(在c语言中没有这样的概念) :意味着您只是在调用时给原始变量另一个名称,并且没有创建临时副本。
按价值调用:
int foo(int temp)
{
/.../
}
int main()
{
int x;
foo(x); /* here a temporary copy of the 'x' is created and sent to the foo function.*/
}
通过引用调用(在c语言中没有这样的概念)
int foo(int& temp)
{
/.../
}
int main()
{
int x;
foo(x); /* here no temporary copy of 'x' is being created rather the variable *temp* in the calling function is just another name of the variable a in the main function*/
}
按价值传递参数意味着您正在传递副本:
void f(int x)
{
x = 7;
// x is 7 here, but we only changed our local copy
}
void g()
{
int y = 3;
f(y);
// y is still 3 here!
}
通过引用传递参数意味着你没有传递一个副本,而是通过某种方式引用原始变量。 在C中,所有的参数都是按值传递的,但通常通过引用来传递相同的效果是传递一个指针:
void f(int *x_ptr) { *x_ptr = 7; }
void g()
{
int y = 3;
f(&y);
// y is 7 here
}
数组的传递方式与传递引用相似,但实际发生的事情更为复杂。 例如:
void f(int a[]) { a[0] = 7; }
void g()
{
int b[3] = {1,2,3};
f(b);
// b[0] is 7 here! looks like it was passed by reference.
}
这里实际发生的是数组b
被隐式转换为指向第一个元素的指针(这被称为衰减)。 参数f
的int a[]
表示法实际上是指针的语法糖。 以上代码相当于:
void f(int *a) { a[0] = 7; }
void g()
{
int b[3] = {1,2,3};
f(&b[0]);
// b[0] is 7 here
}
链接地址: http://www.djcxy.com/p/20615.html