在我写的代码中:
int *p1=&a,**p3=&p1;
在将p3作为参数传递给函数'change'之后,p1被改变了...然后main函数打印了p1,p1取值为双指针p3(如写入int ** p3 =&p1),但它没有取一个地址(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
1 回答
因为您在此行中更改了
p1
.*x=z;
为了解释一下你已经做到了这一点
现在
p3
的地址为p1
. 然后你只是通过赋予它别的东西来改变它 .那东西只不过是
b
的地址 .x
包含p1
的地址 .z
包含b
的地址 .然后你说无论
x
的内容是什么 - 去那里写一下z
的内容 .z
包含b
的地址 . 所以现在我们将p1
-s内容更改为b
的地址 ...但在主要它会忽略行int * p1 =&a后p1在函数中被改变?
那么OP - 您认为
p1
会在这里改变吗?我们最后将
b
的地址分配给p1
. 早先写的os被覆盖的值 .没有什么是被忽视的 - 程序做了任何事情 .
另一点
使用
%p
打印这样的指针