请找到如下所示的代码段:
#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
中使用单个指针则不会更改值在主要?请尽可能用例子解释我
高级谢谢你 麦迪
答案 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。
重要提示:在下载的编译器中尝试(总是在指针的情况下),而不是在在线编译器中。在线编译器不会跟踪堆栈中丢失的地址。