根据这个
当数组时,指针不存储为数组本身(或内存中的任何其他位置)的一部分 衰减到指针。
如果上述语句为真,那么 &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 可以看出,&array
、array
和 &array[0]
都表示相同的值:数组中第一个元素的内存地址。
然而,仅仅因为两个值相同并不意味着它们代表相同的东西;在这种情况下,这是一个语义差异(这仍然很重要,例如,对于常规数组,您可以使用sizeof()
在 C 中查找其长度(以字节为单位),而如果您传递数组代替指针参数,则无法这样做)。
此外,即使函数的参数中包含数组类型,由于指针分解,传入数组时,函数内部的结果也不会相同,如 http://ideone.com/jAeAn 所示,如以下错误消息所示:http://ideone.com/yn0zc。