特别是,为什么对参数*param
的更改不会传播回函数的调用者,但对参数的更改**param
会传播回来?
问问题
83 次
2 回答
2
在这两种情况下,更改都会传播,但这取决于调用函数。
看下面的案例(因为你没有给出任何代码,所以我假设一个一般情况)
著名的交换功能
int a=5,b=10;
swap(&a,&b) // Calling by address
void swap(int *paramA,int *paramB)
{
// Do the swap
}
您会看到,即使仅在函数定义中*params
,更改也会反映回调用环境。
但在其他情况下*param
可能无法反映何时通过值,手段,
看到这段代码,
int a;
int *p = &a;
foo(p); // calling by value
void foo(int *param)
{
// if you do anything or change param to point to some other memory location
// then it will not be reflected back and p still be pointing to a.
}
而如果你这样做
foo(&p); //calling
void foo(int **param)
{
// if you do anything or change param to point to some other memory location
// then it must be reflected back in calling environment.
}
这些东西Pass by value
在Pass by Address
调用C
函数时被调用。
我希望你明白了。
于 2012-12-19T09:22:14.743 回答
1
int param
是一个变量,即数据。
int * param
是指向变量的指针,即数据的内存地址。
int * * param
指针是一个指向变量的指针,即一个内存地址的内存地址的数据。
等等。
当使用变量作为参数调用函数时,该参数被复制到堆栈(按值调用)。函数对其参数所做的任何更改实际上都是在副本上完成的,当函数返回时,副本与堆栈帧的其余部分一起被销毁。
void foo( int x )
{
x = 23; // any changes done on x are strictly local
}
int main()
{
int a = 42;
foo( a ); // no matter what foo() does, a will still be 42.
return 0;
}
如果您将指向变量的指针作为参数传递给函数,它同样会被复制 - 但内存地址的副本仍然指向相同的内存地址,因此函数可以访问该内存地址(即原始变量,而不是它在堆栈上的副本)。函数对该内存地址的内容所做的更改会影响函数的调用者。
void foo( int * x )
{
*x = 23; // changing the contents of the memory address pointed to by x
}
int main()
{
int a = 42;
foo( &a ); // passing the address of a; a will be changed to 23.
return 0;
}
你应该可以自己从那里拿走它。
于 2012-12-19T09:27:36.663 回答