根据this
当数组时,指针不会作为数组本身(或内存中的任何其他位置)的一部分存储 衰败到指针。
如果上述陈述为真,那么& array 的数据类型如何与 array 或& array [0] 但是这三个在以下声明中具有相同的值。
int array[10];
我认为当编译器静默地将数组衰减到指针时,它应该给指针一些内存地址。如果不是,那么指针存储在哪里?
提前致谢。
答案 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可以看出,&array
,array
和&array[0]
都表示相同的值:数组中第一个元素的内存地址。< / p>
然而,仅仅因为两个值相同并不意味着它们代表相同的东西;在这种情况下,它是一个语义差异(这仍然很重要,例如,使用常规数组,您可以使用sizeof()
在C中查找其长度(以字节为单位),而您不能这样做如果你传递数组代替指针参数。)
另外,即使一个函数的参数中有一个数组类型,当传入一个数组时,由于指针分解,结果在函数内部的结果也不一样,如图所示在此处出现错误消息:http://ideone.com/jAeAn。