Jim*_*mmy 14 c++ arrays pointers
那么让我们说我有一个数组:
int a[3] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
现在,如果我要检查'a'的类型,我会得到:
cout<<typeid(a).name(); // prints 'A3_i'
Run Code Online (Sandbox Code Playgroud)
现在如果我取'a'的地址,然后取消引用该地址,类型不会改变(我真的很喜欢,因为在我看来'取地址'和'取消引用'是反向操作):
cout<<typeid(*&a).name(); // also prints 'A3_i'
Run Code Online (Sandbox Code Playgroud)
然而,如果我首先取消引用'a',然后取用它的地址,类型确实会改变(我承认我很难不喜欢,因为当我取消引用数组时我应该得到一个int,当我拿到地址时那个int,我应该得到一个指向int的指针,事实证明我做了):
cout<<typeid(&*a).name(); // prints 'Pi'
Run Code Online (Sandbox Code Playgroud)
所以这是我的两个问题:
1)一旦数组类型已经衰减成指针类型,无论如何都要将它恢复为数组类型?
我尝试了一种明显的铸造策略 - 就像你不关心一样:
cout<<typeid( (int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
Run Code Online (Sandbox Code Playgroud)
还有另一个演员可以奏效吗?或者这种类型的转换严格禁止?
2)你是否能够回到数组类型,究竟是什么信息在衰变到指针过程中被切片和丢失?
我知道指针类型和数组类型不等价.我假设array-type是存储在指针类型中的信息的严格超集.这听起来不错吗?
我在其他问题中已经读过,数组类型中的额外信息是:知道数组是否在堆栈上,以及它的大小(它必须以某种方式知道数组的大小,因为它是类型,对吗?).数组类型中是否隐藏了其他任何信息?
tem*_*def 10
我不确定这是否是您正在寻找的,但您可以使用类型转换来获取与原始数组相同类型的对象.我们的想法是使用鲜为人知的类型指针到数组和引用数组来恢复信息.例如:
char arr[137];
cout << sizeof(arr) << endl; // Prints 137
cout << sizeof(arr[0]) << endl; // Prints 1
cout << sizeof(&arr[0]) << endl; // Prints 4 (on my system)
cout << sizeof(*&arr[0]) << endl; // Prints 1
cout << sizeof((char (&) [137]) *&arr[0]) << endl; // Prints 137
Run Code Online (Sandbox Code Playgroud)
我们的想法是,我们将使用*&arr[0]to type 创建的引用进行类型转换char (&)[137],这是对137个字符数组的引用.现在引用具有这种类型,sizeof操作符知道它应该打印137,因为137个字符的数组的大小确实是137.
但是,这只适用于类型正确的类型!例如,这是完全合法的:
char arr[137];
cout << sizeof((char (&) [42]) *&arr[0]) << endl; // Prints 42
Run Code Online (Sandbox Code Playgroud)
因此,您可以恢复信息,但您可以轻松地获取错误的信息,并导致您恢复错误信息的情况.
同样,我不确定这是否是您正在寻找的,但它表明您确实可以使用强制转换来获取数组大小信息.
| 归档时间: |
|
| 查看次数: |
702 次 |
| 最近记录: |