c++ - 通过指针算法计算数组长度

标签 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;

最佳答案

(此答案适用于 C++。)

  1. &numbers 是指向数组本身的指针。它的类型为 int (*)[7]
  2. &numbers + 1 是指向数组后面字节的指针,另一个 7 个 int 数组将位于该字节。它的类型仍然是 int (*)[7]
  3. *(&numbers + 1) 取消引用该指针,产生一个 int[7] 类型的左值,指向数组后面的字节。
  4. *(&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/

相关文章:

Javascript - 所有数组都是文字吗?

java - Java 打印数组

c++ - 优化 switch 语句时出现 Visual Studio 2005 C 编译器问题

无法在结构中存储值(C 套接字编程中的服务器)

c++ - 序列化 : CArchive a CImage

c - 使用 fread 从 .txt 文件中读取 unsigned char 给出不同的值

java - 通过 java 套接字与 c 服务器的套接字

c - 传递数组而不是指向 C 中函数的指针

c++ - 委托(delegate)使用 boost asio TCP/IP 套接字

c++ - 引用数组的方法