13

我不明白为什么传递指向函数的指针不会改变传入的数据。如果函数原型看起来像这样:

void func( int *p ); 

而func给p分配了内存,为什么不能在函数外使用呢?我以为指针是地址?

4

5 回答 5

18

虽然这样的事情符合您的期望:

void func(int *p)
{
    *p = 1;
}

int a = 2;
func(&a);
// a is now 1

这不

void func(int *p)
{
    p = new int;
}

int *p = NULL;
func(p);
// p is still NULL

在这两种情况下,该函数都使用原始指针的副本。不同之处在于,在第一个示例中,您尝试操作底层整数,因为您有它的地址,所以它起作用了。在第二个示例中,您直接操作指针,这些更改仅适用于副本

对此有多种解决方案;这取决于你想做什么。

于 2011-01-23T19:47:53.627 回答
5

C 和 C++ 中的参数是按值传递的。这意味着如果参数的类型是指向 的指针int,则函数接收实际指针参数的副本,同时仍然能够更改指向int的。

于 2011-01-23T19:47:58.510 回答
4

真的很难说,你在问什么..

我的猜测-您可以更改指针指向的内存,p但不能“重定向”或删除指针(或分配内存)?如果是这样,请将您的指针作为参考传递:
void func( int &*p )
或者作为
void func( int **p )
能够更改它的双指针(我说的是指针)

于 2011-01-23T19:47:15.723 回答
4

指针地址。如果将指针传递给函数,则该函数可以修改在函数范围之外创建的数据。但是,如果要在函数内部分配内存以供函数外部使用,则需要传入一个双指针。原因是指针是按值传递的,分配给新分配的块的指针分配一个新值。但是当函数返回时,这个新值就会丢失。但是您可以使用此方法来做您需要的事情:

void func(int * * pp)
{
    * pp = new int;
}

因此使用函数:

int * myPointer;
func(& myPointer);
// do stuff with myPointer
delete myPointer;
于 2011-01-24T02:56:25.040 回答
1

我不同意尼古拉的回答。在 C++ 中有两种传递参数的方法。

f(Type Name)

是您的情况,其中Typeint*并且Namep(请注意,int *p实际上意味着int* p)。在这种情况下,您的函数名称内部是您传递给函数的对象的副本。

第二种方式

f(Type & Name)

不进行复制,而是为对象创建别名,以便您可以修改原始对象。

在您的情况下,对象是 type 的指针int*。当您使用第一种语法传递它时,您会得到一个您修改的副本,并且原始指针保持不变。如果要更改原始指针,则应通过引用传递它,因此对于Type =int*Name =p你会得到

f(int*& p)
于 2011-01-23T22:08:06.530 回答