为函数中的指针分配新地址是不可能的?

时间:2015-09-04 19:58:01

标签: c function pointers parameter-passing

我有一个编程任务,我偶然发现了这个小问题:当我给一个函数一个指针作为参数时,我无法改变它指向的地址。我通过返回新地址解决了这个问题,我希望指针指向。但我仍然想知道为什么它不可能操纵指针参数,因为所有内存分配函数也使用返回值而不是参数列表。

我可能做错了吗?或者是否真的无法改变指针?有人有解释吗?

示例:

void foo(int *ptr)
{

     ptr=malloc(sizeof(int));

} /* after calling this function I would
expect the pointee to have changed to the
newly allocate memory but it stays NULL*/

int main()
{
     int *ptr=NULL;
     foo(ptr);

     return 0;
}

2 个答案:

答案 0 :(得分:1)

这是因为所有参数都是按C 中的值传递的。如果使用指针参数调用函数,则可以更改函数中的指针,但这对调用者的指针值有无效

如果您需要将修改后的指针传回给调用者,返回修改后的指针是可行的方法。请注意,此仅传回一个值。

另一种方法是传递指针的地址(即指向指针的指针)。然后,被调用函数可以在给定地址存储新的指针值。

答案 1 :(得分:0)

内存分配函数返回指针值,所以通常是 分配给指针。

将指向函数的指针作为参数传递是另一回事, 因为更改它不会改变原始值(按值传递)。那是 为什么我们在这些情况下使用指针来给出变量的地址 并在函数中更改其值。

如果您需要传递指针,并更改指向的指针,请使用 指向指针的指针!

void
my_function(int **pointer)
{
    *pointer = &something;  // will change the pointer address
}

int *my_pointer = &something_else;
my_function(&my_pointer);