使用双指针作为参数
请找到如下所示的代码段:
#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; }