【发布时间】:2011-07-27 01:36:17
【问题描述】:
假设我有一个数组:
int a[3] = { 1, 2, 3 };
现在如果我要检查“a”的类型,在我的机器上我会得到:
cout<<typeid(a).name(); // prints 'A3_i'
现在,如果我获取“a”的地址,然后取消引用该地址,类型不会改变(我真的很喜欢,因为在我看来“获取地址”和“取消引用”是逆操作):
cout<<typeid(*&a).name(); // also prints 'A3_i'
但是,如果我先取消引用 'a',然后获取它的地址,类型 确实 会改变(我承认我很难不喜欢,因为当我取消引用数组时,我应该得到一个 int,当我获取那个 int 的地址时,我应该得到一个指向 int 的指针,结果我做到了):
cout<<typeid(&*a).name(); // prints 'Pi'
所以这是我的两个问题:
1) 一旦数组类型衰减为指针类型,是否有办法将其恢复为数组类型?
我尝试了明显的策略,即像你一样不关心:
cout<<typeid( (int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
还有其他演员可以工作吗?还是这种转换是严格禁止的?
2) 无论您是否可以回到数组类型,究竟哪些信息在衰减到指针的过程中被切分和丢失?
我知道指针类型和数组类型是不等价的。我假设数组类型是存储在指针类型中的信息的严格超集。这听起来对吗?
我在其他问题中读到数组类型中的额外信息是:知道数组是否在堆栈上,以及它的大小(它必须以某种方式知道数组的大小,因为它是类型的一部分,对吧?)。数组类型中是否隐藏了其他信息?
【问题讨论】:
-
我会观察到 int[3] 不是类型,尽管 int[] 是。
-
@Daniel:“3 个整数的数组”绝对不同于“int[]”,而“int[3]”似乎是前者的合理简写。
-
@Daniel R Hicks-
int[3]是一种类型;它是三个ints 的数组类型。当您使用语法int arr[3]声明变量时,您正在声明一个名为arr的变量,其类型为int[3]。这就是为什么声明它们的范围内的数组名称与指向数组第一个元素的指针的工作方式不同的原因。int[3]类型与int*不同。