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

Assigning a new adress to a pointer in a function not possible?

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

我是不是做错了什么?还是真的无法改变指针?有人有解释吗?

示例:

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;
}

内存分配函数return指针值,所以一般是 分配给一个指针。

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

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

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

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

因为在C中所有的参数都是按值传递的。如果您调用带有指针参数的函数,您可以在函数中更改该指针,但这对调用者的指针值没有影响

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

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