1

大家好,我对以下代码有疑问,想验证我的一些断言。

int array[] = {1,2,3,4};
int* ptr = &array[1];

是否&array[1]意味着我得到了数组的地址并将其加 1,尊重该地址以查看实际的整数,然后获取存储在该地址中的整数的地址?

这是怎么做到的?数组是否有一个 operator[](int index) 返回一个引用,然后我们获取它的地址?

我想了解机器实际上在做什么以及为此的语言语义。

4

4 回答 4

6
int* ptr = &array[1];

相当于:

int* ptr = & ( *(array + 1) );

*(array+1)匹配数组的第二个单元格。然后你将这个单元格的地址影响到你的指针。你在做什么相当于:

int* ptr = array+1
于 2013-06-12T13:38:49.670 回答
6

这是否意味着获取数组的地址并将其加 1,取消引用该地址以查看实际整数,然后获取存储在该地址中的整数的地址?

是的。等效地,它只是意味着“将一个添加到数组的地址”,因为取消引用然后获取地址会为您提供您开始使用的地址。

这是怎么做到的?数组是否有一个 operator[](int index) 返回一个引用,然后我们获取它的地址?

几乎。内置的下标运算符,当用于将索引应用于指针 asp[i]时,被定义为给出引用的左值*(p+i)。当应用于数组时,数组首先被转换为指向其第一个元素的指针。这是标准的隐式转换之一:数组到指针的转换,有时称为“衰减”。取左值的地址会给出一个指向数组元素的指针。

于 2013-06-12T13:39:12.457 回答
0

是的。你会发现你可以设置int* arrPtr=array;,意思是array可以当作一个指针来对待。array[1];表示“获取指向数组开头的指针array,将其移到一个,然后取消引用。&array[1];表示“获取指向该取消引用值的指针。”array[1];相当于*(array+1);.

于 2013-06-12T13:37:34.193 回答
0

可能由于不同的可能类型,数组索引首先被执行(读取:array[1]首先是'get'),然后&开始执行并获取地址。如果您有 a long long,则获取的地址array[0]并向其添加 1 您将从另一个对齐读取前 8 个字节(您正在读取第一个索引的最后 3 个字节,然后是第二个索引的 7 个字节)

于 2013-06-12T13:38:06.573 回答