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

时间:2012-08-08 18:36:27

标签: c++ arrays pointers

根据this

  当数组时,

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

如果上述陈述为真,那么& array 的数据类型如何与 array & array [0] 但是这三个在以下声明中具有相同的值。

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

提前致谢。

4 个答案:

答案 0 :(得分:4)

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

当抽象C ++机器评估像

这样的东西时
int a = 2, b = 3, c = 4;
int i = (a + b) * c;

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

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

目前尚不清楚您要通过&array引用表达的内容。表达式&array不涉及数组到指针的转换,这意味着它与所讨论的问题毫无关系。

答案 1 :(得分:3)

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

给出声明

    int array[10];

&array的类型为int (*const)[10]&array[0]的类型为int *const == {衰变的表达式中array的类型。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

另外,即使一个函数的参数中有一个数组类型,当传入一个数组时,由于指针分解,结果在函数内部的结果也不一样,如图所示在此处出现错误消息:http://ideone.com/jAeAn