大家好,我对以下代码有疑问,想验证我的一些断言。
int array[] = {1,2,3,4};
int* ptr = &array[1];
是否&array[1]
意味着我得到了数组的地址并将其加 1,尊重该地址以查看实际的整数,然后获取存储在该地址中的整数的地址?
这是怎么做到的?数组是否有一个 operator[](int index) 返回一个引用,然后我们获取它的地址?
我想了解机器实际上在做什么以及为此的语言语义。
大家好,我对以下代码有疑问,想验证我的一些断言。
int array[] = {1,2,3,4};
int* ptr = &array[1];
是否&array[1]
意味着我得到了数组的地址并将其加 1,尊重该地址以查看实际的整数,然后获取存储在该地址中的整数的地址?
这是怎么做到的?数组是否有一个 operator[](int index) 返回一个引用,然后我们获取它的地址?
我想了解机器实际上在做什么以及为此的语言语义。
int* ptr = &array[1];
相当于:
int* ptr = & ( *(array + 1) );
*(array+1)
匹配数组的第二个单元格。然后你将这个单元格的地址影响到你的指针。你在做什么相当于:
int* ptr = array+1
这是否意味着获取数组的地址并将其加 1,取消引用该地址以查看实际整数,然后获取存储在该地址中的整数的地址?
是的。等效地,它只是意味着“将一个添加到数组的地址”,因为取消引用然后获取地址会为您提供您开始使用的地址。
这是怎么做到的?数组是否有一个 operator[](int index) 返回一个引用,然后我们获取它的地址?
几乎。内置的下标运算符,当用于将索引应用于指针 asp[i]
时,被定义为给出引用的左值*(p+i)
。当应用于数组时,数组首先被转换为指向其第一个元素的指针。这是标准的隐式转换之一:数组到指针的转换,有时称为“衰减”。取左值的地址会给出一个指向数组元素的指针。
是的。你会发现你可以设置int* arrPtr=array;
,意思是array
可以当作一个指针来对待。array[1];
表示“获取指向数组开头的指针array
,将其移到一个,然后取消引用。&array[1];
表示“获取指向该取消引用值的指针。”array[1];
相当于*(array+1);
.
可能由于不同的可能类型,数组索引首先被执行(读取:array[1]
首先是'get'),然后&
开始执行并获取地址。如果您有 a long long
,则获取的地址array[0]
并向其添加 1 您将从另一个对齐读取前 8 个字节(您正在读取第一个索引的最后 3 个字节,然后是第二个索引的 7 个字节)