鱼C论坛

 找回密码
 立即注册
查看: 2024|回复: 7

S1E24中"int (*p)[3] = (int (*)[3])&array" 这个该如何理解?

[复制链接]
发表于 2019-6-19 18:19:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 woaizy1990 于 2019-6-19 18:29 编辑

#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;
}

这里的答案是9
我能明白(*p)[3]将array[9]变成了二维数组

但是这个 (int (*)[3])&array 实在是无法理解.
哪位大佬能给讲一下实际含义过程?
这其中(*),[3]和&array分别代表了什么意思?

万分感谢
****************************************************************
本想弄个悬赏的,平时发帖比较少,发出来才发现发布之前才可以悬赏...
解答之后会给最佳答案的朋友20鱼币算作一点酬劳,谢谢.!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-19 18:49:01 | 显示全部楼层
有点意思,顺便回顾了自己以前学的东西。

首先要知道这个含义,就得先知道“数组指针”是个什么东西。
举个栗子:
int c[5];
int (*pointer)[5] = &c; //这个编译就会直接通过,为什么?下面是解释:
虽然c和&c的值一样但是他们的意义不同(站在编译器角度):
数组名是数组首元素的起始地址,但并不是数组的起始地址
通过将取地址符&作用于数组名可以得到整个数组的起始地址

所以(int (*)[3])就很好理解了,他就是强制转换为一个长度为3的数组指针

所以,多维数组名的本质是:数组指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2019-6-19 19:39:39 | 显示全部楼层
数组指针指向一维的数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-20 10:03:41 | 显示全部楼层
newu 发表于 2019-6-19 18:49
有点意思,顺便回顾了自己以前学的东西。

首先要知道这个含义,就得先知道“数组指针”是个什么东西。

我不明白的地方主要是  (int (*)[3])&array这里是不是 (int (*)[3])=&array ?

可能是对取址操作符不太熟练,对这行代码的运行不太理解

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

使用道具 举报

发表于 2019-6-20 11:16:19 | 显示全部楼层
woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是  (int (*)[3])&array这里是不是 (int (*)[3])=&array ?

可能是对取址操作符不太 ...


&array 在你这个代码里指的是(int (*)[9])这个数组指针的地址,所以要加(int (*)[3])这个指针强转。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-20 11:57:12 | 显示全部楼层
woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是  (int (*)[3])&array这里是不是 (int (*)[3])=&array ?

可能是对取址操作符不太 ...

array和&array是有区别的
array是数组第一个元素的地址
&array是数组的地址
既然都要强制类型转换了,不用取地址运算符也可以的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-21 15:40:12 | 显示全部楼层
(int (*)[3]) 的意思是强制类型转换的意思。把后面的变量值的类型强制转换成括号内的类型。
类似于int b=(int)a  float b=(float)a  int *pb=(int *)pa。只是这里强制转换的是一个稍微复杂点的类型:一个指向有3个int类型元素的数组的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-11-3 20:42:01 | 显示全部楼层
感谢,我也有同样的疑问。看了评论也有了自己的一点理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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