黑马程序员技术交流社区

标题: 二级指针的题,做不上来,彻底晕"针"了,请大家帮忙看下 [打印本页]

作者: jiangenhao    时间: 2014-4-25 23:16
标题: 二级指针的题,做不上来,彻底晕"针"了,请大家帮忙看下
本帖最后由 jiangenhao 于 2014-4-27 21:49 编辑

下面程序的输出结果是________。

  1. #include "stdio.h"
  2.     main()
  3.     {
  4.         int b[2][3]={1,3,5,7,9,11};
  5.         int *a[2][3];
  6.         int i,j;
  7.         int **p, m;
  8.         for(i=0;i<2;i++)
  9.             for(j=0;j<3;j++)
  10.                 a[i][j]=*(b+i)+j;
  11.         p=a[0];
  12.         for(m=0;m<6;m++)
  13.         {
  14.             printf("%4d", **p);
  15.             p++;
  16.         }
  17.     }
复制代码

作者: blz01003hm    时间: 2014-4-25 23:32
结果是 1 3 5 7 9 11
作者: jiangenhao    时间: 2014-4-26 01:28
为什么呢?帮忙解释下呗
作者: gaoxinglei123    时间: 2014-4-26 08:07
a是一个二维数组里面每个元素都是一个指向整数的指针变量。经过赋值以后a中元素分别b中各个元素的地址。p=a[0]把a[0][0]地址赋值给p则*p就是a[0][0]的值也就是b[0][0]的地址;依此类推
作者: 一只小菜鸟    时间: 2014-4-26 08:52
图丑了点,但看着应该明白了把?p指向a的地址,a在指向b的地址。
通过*a可以得到1;
通过*p可以获得a存储的内容。
既*(*p)=*a;  所以输出1 3 5 7 9 11

作者: jiangenhao    时间: 2014-4-26 23:10
马凯文 发表于 2014-4-26 10:19
楼上的都回答的不错,我再补充一下,这块忘得一干二净,看了一个小时,终于弄明白了!

其实*(b+i)+j  就是  &b[j],代码就是把b中每项的地址赋给a中每项
就是这句看不懂
为什么*(b+i)+j  就是  &b[j] 能再解释详细些吗
作者: 一只小菜鸟    时间: 2014-4-27 08:54
jiangenhao 发表于 2014-4-26 23:10
其实*(b+i)+j  就是  &b[j],代码就是把b中每项的地址赋给a中每项
就是这句看不懂
为什么*(b+i)+j  就是   ...

应该是&b[j]吧。
作者: 一只小菜鸟    时间: 2014-4-27 08:55
本帖最后由 一只小菜鸟 于 2014-4-27 09:02 编辑

为什么 i出不来,&b (i) [j]
  1. int main()
  2. {
  3.     int a = 1;
  4.     int *b = &a;
  5. //    可以写成   一样的原理
  6. //    int *b;
  7. //    b=&a;
  8.     *b = 2;
  9.     printf("a:%d,b:%d",a, *b); //a:2,b:2
  10. }
复制代码




作者: jiangenhao    时间: 2014-4-27 21:49
明白了  谢谢楼上的大神 我们老师都没讲过 你的技术真牛啊!




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