数组下标符号和解除防御
Array subscript notation and derefencing
大家好,我对下面的代码有一个问题,想验证一下我的一些断言。
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个字节)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 矢量下标超出SFML游戏中的范围
- 如何在C++程序中使用下标数字?
- 一组值的零开销下标运算符
- 运行时错误:矢量下标超出范围:正在检查空集
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 矢量无效下标.SFML
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 编译期间矢量下标超出范围
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在继承的模板类中使用下标 [] 运算符
- 对矢量来说是全新的.矢量下标超出范围
- 运算符重载多个任务的下标和赋值运算符
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- c++下标运算符到下级类向量
- C++十进制到十六进制(字符串下标超出范围)
- 创建结构体向量,表达式:向量下标超出范围
- 数组下标运算符 ([ ]) 对数组有什么作用?