Mar*_*cel 9 c c++ arrays pointers pointer-arithmetic
我想知道它*(&array + 1)是如何工作的.我认为这是一种计算数组长度的简单方法,并希望在使用之前正确理解它.我对指针算法不是很熟悉,但是我的理解 &array给出了数组第一个元素的地址.(&array + 1)会在地址方面转到数组的末尾.但是不应该*(&array + 1)给出这个地址的价值.相反,它打印出地址.我真的很感谢你的帮助,让我的脑袋里的指针清晰.
这是我正在研究的一个简单例子:
int numbers[] = {5,8,9,3,4,6,1};
int length = *(&numbers + 1) - numbers;
Run Code Online (Sandbox Code Playgroud)
表达式&numbers为您提供数组的地址,而不是第一个成员(尽管在数字上它们是相同的).此表达式的类型是int (*)[7],即指向大小为7的数组的指针.
表达式&numbers + 1将sizeof(int[7])字节添加到地址array.结果指针指向数组后面.
然而问题是当你用这个指针取消引用时*(&numbers + 1).取消引用指向一个元素超过数组末尾的指针会调用未定义的行为.
获取数组元素数量的正确方法是sizeof(numbers)/sizeof(numbers[0]).这假定数组是在当前范围内定义的,而不是函数的参数.
(此答案适用于C ++。)
&numbers是指向数组本身的指针。它具有类型int (*)[7]。&numbers + 1是一个指向数组之后字节的指针,该数组int位于另一个7 s 数组所在的位置。它仍然具有类型int (*)[7]。*(&numbers + 1)取消引用此指针,产生一个左值类型的值,该值int[7]引用数组后的字节。*(&numbers + 1) - numbers注意:使用-运算符会强制两个操作数都进行数组到指针的转换,因此可以减去指针。*(&numbers + 1)转换为int*指向数组后面字节的指针。numbers转换为int*指向数组第一个字节的指针。它们的区别是int两个指针之间的ints 数- 数组中的s 数。编辑:尽管没有由指向的有效对象&numbers + 1,这就是所谓的“过去”指针。如果p是T指向有效类型为的对象的指针T,则p + 1即使它*p可能是单个对象,也可能是数组末尾的对象,对它进行计算始终是有效的。在这种情况下,您将获得“过去”指针,该指针不指向有效对象,但仍然是有效指针。您可以将此指针用于指针算术,甚至取消引用它以产生一个左值,只要您不尝试通过该左值读取或写入即可。注意,您只能在对象的末尾再过一个字节。尝试任何进一步的行为都会导致不确定的行为。