我想知道*(&数组1)实际上是如何工作的.我认为这是一种计算数组长度的简单方法,并希望在使用之前正确理解它.我对指针算法不是很熟悉,但是我的理解&数组给出了数组第一个元素的地址. (& array 1)将根据地址到达数组的末尾.但不应该*(&数组1)给出该地址的值.而是打印出地址.我非常感谢你的帮助,让我的脑袋里的指针清晰.
这是我正在研究的简单示例:
int numbers[] = {5,8,9,3,4,6,1}; int length = *(&numbers + 1) - numbers;
解决方法
(这个答案是针对C.)
>& numbers是指向数组本身的指针.它的类型为int(*)[7].
>&数字1是指向数组后面的字节的指针,其中将定位另一个7个整数的数组.它仍然具有类型int(*)[7].
> *(& numbers 1)取消引用此指针,产生一个int [7]类型的左值,指向数组后面的字节.
> *(& numbers 1) – 数字:使用 – 运算符强制两个操作数进行数组到指针的转换,因此可以减去指针. *(&数字1)转换为指向数组后面的字节的int *.数字转换为指向数组第一个字节的int *.它们的区别在于两个指针之间的整数 – 这是数组中的整数.
编辑:虽然&数字1没有指向有效对象,但这就是所谓的“过去结束”指针.如果p是指向T的指针,指向类型为T的有效对象,则计算p 1始终有效,即使* p可能是单个对象,也可能是数组末尾的对象.在这种情况下,您会得到一个“过去结束”指针,该指针不指向有效对象,但仍然是有效指针.您可以将此指针用于指针算术,甚至取消引用它以产生左值,只要您不尝试读取或写入该左值即可.请注意,您只能在对象的末尾前进一个字节;试图进一步导致未定义的行为.