在我写的代码中:
int *p1=&a,**p3=&p1;
将p3作为参数传递给函数'change'后,p1得到 改变了...然后主函数打印了p1,p1取值 在双指针p3(如写入int ** p3 =& p1),但它不接地址 a(int * p1 =& a)。
这意味着p1的值将是p3处的值,而不是 变量'a'的地址?为什么双指针'p3'的值 会被考虑??
为什么不存储指针所存储的地址(& a)的值?任何人都可以澄清 这两行......
int *p1=&a;
int **p3=&p1;
我理解双指针的概念,但需要澄清 关于这两条线......
#include<stdio.h>
void main()
{
int a=2,b=3;
int *p1=&a,*p2=&b,**p3=&p1;
printf("p1=%d, p2=%d, p3=%d\n",p1,p2,p3);
change(p3,p2);
printf("p1=%d, p2=%d, p3=%d\n",p1,p2,p3);
printf("p1=%d\n",p1);
printf("a=%d, b=%d\n",*p1,*p2);
}
void change(int **x,int *z)
{
*x=z;
printf("p1=%d, p2=%d\n",*x,z);
printf("a=%d, b=%d\n",**x,*z);
}
输出:
p1=-840577016,p2=-840577012,p3=-840577008
p1=-840577012,p2=-840577012
a=3,b=3
p1=-840577012,p2=-840577012,p3=-840577008
p1=-840577012
a=3,b=3
答案 0 :(得分:4)
因为您在此行中更改了p1
。 *x=z;
要解释一下你已经完成了这个
change(p3,p2)
现在p3
的地址为p1
。然后你只需通过分配其他内容来改变它......
其他东西只不过是b
的地址。
void change(int **x,int *z)
x
包含p1
的地址。
z
包含b
的地址。
然后你说无论x
的内容是什么 - 去那里写下z
的内容。 z
包含b
的地址。现在我们将p1
- s内容更改为b
。
int *p1=&a
在函数中更改后的行p1
?对OP而言 - 你认为p1
会在这里改变吗?
int *p1 = &a;
p1 = &b;
我们最后将b
的地址分配给p1
。早先写的os被覆盖的值。
没有什么被忽略 - 程序做了所谓的事情。
使用%p
打印像这样的指针
printf("p1=%p, p2=%p, p3=%p\n", (void*)p1, (void*)p2, (void*)p3);