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鱼币算作一点酬劳,谢谢.! 有点意思,顺便回顾了自己以前学的东西。
首先要知道这个含义,就得先知道“数组指针”是个什么东西。
举个栗子:
int c;
int (*pointer) = &c; //这个编译就会直接通过,为什么?下面是解释:
虽然c和&c的值一样但是他们的意义不同(站在编译器角度):
数组名是数组首元素的起始地址,但并不是数组的起始地址
通过将取地址符&作用于数组名可以得到整个数组的起始地址
所以(int (*))就很好理解了,他就是强制转换为一个长度为3的数组指针
所以,多维数组名的本质是:数组指针。 数组指针指向一维的数组 newu 发表于 2019-6-19 18:49
有点意思,顺便回顾了自己以前学的东西。
首先要知道这个含义,就得先知道“数组指针”是个什么东西。
我不明白的地方主要是(int (*))&array这里是不是 (int (*))=&array ?
可能是对取址操作符不太熟练,对这行代码的运行不太理解
woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是(int (*))&array这里是不是 (int (*))=&array ?
可能是对取址操作符不太 ...
&array 在你这个代码里指的是(int (*))这个数组指针的地址,所以要加(int (*))这个指针强转。 woaizy1990 发表于 2019-6-20 10:03
我不明白的地方主要是(int (*))&array这里是不是 (int (*))=&array ?
可能是对取址操作符不太 ...
array和&array是有区别的
array是数组第一个元素的地址
&array是数组的地址
既然都要强制类型转换了,不用取地址运算符也可以的. (int (*)) 的意思是强制类型转换的意思。把后面的变量值的类型强制转换成括号内的类型。
类似于int b=(int)afloat b=(float)aint *pb=(int *)pa。只是这里强制转换的是一个稍微复杂点的类型:一个指向有3个int类型元素的数组的指针。 感谢,我也有同样的疑问。看了评论也有了自己的一点理解
页:
[1]