数组下标表示法和解除引用

时间:2013-06-12 13:34:20

标签: c++

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

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

&array[1]是否意味着我获取数组的地址并向其添加1,请求该地址以查看实际的整数,然后获取存储在该地址中的整数的地址?

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

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

4 个答案:

答案 0 :(得分:6)

int* ptr = &array[1];

相当于:

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

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

int* ptr = array+1

答案 1 :(得分:5)

  

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

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

  

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

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

答案 2 :(得分:0)

是。您会发现可以设置int* arrPtr=array;,这意味着可以将array视为指针。 array[1];表示“将指针指向数组array的开头,将其移到一位,然后取消引用。&array[1];表示”获取指向该解除引用值的指针。“array[1];相当于*(array+1);

答案 3 :(得分:0)

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