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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. void foo(int[][3]);
  2. int main(void)
  3. {
  4. int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
  5. foo(a);
  6. printf("%d\n", a[2][1]);
  7. return 0;
  8. }
  9. void foo(int b[][3])
  10. {
  11. ++b;
  12. b[1][1] = 9;
  13. }
复制代码









答案是   8  怎么得到的  求详细分析啊

16 个回复

正序浏览
Mal 中级黑马 2015-7-22 21:36:17
17#
你好像给的不全把
回复 使用道具 举报
wdcew 发表于 2015-7-21 23:53
额,我来说一下吧,首先,要明白,函数调用的参数,其实都是指针,也就是 f(b) 中,其实是传递指针b, 这时 ...

感觉你说的,再结合我给出的代码,简直就是完美。。。。。。哈哈哈。。。。
回复 使用道具 举报
进来学习下
回复 使用道具 举报
liusuizuoyou 发表于 2015-7-21 13:43
那你觉得   ++b    b[1][1]      成啥了。   不要跟我说   b->0        ++b后 b->1
    ...

这个是指针跟数组的问题,其实形参的数组就是可以看成一个指针变量。。。二维数组就是一个二维指针吧。。
回复 使用道具 举报
wdcew 中级黑马 2015-7-21 23:53:57
13#
本帖最后由 wdcew 于 2015-7-21 23:57 编辑

额,我来说一下吧,首先,要明白,函数调用的参数,其实都是指针,也就是 f(b) 中,其实是传递指针b, 这时候想一想,函数void (intb[][3]),当二维数组当指针的情况:int b[row][col], b并不是指向a[0][0]的指针,而是 指向a[0] 长度为 col(这里等于3)的int类型的指针,程序中 ++b执行后,b就等于 数组a[1][0]的地址了(这里的偏移量相当于3个);当在执行 b[1][1]时候,我门要懂得用指针去思考它的行为,相当于指针 偏移量,而这个偏移量 是相对于 a[0][0]的地址,即再a[1][0】的位置上又位移了4 个偏移量,此时指针b指向的地址 不就是数组a[2][1]的地址了么。所以 a[2][1]被赋值为9.
回复 使用道具 举报
CesC 中级黑马 2015-7-21 22:43:27
12#
明天才学二维数组。
回复 使用道具 举报
llo 中级黑马 2015-7-21 22:38:15
11#

大神啊   感觉有点思路了  还是  有点晕啊
回复 使用道具 举报
感觉是8啊,我也不太懂
回复 使用道具 举报
感觉是8
回复 使用道具 举报
丁铭检 发表于 2015-7-21 10:30
等你学到指针,你就知道,你所说的都是错的。。。

那你觉得   ++b    b[1][1]      成啥了。   不要跟我说   b->0        ++b后 b->1
   
回复 使用道具 举报
传递的是值,而不是地址,最终被释放了。。。
回复 使用道具 举报
我想说,后面无论进行了什么操作。真正输出的就只有printf("%d\n", a[2][1]);这一句
回复 使用道具 举报

希望这样的你自己就能懂了。。

本帖最后由 丁铭检 于 2015-7-21 10:41 编辑
  1. void foo(int[][3]);
  2. int main(void)
  3. {
  4.     int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
  5.     for (int i =0; i < 3; i++) {
  6.         for (int j =0; j < 3; j ++) {
  7.             printf("%d\t",a[i][j]);
  8.         }
  9.         printf("\n");
  10.     }
  11.       printf("\n");
  12.       printf("\n");
  13.     foo(a);
  14.     for (int i =0; i < 3; i++) {
  15.         for (int j =0; j < 3; j ++) {
  16.             printf("%d\t",a[i][j]);
  17.         }
  18.         printf("\n");
  19.     }
  20.     printf("%d\n", a[2][1]);
  21.     return 0;
  22. }
  23. void foo(int b[][3])
  24. {
  25.     ++b;
  26.     printf("\n");
  27.     printf("\n");
  28.     for (int i =0; i < 3; i++) {
  29.         for (int j =0; j < 3; j ++) {
  30.             printf("%d\t",b[i][j]);
  31.         }
  32.         printf("\n");
  33.     }
  34.     b[1][1] = 9;
  35. }
复制代码
回复 使用道具 举报
liusuizuoyou 发表于 2015-7-21 00:02
(1)  b是数组名(数组名为常量)  不能进行 “ ++” 运算 .     (2)b[1][1] = 9 只 改变了 a[1][1]的值 ...

等你学到指针,你就知道,你所说的都是错的。。。
回复 使用道具 举报
(1)  b是数组名(数组名为常量)  不能进行 “ ++” 运算 .     (2)b[1][1] = 9 只 改变了 a[1][1]的值,数组元素其他的值不变 。  所以打印出来的值 还是原来的值 “8”
回复 使用道具 举报
你确定8是正确答案吗?该是9吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马