VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 272|回复: 4

C语言二维数组问题

[复制链接]
75_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-28 15:14:02 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>

  2. int main()

  3. {
  4.         int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
  5.         int *p,i,j;

  6.         for (p = a[0];p < a[0] + 12;p++)// 使 p 依次指向下一个元素
  7.         {
  8.                 if((p - a[0]) % 4 == 0)// p 移动4交换行
  9.                 {
  10.                         printf("\n");
  11.                 }
  12.                 printf("%4d",*p);// 输出 p 指向的元素的值
  13.         }
  14.         printf("\n");
  15.         p = a[0];
  16.         scanf("%d,%d",&i,&j);// 指定要输出的数组的行和列
  17.         printf("a[%d,%d] = %d\n",i,j,*(*(a + i) + j));// 输出指定元素的值
  18.         printf("a[%d,%d] = %d\n",i,j,*(p + i) + j);// 输出指定元素的值
  19.         return 0;
复制代码


为什么最后两个输出不同?若将最后一语句改成:*(*(p + i) + j) 则系统报错:error C2100: illegal indirection





上一篇:控件重复问题
下一篇:论坛的源码能用Visual Studio运行吗
57_avatar_middle
最佳答案
22 
在线会员 发表于 2020-8-28 18:34:09 | 显示全部楼层
p = a[0],这句代码P指向的是以为数据a[0]的首地址,是一维数组的指针
*(*(p + i) + j) ,理解上面后,p为一个数字
微信图片_20200828182534.png
75_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-31 17:52:12 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-31 17:56 编辑
JLDawson 发表于 2020-8-28 18:34
p = a[0],这句代码P指向的是以为数据a[0]的首地址,是一维数组的指针
*(*(p + i) + j) ,理解上面后,p为 ...


*(*(p + i) + j) 不是正确答案 !  我经过五天的反复看书、理解、试运行,终于搞清楚了,正确的写法如下:

  1. #include <stdio.h>

  2. int main()

  3. {
  4. #include <stdio.h>

  5. int main()

  6. {
  7.         int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
  8.         int *p,i,j;

  9.         for (p = a[0];p < a[0] + 12;p++)                        // 使 p 依次指向下一个元素
  10.         {
  11.                 if((p - a[0]) % 4 == 0)                        // p 移动4交换行
  12.                 {
  13.                         printf("\n");
  14.                 }
  15.                 printf("%4d",*p);                                // 输出 p 指向的元素的值
  16.         }
  17.         printf("\n");
  18.         p = a[0];
  19.         scanf("%d,%d",&i,&j);                                // 指定要输出的数组的行和列
  20.         printf("a[%d,%d] = %d\n",i,j,*(*(a + i) + j));        // 输出指定元素的值
  21.         printf("a[%d,%d] = %d\n",i,j,*(p + i * 4 + j));        // 输出指定元素的值
  22.         return 0;
  23. }
复制代码

57_avatar_middle
最佳答案
22 
在线会员 发表于 2020-8-31 18:10:52 | 显示全部楼层
风过无痕1989 发表于 2020-8-31 17:52
*(*(p + i) + j) 不是正确答案 !  我经过五天的反复看书、理解、试运行,终于搞清楚了,正确的写法如下 ...

我上面的回复不是正确的书写方法是什么,而是问题出在哪里。
二维数组是什么?在内存中是如何存储的?以及一级指针和二级指针的概念了解一下的话,可以更直观的看到问题的本质
75_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-31 22:03:42 | 显示全部楼层
JLDawson 发表于 2020-8-31 18:10
我上面的回复不是正确的书写方法是什么,而是问题出在哪里。
二维数组是什么?在内存中是如何存储的?以 ...

我只看到你一张图,图中只是说 p 是 int* 型罢了,没有看见你有书写。

我等初学者,发帖求助,想得到的是问题的正确解答或者是对所做习题之错误的正确解释。

虽然我在你这里,什么都没得到,还是要谢谢你的回复!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-29 03:08

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表