-1

特别是,为什么对参数*param的更改不会传播回函数的调用者,但对参数的更改**param会传播回来?

4

2 回答 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 valuePass 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 回答