gpt4 book ai didi

c++ - 一旦一个 T 数组衰减为一个指向 T 的指针,它还能再变成一个 T 数组吗?

转载 作者:IT老高 更新时间:2023-10-28 22:38:31 29 4
gpt4 key购买 nike

假设我有一个数组:

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]'"

还有其他 Actor 可以工作吗?还是这种转换是严格禁止的?

2) 无论您是否可以回到数组类型,究竟哪些信息在衰减到指针的过程中被切分和丢失?

我知道指针类型和数组类型是不等价的。我假设数组类型是存储在指针类型中的信息的严格超集。这听起来对吗?

我在其他问题中读到数组类型中的额外信息是:知道数组是否在堆栈上,以及它的大小(它必须以某种方式知道数组的大小,因为它是类型的一部分,对吧?)。数组类型中是否隐藏了其他信息?

最佳答案

我不确定这是否正是您要寻找的,但您可以使用类型转换来取回与原始数组具有相同类型的对象。这个想法是使用鲜为人知的类型指针到数组和引用到数组来恢复信息。例如:

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

我们的想法是我们将使用 *&arr[0] 创建的引用类型转换为类型 char (&)[137],对 137 数组的引用人物。现在引用具有这种类型,sizeof 运算符知道它应该打印 137,因为 137 个字符的数组的大小确实是 137。

但是,这仅在您将类型转换为正确类型时才有效!例如,这是完全合法的:

char arr[137];
cout << sizeof((char (&) [42]) *&arr[0]) << endl; // Prints 42

因此您可以恢复信息,但您很容易错误地获取该信息并导致您恢复了错误信息的情况。

同样,我不确定这是否是您要查找的内容,但它表明您确实可以使用强制转换来取回数组大小信息。

关于c++ - 一旦一个 T 数组衰减为一个指向 T 的指针,它还能再变成一个 T 数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6838535/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com