5

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

#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函数中使用双指针作为参数并更改值在主函数中反映相同但如果我们使用单个指针My_Func不会更改主函数中的值?请尽可能用示例解释我

高级感
谢麦迪

4

4 回答 4

7

int **p是一个指向 int 的指针。My_Func(int **p)通过更改指向 int 的指针指向的整数的值 ie 来工作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;
}
于 2013-06-09T09:09:25.893 回答
6

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

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

于 2013-06-09T09:00:33.183 回答
0

You are assigning the address of local variable, which will soon disappear when My_Func returns. You can use following in your code. However you can do the same thing just by using single pointer, double pointer is not required in this example.

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     **p = *Ptr;
}
于 2013-06-09T08:59:04.910 回答
0

在函数声明中使用它:

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

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

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

于 2017-07-12T10:44:30.677 回答