bszs 发表于 2021-10-3 22:28:30

一维数组拆分成二维数组

#include <stdio.h>

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

      printf("%d\n", p);

      return 0;
}

int (*p) = (int (*))&array; 这句语句的右边怎么理解啊。
看答案上说的是拆成了一个3*3的二维数组,但是我不理解&array明明已经是一个数组的指针了,而p是一个数组指针,为什么还有int (*)呢?而且我把int (*)的小括号去掉会报错,为啥呢?

人造人 发表于 2021-10-3 22:28:31

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

人造人 发表于 2021-10-3 23:34:18

的确都是指针,但是类型不一样
你之前也问了好多 指针与数组的问题,不知道你是不是真的懂了
我感觉,你的这个问题和之前的那些问题没什么区别
如果之前的那些问题你懂了,这个问题你也应该没问题
你这个问题不懂,感觉之前的那些问题也没有弄明白
实在不行就先跳过这部分内容吧
跳过和指针相关的东西
指针与数组,指针与函数,指针与结构体,。。。
等学了汇编语言之后再回来重新学习 指针与数组,指针与函数,指针与结构体,。。。
在这里一直卡着也不是回事,还影响你学习的心情
你现在只要最简单的指针用法能看懂就可以了,等学了汇编语言之后再回来学习指针相关的内容
最简单的用法
int a = 10;
int *pa = &a;
*pa = 123;

Laoxie11 发表于 2021-10-3 23:35:41

这个论坛里面有人回复过了,链接:关于数组;你看看吧

人造人 发表于 2021-10-3 23:45:31

int (*p) = (int (*))&array;
左边
p 是一个指针,指向有 3 个元素的数组,数组的每一个元素都是 int 类型
右边
array 是一个数组,有 9 个元素,每一个元素的类型都是 int
&array 是一个指针,指向一个数组,数组中有 1 个元素,这个元素的类型是一个数组,这个数组 有 9 个元素,每一个元素的类型都是 int
其实就是 &array 是一个指针,指向一个数组,数组中有 1 个元素,这个元素就是 array 数组

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

不知道你懂了没有,我是尽力了
如果不行就跳过指针相关的东西吧,学完了 C语言后去学汇编语言
学完了汇编语言后,返回来重新学习 指针相关的东西

2736946915 发表于 2021-10-4 09:47:37

直接看他们的内存状态,指针随你怎么写,上面的和下面的是==的

bszs 发表于 2021-10-4 14:04:45

人造人 发表于 2021-10-3 23:45
int (*p) = (int (*))&array;
左边
p 是一个指针,指向有 3 个元素的数组,数组的每一个元素都是...

我数了一下,总共八个问题,确实挺多的{:10_277:},看视频有碰到问题我想不懂的就会去百度,百度找不到会过来问问题,之前那些确实是搞懂了,但是这个是没见过的形式,答案的解释也很模糊,我只是想搞明白原理,不过还是谢谢大佬的帮助

bszs 发表于 2021-10-4 14:07:43

2736946915 发表于 2021-10-4 09:47
直接看他们的内存状态,指针随你怎么写,上面的和下面的是==的

也就是说无论几维数组在内存中都是一样的,至于怎么划分都是我们告诉编译器的

bszs 发表于 2021-10-5 01:05:25

人造人 发表于 2021-10-4 14:45


&array是类型为int (*)的指针,为了赋值给int (*)类型的指针就要强转
这就像是
int a;
float b;
b=(float)a;
一样的强制类型转换吗?

人造人 发表于 2021-10-5 09:22:20

bszs 发表于 2021-10-5 01:05
&array是类型为int (*)的指针,为了赋值给int (*)类型的指针就要强转
这就像是
int a;


人造人 发表于 2021-10-5 09:24:38

bszs 发表于 2021-10-5 01:05
&array是类型为int (*)的指针,为了赋值给int (*)类型的指针就要强转
这就像是
int a;


这个
int (*p) = (int (*))&array;

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

毕竟要强制类型转换,之前的类型是什么已经不重要了,地址值一样就行

2736946915 发表于 2021-10-5 10:38:31

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

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

bszs 发表于 2021-10-5 11:47:09

人造人 发表于 2021-10-5 09:24
这个
int (*p) = (int (*))&array;



懂了,感谢大佬{:10_254:}

bszs 发表于 2021-10-5 11:47:39

bszs 发表于 2021-10-5 11:47
懂了,感谢大佬

懂了懂了非常感谢{:10_254:}
页: [1]
查看完整版本: 一维数组拆分成二维数组