我想知道 *(&array + 1)
是如何工作的。我认为这是计算数组长度的一种简单方法,并希望在使用它之前正确理解它。我对指针运算不是很有经验,但根据我的理解,&array
给出了数组第一个元素的地址。 (&array + 1)
将根据地址到达数组的末尾。但是 *(&array + 1)
不应该给出这个地址的值。相反,它打印出地址。非常感谢您的帮助,让我头脑中的指针内容变得清晰。
这是我正在处理的简单示例:
int numbers[] = {5,8,9,3,4,6,1};
int length = *(&numbers + 1) - numbers;
最佳答案
(此答案适用于 C++。)
&numbers
是指向数组本身的指针。它的类型为int (*)[7]
。&numbers + 1
是指向数组后面字节的指针,另一个 7 个int
数组将位于该字节。它的类型仍然是int (*)[7]
。*(&numbers + 1)
取消引用该指针,产生一个int[7]
类型的左值,指向数组后面的字节。*(&numbers + 1) - numbers
:使用-
运算符强制两个操作数进行数组到指针的转换,因此可以减去指针。*(&numbers + 1)
被转换为指向数组后字节的int*
。numbers
被转换为指向数组第一个字节的int*
。它们的区别在于两个指针之间int
的个数——也就是数组中int
的个数。
编辑:虽然 &numbers + 1
没有指向有效的对象,但这就是所谓的“结束”指针。如果 p
是指向 T
的指针,指向类型为 T
的有效对象,那么计算 p + 1 总是有效的
,即使 *p
可能是单个对象,也可能是数组末尾的对象。在那种情况下,您会得到一个“越过终点”的指针,它不指向一个有效的对象,但仍然是一个有效的指针。您可以将此指针用于指针运算,甚至取消引用它以生成左值,只要您不尝试读取或写入该左值即可。请注意,您只能在对象末尾后移动一个字节;试图走得更远会导致未定义的行为。
关于c++ - 通过指针算法计算数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52726320/