2015-02-12 163 views
1

传递指针地址作为参数的意义何在?例如:传递指针地址作为参数

int *ptr_one; 
ptr_one = (int *)malloc(sizeof(int)); 

然后函数被调用为以下:

func(&ptr_one); 

注意该函数的参数是如下:

func(int **ptr) 
{ 
...... 
} 
+5

对于许多示例之一,当您传递{anything}的地址时,该函数可能会修改调用者的{anything}。这种做法(和你的代码)比C++更C。 – 2015-02-12 00:24:11

+0

一个典型的例子是当你添加一个元素到一个列表中时,你需要传递它的'head'(指针)并且能够修改它。使用单个指针是一个非常常见的错误,会产生很多令人头疼的问题。但是要走的路是C++引用,即通过引用传递指针,如'func(int *&ptr)' – vsoftco 2015-02-12 00:31:43

+0

在现代C++中,我们很少需要指针,所以传递它们(无论如何)很难开始用。 – MSalters 2015-02-12 11:30:37

回答

2

如果你想修改指针本身,那么你需要通过引用或指针地址来传递它。例如,

func(int **ptr) 
{ 
    free(ptr); 

    ptr = new int[2]; //side note: use new instead of malloc in C++ 
         //memory allocated with new is deallocated with 
         //delete 
} 

在C语言中,传递指针的地址是你能分配或释放该指针的内存功能的唯一途径。然而,在C++中,通过引用传递通常会更好。因此,C++版本的代码如下所示:

int *ptr = new int; 
func(ptr); 
delete ptr; 

void func(int *&ptr) { 
. 
. 
. 
} 
+0

我的指针指向一个条目列表,每次我调用它时,函数都会不断修改指针的头部。我想这就是你自己修改指针的意思。对 ? – Anas 2015-02-12 00:42:28

+0

@Anas:是的。如果你只传入'head',那么指针在调用代码中就不会改变,只是在函数中。 – wolfPack88 2015-02-12 00:44:26

2

指针传递到指针的目的是这样的,指针变量可以被修改。

回想一下,从C风格的编码,可以通过传递参数的地址或指针来修改参数。如果该参数是一个需要修改的int,则传递一个指向该整数的指针。同样,如果函数将修改指针参数,它将通过指向指针(或指针地址)的指针传递。