【发布时间】:2017-12-15 15:58:48
【问题描述】:
在我写的代码中:
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
【问题讨论】:
-
输出“a=3,b=3”不可能由语句“printf("a=%d, b=%d\n",*p1,*p2 );”,因为后者包含一个空格,而前者没有。虽然在这种情况下这不会导致问题,但在显示输出时,请复制并粘贴准确的输出,以避免转录错误。
-
%d不适合打印指针 - 你想要%p -
@ChrisTurner.:在您发表评论之前已在答案中编辑
-
p1=1244434040, p2=1244434044, p3=1244434048 p1=1244434044, p2=1244434044 a=3, b=3 p1=1244434044, p2=1244434040, p2=124443444443=12444344 , b=3
-
指针只不过是一个变量,它存储了其他东西的地址作为它的值。虽然您可以继续向任何指针添加间接级别作为教育练习,但这不是预期的目的。多级间接是一种工具,它可以索引集合中的各个指针,而不是简单地不断取消引用指针以获取单个地址处的值。练习很好,只要注意指向类型指针的指针(例如双指针)通常用于访问指针集合中的 1。