使用指针传递引用和值

时间:2011-01-23 19:41:27

标签: c++ pass-by-reference parameter-passing pass-by-value

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

void func( int *p ); 

和func分配内存到p,为什么不能在函数外部使用?我认为指针是地址?

5 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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

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

因此使用func:

int * myPointer;
func(& myPointer);
// do stuff with myPointer
delete myPointer;

答案 4 :(得分:1)

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

f(Type Name)

是你的情况,其中类型int*名称p(请注意,int *p实际上意味着{{1} }})。在这种情况下,您的函数 Name 内部是您传递给函数的对象的副本

第二种方式

int* p

不会制作副本,而是为对象创建别名,以便您可以修改原始对象。

在您的情况下,对象是类型f(Type & Name) 的指针。当您使用第一种语法传递它时,您将获得它的一个副本,您可以修改它并且原始指针保持不变。如果你想更改原始指针,那么你应该通过引用传递它,所以对于 Type = int* Name = int*你'得到

p