据此_
当数组衰减为指针时,指针不会存储为数组本身(或内存中的任何其他位置)的一部分。
如果上述陈述为真, &array的数据类型怎么可能不同于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++ 中的非物质表达式结果称为rvalues。通常未指定右值所在的位置。在计算上述表达式的过程中, 的值5
可能会在某个 CPU 寄存器中出现片刻。或者,如果编译器决定这样做,它甚至可能临时存储在一些未命名的内存区域中,但这不是您在 C++ 代码级别可以看到的。
数组到指针转换产生的指针也是如此。该指针只是一个右值——一个不在内存中任何位置的临时值。它根本不需要存在于内存中的任何地方。
目前尚不清楚您要通过&array
引用来表达什么。表达式&array
不涉及数组到指针的转换,这意味着它与所讨论的问题完全无关。
当您在 expression 上使用 address-of 运算符时array
, expressionarray
不会衰减为指针(当您使用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。