编译器在数组到指针衰减存储中生成的指针在哪里



根据这个

当数组时,指针不存储为数组本身(或内存中的任何其他位置)的一部分 衰减到指针。

如果上述语句为真,那么 &array 的数据类型怎么可能与数组&array[0] 不同,但在下面的声明中,这三者都具有相同的值。

int array[10];

我认为当编译器静默地将数组衰减为指针时,它应该给指针一些内存地址。 如果不是,那么指针存储在哪里?

提前谢谢。

我看不出你从哪里得到指针必须存储在某个地方的想法。出于什么目的?没有C++代码需要将该指针存储在任何位置。

当抽象C++机器评估类似的东西时

int a = 2, b = 3, c = 4;
int i = (a + b) * c;

内部子表达式a + b计算结果为 5 。但是,从语言的角度来看,该5并没有真正存储在任何地方。它只是5的暂时价值,它存在了一瞬间,只是乘以c并永远被遗忘。这种非物质表达结果C++称为右值。通常未指定右值居住的地方。在计算上述表达式期间,5的值可能会在某些 CPU 寄存器中出现片刻。或者,如果编译器决定这样做,它甚至可能临时存储在某个未命名的内存区域中,但这不是您可以在C++代码级别看到的内容。

数组到指针转换产生的指针也是如此。该指针突出一个右值 - 一个不存在于内存中任何地方的临时值。它根本不需要存在于内存中的任何位置。

目前尚不清楚您试图通过&array参考表达什么。表达式&array不涉及数组到指针的转换,这意味着它与所讨论的问题完全无关。

当你在表达式array上使用address-of运算符时,表达式array不会衰减到指针中(当你使用sizeof时,当你使用typeid时,当你将数组作为参数传递时,形式参数是对数组的引用时也是如此)。在其他表达式中,它通常会衰减为指向其第一个元素的指针。

鉴于声明

    int array[10];

&array的类型是int (*const)[10],其中&array[0]的类型是 int *const== array类型在表达式

中衰减。

这是表达式评估的一部分。当编译器计算任何表达式时,例如3+4(unsigned int) 3&array[3]或简单地array,它管理以各种方式出现的所有临时值,通常是通过执行处理器寄存器中必要的任何计算。使用数组名称作为指针时,编译器通常会生成指令以将数组的地址加载到寄存器中,然后执行您指定对指针执行的任何其他算术。

从 http://ideone.com/Qw1aA 可以看出,&arrayarray&array[0]都表示相同的值:数组中第一个元素的内存地址。

然而,仅仅因为两个值相同并不意味着它们代表相同的东西;在这种情况下,这是一个语义差异(这仍然很重要,例如,对于常规数组,您可以使用sizeof()在 C 中查找其长度(以字节为单位),而如果您传递数组代替指针参数,则无法这样做)。

此外,即使函数的参数中包含数组类型,由于指针分解,传入数组时,函数内部的结果也不会相同,如 http://ideone.com/jAeAn 所示,如以下错误消息所示:http://ideone.com/yn0zc。

最新更新