鱼C论坛

 找回密码
 立即注册
查看: 2613|回复: 13

[已解决]一维数组拆分成二维数组

[复制链接]
发表于 2021-10-3 22:28:30 | 显示全部楼层 |阅读模式
6鱼币
#include <stdio.h>

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

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

        return 0;
}

int (*p)[3] = (int (*)[3])&array; 这句语句的右边怎么理解啊。
看答案上说的是拆成了一个3*3的二维数组,但是我不理解&array明明已经是一个数组的指针了,而p是一个数组指针,为什么还有int (*)呢?而且我把int (*)的小括号去掉会报错,为啥呢?
最佳答案
2021-10-3 22:28:31
bszs 发表于 2021-10-4 14:07
也就是说无论几维数组在内存中都是一样的,至于怎么划分都是我们告诉编译器的

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-3 22:28:31 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
bszs 发表于 2021-10-4 14:07
也就是说无论几维数组在内存中都是一样的,至于怎么划分都是我们告诉编译器的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-3 23:34:18 | 显示全部楼层
的确都是指针,但是类型不一样
你之前也问了好多 指针与数组的问题,不知道你是不是真的懂了
我感觉,你的这个问题和之前的那些问题没什么区别
如果之前的那些问题你懂了,这个问题你也应该没问题
你这个问题不懂,感觉之前的那些问题也没有弄明白
实在不行就先跳过这部分内容吧
跳过和指针相关的东西
指针与数组,指针与函数,指针与结构体,。。。
等学了汇编语言之后再回来重新学习 指针与数组,指针与函数,指针与结构体,。。。
在这里一直卡着也不是回事,还影响你学习的心情
你现在只要最简单的指针用法能看懂就可以了,等学了汇编语言之后再回来学习指针相关的内容
最简单的用法
int a = 10;
int *pa = &a;
*pa = 123;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-3 23:35:41 | 显示全部楼层
这个论坛里面有人回复过了,链接:关于数组;你看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-3 23:45:31 | 显示全部楼层
int (*p)[3] = (int (*)[3])&array;
左边
p 是一个指针,指向有 3 个元素的数组,数组的每一个元素都是 int 类型
右边
array 是一个数组,有 9 个元素,每一个元素的类型都是 int
&array 是一个指针,指向一个数组,数组中有 1 个元素,这个元素的类型是一个数组,这个数组 有 9 个元素,每一个元素的类型都是 int
其实就是 &array 是一个指针,指向一个数组,数组中有 1 个元素,这个元素就是 array 数组

(int (*)[3])&array
把 &array 的类型强制转换成 一个指针,这个指针指向一个数组,数组有 3 个元素,每一个元素的类型都是 int

不知道你懂了没有,我是尽力了
如果不行就跳过指针相关的东西吧,学完了 C语言后去学汇编语言
学完了汇编语言后,返回来重新学习 指针相关的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-4 09:47:37 | 显示全部楼层
直接看他们的内存状态,指针随你怎么写,上面的和下面的是==的
IND3N{U4EEC$}X1HO)J@BLX.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-4 14:04:45 | 显示全部楼层
人造人 发表于 2021-10-3 23:45
int (*p)[3] = (int (*)[3])&array;
左边
p 是一个指针,指向有 3 个元素的数组,数组的每一个元素都是  ...

我数了一下,总共八个问题,确实挺多的,看视频有碰到问题我想不懂的就会去百度,百度找不到会过来问问题,之前那些确实是搞懂了,但是这个是没见过的形式,答案的解释也很模糊,我只是想搞明白原理,不过还是谢谢大佬的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-4 14:07:43 | 显示全部楼层
2736946915 发表于 2021-10-4 09:47
直接看他们的内存状态,指针随你怎么写,上面的和下面的是==的

也就是说无论几维数组在内存中都是一样的,至于怎么划分都是我们告诉编译器的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-5 01:05:25 | 显示全部楼层

&array是类型为int (*)[9]的指针,为了赋值给int (*)[3]类型的指针就要强转
这就像是
int a;
float b;
b=(float)a;
一样的强制类型转换吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-5 09:22:20 | 显示全部楼层
bszs 发表于 2021-10-5 01:05
&array是类型为int (*)[9]的指针,为了赋值给int (*)[3]类型的指针就要强转
这就像是
int a;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-5 09:24:38 | 显示全部楼层
bszs 发表于 2021-10-5 01:05
&array是类型为int (*)[9]的指针,为了赋值给int (*)[3]类型的指针就要强转
这就像是
int a;

这个
int (*p)[3] = (int (*)[3])&array;

写成下面这样也没问题
int (*p)[3] = (int (*)[3])array;

毕竟要强制类型转换,之前的类型是什么已经不重要了,地址值一样就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-5 10:38:31 | 显示全部楼层
bszs 发表于 2021-10-4 14:07
也就是说无论几维数组在内存中都是一样的,至于怎么划分都是我们告诉编译器的

是的,不管你是用二维还是一维,反正内存可不管你这么多,它只知道你要这么多内存,系统就根据你的下标来把这段内存怎么区分,比如说100能分成一个100,也能分成50*2,还能分成25*4,怎么分都是我们自己的事,
如果你想问问什么要这样分,这纯粹是为了好理解,便于维护和观看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-5 11:47:09 | 显示全部楼层
人造人 发表于 2021-10-5 09:24
这个
int (*p)[3] = (int (*)[3])&array;

懂了,感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-5 11:47:39 | 显示全部楼层
bszs 发表于 2021-10-5 11:47
懂了,感谢大佬

懂了懂了非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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