使用双指针作为参数

时间:2013-06-09 08:44:59

标签: c double-pointer

请找到如下所示的代码段:

#include <stdio.h> 

int My_func(int **); 

int main() 
{ 
     int a =5;
     int *p = &a;
     My_Func(&p);
     printf("The val of *p is %d\n,*p);
}

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     *p = Ptr;
}

如何在my_Func函数中使用双指针作为参数并更改值在main函数中反映相同但如果我们在My_Func中使用单个指针则不会更改值在主要?请尽可能用例子解释我

高级谢谢你 麦迪

4 个答案:

答案 0 :(得分:5)

int **p是一个指向int的指针。 My_Func(int **p)通过更改指针指向int的整数值(即int a)来工作。

在不改变实现的情况下,该函数将无法使用指向int的参数int *p,因为存在第二级间接。此外,您将值设置为在堆栈上创建的局部变量。函数完成后,将回收用于变量的内存,因此使a的值无效。

void My_Func(int **p)
{
     int val = 100; // Local variable.
     int *Ptr = &val; // This isn't needed.
     *p = Ptr;
} // val dissapears.

删除第二级间接并按值复制val而不是指向它:

#include <stdio.h>

void My_Func(int *p) 
{
    int val = 100;
    *p = val;
}

int main(void) 
{
    int a = 5;
    My_Func(&a);
    printf("The val of a is %d\n", a);
    return 0;
}

答案 1 :(得分:4)

简而言之,在C中,当您将某些内容作为参数传递时,副本将被传递给该函数。更改副本不会影响原始值。

但是,如果值是指针,则指向的内容可以更改。在这种情况下,如果要影响指针,则需要将指向它的指针传递给函数。

答案 2 :(得分:0)

您正在分配局部变量的地址,当My_Func返回时,它将很快消失。您可以在代码中使用以下内容。但是,只需使用单个指针即可完成相同的操作,本例中不需要双指针。

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     **p = *Ptr;
}

答案 3 :(得分:0)

在函数声明中使用它:

void func(int *p)
{
  int val =100;
  int *temp=&val;
  p=temp;
 }

p开始指向另一个地址,即val的地址。因此它将打印值100。

重要提示:在下载的编译器中尝试(总是在指针的情况下),而不是在在线编译器中。在线编译器不会跟踪堆栈中丢失的地址。