woaizy1990 发表于 2019-6-19 18:19:00

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

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

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

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

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

万分感谢
****************************************************************
本想弄个悬赏的,平时发帖比较少,发出来才发现发布之前才可以悬赏...
解答之后会给最佳答案的朋友20鱼币算作一点酬劳,谢谢.!

newu 发表于 2019-6-19 18:49:01

有点意思,顺便回顾了自己以前学的东西。

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

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

所以,多维数组名的本质是:数组指针。

我就是个弟弟 发表于 2019-6-19 19:39:39

数组指针指向一维的数组

woaizy1990 发表于 2019-6-20 10:03:41

newu 发表于 2019-6-19 18:49
有点意思,顺便回顾了自己以前学的东西。

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


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

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

newu 发表于 2019-6-20 11:16:19

woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是(int (*))&array这里是不是 (int (*))=&array ?

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

&array 在你这个代码里指的是(int (*))这个数组指针的地址,所以要加(int (*))这个指针强转。

我就是个弟弟 发表于 2019-6-20 11:57:12

woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是(int (*))&array这里是不是 (int (*))=&array ?

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

array和&array是有区别的
array是数组第一个元素的地址
&array是数组的地址
既然都要强制类型转换了,不用取地址运算符也可以的.

justjust001 发表于 2019-6-21 15:40:12

(int (*)) 的意思是强制类型转换的意思。把后面的变量值的类型强制转换成括号内的类型。
类似于int b=(int)afloat b=(float)aint *pb=(int *)pa。只是这里强制转换的是一个稍微复杂点的类型:一个指向有3个int类型元素的数组的指针。

豆芽菜丶 发表于 2021-11-3 20:42:01

感谢,我也有同样的疑问。看了评论也有了自己的一点理解
页: [1]
查看完整版本: S1E24中"int (*p)[3] = (int (*)[3])&array" 这个该如何理解?