数组下标符号和解除防御

Array subscript notation and derefencing

本文关键字:和解 下标 符号 数组      更新时间:2023-10-16

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

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

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

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

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

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

是的。同样地,它只是意味着"在数组的地址上加1",因为解引用然后取地址会得到你开始的地址。

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

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

int* ptr = &array[1];

等价于:

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

*(array+1)匹配数组的第二个单元格。那么你就影响了这个单元格的地址到你的指针。你所做的相当于:

int* ptr = array+1

是。您将发现可以设置int* arrPtr=array;,这意味着可以将array视为指针。array[1];的意思是"将指针指向数组array的起点,将其移动1,然后解引用"。&array[1];表示"获取指向该解引用值的指针"。array[1];相当于*(array+1);

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