C语言指针易错问题【附图+高分】 30
①第一个printf中输出的结果应该是4啊,因为*(p++)代表的就是a[1]啊,a[1]=4②第二个printf中**k错了吧,为什么有两个星花?为什么第一个print...
①第一个printf中 输出的结果应该是4啊,因为*(p++)代表的就是a[1]啊,a[1]=4
②第二个printf中 **k错了吧,为什么有两个星花?为什么第一个printf中只有一个星花 展开
②第二个printf中 **k错了吧,为什么有两个星花?为什么第一个printf中只有一个星花 展开
4个回答
展开全部
搞IT的人,都是夜猫子啊。。
1.这个题和你前面的提问,都是关于指针的问题,因为指针太灵活,你可以画个跳转图来标记每个指针指向的内容,这样就好理解了。
2.任何变量都需要有存储空间,每个存储空间对应一个存储地址,比如指针p,即p有一个存储地址,该存储地址对应的存储空间放的是p指向的地址;
3.*p表示p是个指针,即p的值是个地址,该地址指向一个字符串(姑且这样说),**k表示k是个指向指针的指针,即k的值也是一个地址,但是该地址指向的还是一个地址;
4.p=a,表示将a的存储地址赋给了p,此时p的存储空间放的是数组a的首地址;k=&p,表示将指针p的存储地址赋给了k;
5.*(p++)的意思是,先用p,后执行p自加操作,所以第一个printf输出的实质上是*p的值,不言而喻,输出的结果是2;
6.第二个printf:前面说过,k存放的是指针p的存储地址,那么*k就是p的存储空间内容(p的存储空间存放的是数组a的地址,但是注意,此时p的值已经加1了,也就是p指向了数组a的第二个元素),因此*(*k)就是数组a的第二个元素,结果就是输出4;
展开全部
1.P++的意思是 先用后加 所以printf("%D\n",*(p++)) 显示*p的值 。但在显示之后 p已自加1
2.int **k 是定义一个类型为int*的*k指针; k=&p即k等于p的地址,所以*k等于p的值 , 而p的值是a的地址。所以*k的值等于a的地址,那么**k(可以看成 *(*k))就a的地址的值 即2,但之前有P++操作 所以是4
2.int **k 是定义一个类型为int*的*k指针; k=&p即k等于p的地址,所以*k等于p的值 , 而p的值是a的地址。所以*k的值等于a的地址,那么**k(可以看成 *(*k))就a的地址的值 即2,但之前有P++操作 所以是4
追问
你的回答短小精悍,我想问的是您说 p的值是a的地址,是由p=a得到的吧。难么p=a中,p应该是地址呀,怎么说是p的值?所以说p=a的意思是p的地址等于a的地址呀?我错在哪里了?
追答
我们来一句一句分析:
int a[5]={2,4,6,8,10},*p,**k; //a是此数组的地址值,p是int*类型的指针,*k是int*类型的指针,k是int**类型的指针;指针存的是什么?存的是地址!
p=a; //单从这句来看,表面意思是:把a的值赋给p。而a的值是一个地址,所以p的值是数组的地址值。
k=&p; //既然k是指针,那么它肯定存的是地址值,&p是取p的地址值。注意这里有两个概念:1. p的值。 2.p的地址值。通过p=a,p的值是a的地址值;而p的地址值通过&p获得,并赋给了k这个指针。既然指针k指向p的地址,那么*k就是取该地址上的值,即p的值。之前我们说过*k也是一个指针,那它肯定也是一个地址值,而p的值就是a的地址值,所以赋值成立。那么**k也就呼之欲出了,看成*(*k),就是取*k这个地址上的值,即地址值为a的地址上的值;即此数组,而之前已有p++,所以取第二个。 p.s.:一定要区分 地址值 和 地址上的值
pringf("%d\n",*(p++));
pringf("%d\n",**k);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实主要是一个运算符的优先级和结合性的问题。
*与++优先级一样,其结合性自右向左。当*和++出现在操作数p的两边时,从右开始,++先与p作用,
具体步骤:
1.作p++运算:将p拷贝一个副本(假设称为a),然后将p值加1
2.对p的副本作*运算:取a所指向地址的值,即a[0];
第二个中有两个**那表明是指针的指针**k相当于是*(*看)括号中的部分是p的值即a的地址值,a的地址值再加一个*则就是a的值了
呵呵,要是不对,别见怪啊
*与++优先级一样,其结合性自右向左。当*和++出现在操作数p的两边时,从右开始,++先与p作用,
具体步骤:
1.作p++运算:将p拷贝一个副本(假设称为a),然后将p值加1
2.对p的副本作*运算:取a所指向地址的值,即a[0];
第二个中有两个**那表明是指针的指针**k相当于是*(*看)括号中的部分是p的值即a的地址值,a的地址值再加一个*则就是a的值了
呵呵,要是不对,别见怪啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个printf中*(p++)是先对p解除引用再运算p++ 所以结果是2
如果是*(++p)结果就是4
第二个printf中k是指向指针p的指针 所以要想得到k地址的内容必须使用两次解除引用
如果是*(++p)结果就是4
第二个printf中k是指向指针p的指针 所以要想得到k地址的内容必须使用两次解除引用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询