黑马程序员技术交流社区

标题: 一个C程序,要求写出输出结果 [打印本页]

作者: 楚燮哥哥    时间: 2014-11-23 10:17
标题: 一个C程序,要求写出输出结果
#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


作者: wang2003    时间: 2014-11-23 12:12
     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;
作者: mahei521    时间: 2014-11-23 12:13
#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;
}
这个涉及二级指针,所以不好理解!
作者: 楚燮哥哥    时间: 2014-11-23 12:15
wang2003 发表于 2014-11-23 12:12
int *p=a,**k,z;
p指向a,*p = a[0]=2

谢谢,我基本看懂了
作者: 楚燮哥哥    时间: 2014-11-23 12:17
mahei521 发表于 2014-11-23 12:13
#include
int main()
{

谢谢,我就是在p=p+1这里搞错了,这里是改变P的值而不是他的地址
作者: meijinyu    时间: 2014-11-23 12:34
这个一个加法运算,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.这是我的理解,希望对你有所帮助。
作者: zhao190109    时间: 2014-11-23 12:43
楼主加油了,上边几位解释的很清楚,看来基础都不错啊
作者: smile辉煌    时间: 2014-11-23 12:47
都好厉害啊
作者: 楚燮哥哥    时间: 2014-11-23 12:57
meijinyu 发表于 2014-11-23 12:34
这个一个加法运算,int *p=a,指针p现在指向数组首地址a, k=&p是把指针p的地址赋值给二维指针k,现在k中存放 ...

谢谢这位同学额
作者: 楚燮哥哥    时间: 2014-11-23 12:58
zhao190109 发表于 2014-11-23 12:43
楼主加油了,上边几位解释的很清楚,看来基础都不错啊

赚点技术分不容易啊,还差好多:Q
作者: 孔思哲    时间: 2014-11-23 18:50
学习学习
作者: gjx0129    时间: 2014-11-23 21:27
举个例子 :
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
这个不是很难吧
作者: 杨贺阳    时间: 2014-11-23 22:43
**k不应该是a[1]的地址吗?为什么是a[1]的值?不信可以输出**k




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2