3

据此_

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

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

int array[10];

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

提前致谢。

4

4 回答 4

4

我看不出你从哪里得到指针必须存储在某个地方的想法。出于什么目的?没有 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不涉及数组到指针的转换,这意味着它与所讨论的问题完全无关。

于 2012-08-08T18:57:49.280 回答
3

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

鉴于声明

    int array[10];

的类型&arrayint (*const)[10]其中的类型&array[0]int *const==array表达式中它衰减的类型。

于 2012-08-08T18:47:36.973 回答
2

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

于 2012-08-08T18:48:21.377 回答
1

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

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

此外,即使函数在其参数中具有数组类型,由于指针分解,如http://ideone.com/jAeAn所示,当传入数组时,函数内部的结果也不相同,如显示在此处的错误消息中:http: //ideone.com/yn0zc

于 2012-08-08T18:43:52.180 回答