A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 楚燮哥哥 中级黑马   /  2014-11-23 10:17  /  1673 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

#include<stdio.h>
int main()
{
     static int a[5] = {2,4,6,8,10};
     int *p=a,**k,z;
     k=&p;   
     z=*p;
     p=p+1;
     z=z+**k;
     printf("%d\n",z);
     return 0;
}


我自己想出来的答案是4,但正确答案是6,求大神解释一下,新人学C语言还不是很懂。:P

评分

参与人数 1黑马币 +1 收起 理由
星河鹭起 + 1

查看全部评分

14 个回复

倒序浏览
     int *p=a,**k,z;
p指向a,*p = a[0]=2

     k=&p;   k是指针的指针,*k指向p,**k是*p!重要,这里只是指向
     z=*p; z=2
     p=p+1;
p指针后移,相当于*a[1]了!
     z=z+**k; z = 2+a[1]=6
     printf("%d\n",z);
     return 0;
回复 使用道具 举报 1 0
#include<stdio.h>
int main()
{
     static int a[5] = {2,4,6,8,10};
     int *p=a,**k,z;//p为一级指针,k为二级指针,p中存的是数组首地址。
     k=&p;  //k为二级指针,其中存的是p的地址。
     z=*p;//将p指向的空间的值赋给z,z等于2.
     p=p+1;//将p指向下一空间,也就是指向4.
     z=z+**k;//*的优先级高,所以原式等于z=z+(**k),p指向的是4,由于k中存的是p的地址,所以**k的值现在是4.所以2+4=6
     printf("%d\n",z);
     return 0;
}
这个涉及二级指针,所以不好理解!

点评

**k不应该是a[1]的地址吗?为什么是a[1]的值?不信可以输出**k  发表于 2014-11-23 22:30
回复 使用道具 举报
wang2003 发表于 2014-11-23 12:12
int *p=a,**k,z;
p指向a,*p = a[0]=2

谢谢,我基本看懂了
回复 使用道具 举报

谢谢,我就是在p=p+1这里搞错了,这里是改变P的值而不是他的地址
回复 使用道具 举报
这个一个加法运算,int *p=a,指针p现在指向数组首地址a, k=&p是把指针p的地址赋值给二维指针k,现在k中存放指针p的地址,z=*p是把指针p所指的内容赋值给z,现在z=2; p=p+1,现在指针p指向数组a[1]的地址,由于k中存放的是指针p的地址,所以*k访问指针p中存放的内容,也就是&a[1],**k=4,z=z+**k=2+4=6.这是我的理解,希望对你有所帮助。
回复 使用道具 举报
楼主加油了,上边几位解释的很清楚,看来基础都不错啊
回复 使用道具 举报
都好厉害啊
回复 使用道具 举报
meijinyu 发表于 2014-11-23 12:34
这个一个加法运算,int *p=a,指针p现在指向数组首地址a, k=&p是把指针p的地址赋值给二维指针k,现在k中存放 ...

谢谢这位同学额
回复 使用道具 举报
zhao190109 发表于 2014-11-23 12:43
楼主加油了,上边几位解释的很清楚,看来基础都不错啊

赚点技术分不容易啊,还差好多:Q
回复 使用道具 举报
学习学习
回复 使用道具 举报
举个例子 :
int a = 10
int *p = &a
int **k

k = &p

----------
在这里
*k = p
**k = *p (相当于 **k = a)

如果a的值得发生了变化 a = 20
那么 此时 **k 和 *p 都会等于20

如果 *p也发生了变化, *p = 30
那么此时 a = 30, **k = 30

----------
如你现在的题, 因为执行了 p = p + 1,
*p 所指向的值 变成了 a[1], 所以此时 **k 也变成了4

具体的可以把我 最上面的那个简单的代码简单调试一下,
留意一下 p k 所指向的地址的值,
回复 使用道具 举报
香港 中级黑马 2014-11-23 22:26:03
13#
这个不是很难吧
回复 使用道具 举报
**k不应该是a[1]的地址吗?为什么是a[1]的值?不信可以输出**k
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马