使用双指针作为参数

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

#include  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中使用单个指针不会更改main中的值?请尽可能用示例解释我

高级谢谢
马迪

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

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

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

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

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

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

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

在函数声明中使用它:

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

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

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

您正在分配局部变量的地址,当My_Func返回时,该地址将很快消失。 您可以在代码中使用以下内容。 但是你可以通过使用单个指针来做同样的事情,在这个例子中不需要双指针。

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