鱼C论坛

 找回密码
 立即注册
查看: 2632|回复: 6

[已解决]疑问:数组地址强制转换为int (*)[3]类型

[复制链接]
发表于 2022-9-12 19:52:05 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 须弥芥子 于 2022-9-12 21:10 编辑
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  5.     int (*p)[3] = (int (*)[3])&array;

  6.     printf("%d\n", p[2][2]);

  7.     return 0;

  8. //输出9
  9. }
复制代码

int (*p)[3] = (int (*)[3])&array等效为int p[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 吗?
多维数组的本质就是数组指针?
[3]决定这个数组指针的跨度,从而实现第一个下标对所谓数组内的数组的索引?
不知道我理解的对不对,希望鱼油们跟帖,分享一下自己的理解
最佳答案
2022-9-12 21:40:54
本帖最后由 gandixiwang 于 2022-9-12 22:04 编辑
须弥芥子 发表于 2022-9-12 21:09
不好意思,手机码字出错了
我想问的是这个现象是怎么解释的。
我说的跨度指的是地址(指针)+1 实际加 ...


就是想套娃一样,二维数组(指针) &p2 的跨度是整个二维数组,就是9个int的跨度 你写成这样 p2[2] 就是在数组里选定了第三行进去里面,跨度是3个int,再写成这样p2[2][2]就是选定第三行第三个数把这个地址的数给取出来,跨度是一个int,这样就选定了 9 这个数,把他们替换成这样也是可以的:p[2][2]=*(*(p2+2)+2)
   
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-12 20:36:38 | 显示全部楼层
int (*p)[3] = (int (*)[3])&array等效为int p[2][2] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 吗?
什么?

多维数组的本质就是数组指针?
就是数组中存储数组

[3]决定这个数组指针的跨度,从而实现第一个下标对所谓数组内的数组的索引?
什么?

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:01:24 | 显示全部楼层
嗯,数组和指针是两个概念,要区分开来,本质还是不同的,虽然使用它们的方式都差不多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-12 21:09:40 | 显示全部楼层
人造人 发表于 2022-9-12 20:36
int (*p)[3] = (int (*)[3])&array等效为int p[2][2] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 吗?
什么?
...

不好意思,手机码字出错了
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  5.     int (*p1)[3] = (int (*)[3])&array;
  6.     int p2[3][3] = {{1, 2, 3},
  7.                     {4, 5, 6},
  8.                     {7, 8, 9}};

  9.     printf("%d\n", p1[2][2]);
  10.     printf("%d\n", p2[2][2]);
  11.     return 0;
  12. }
  13. /*
  14. 9
  15. 9

  16. Process finished with exit code 0
  17. */
复制代码

我想问的是这个现象是怎么解释的。
我说的跨度指的是地址(指针)+1 实际加的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:40:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 gandixiwang 于 2022-9-12 22:04 编辑
须弥芥子 发表于 2022-9-12 21:09
不好意思,手机码字出错了
我想问的是这个现象是怎么解释的。
我说的跨度指的是地址(指针)+1 实际加 ...


就是想套娃一样,二维数组(指针) &p2 的跨度是整个二维数组,就是9个int的跨度 你写成这样 p2[2] 就是在数组里选定了第三行进去里面,跨度是3个int,再写成这样p2[2][2]就是选定第三行第三个数把这个地址的数给取出来,跨度是一个int,这样就选定了 9 这个数,把他们替换成这样也是可以的:p[2][2]=*(*(p2+2)+2)
   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-12 21:59:56 | 显示全部楼层
还能这样写
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  5.         int (*p1)[3] = (int (*)[3])&array;
  6.         int p2[3][3] = {{1, 2, 3},
  7.                 {4, 5, 6},
  8.                 {7, 8, 9}};
  9.        
  10.         printf("%d\n", *(*(p1+2)+2));
  11.         printf("%d\n", *(p1[2]+2));
  12.                  
  13.         printf("%d\n", *(*(*(&p2+1))-1));
  14.         printf("%d\n", (&p2)[1][0][-1]);
  15.         return 0;
  16. }
  17. /*
  18.   9
  19.   9
  20.   9
  21.   9
  22.   
  23.   Process finished with exit code 0
  24. */
复制代码

虽然没什么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-12 23:19:45 From FishC Mobile | 显示全部楼层
gandixiwang 发表于 2022-9-12 21:59
还能这样写

虽然没什么用

懂了,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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