指针递增如何工作?

How does pointer incrementation work?

我们有一个数组:int p[100]
为什么 p[i] 等同于 *(p+i) 而不是 *(p+i*sizeof(int))

Why p[i] is equivalent to *(p+i) and not *(p+i*sizeof(int)) ?

因为*(p+i)也和*((int *) ((char *) p + i * sizeof (int)))一样。当您向指针添加一个整数 i 时,指针将移动 i 指向对象大小的倍数。

数组元素是连续存储的。

*(p+i)

这里p是数组p的基地址,i的范围是0到99。

因此您可以通过递增 i.

来迭代 p 的元素

这是因为在将 i 添加到 p 之前,编译器会在内部计算数据类型 p 指向的大小,然后将其添加 i 次到 p.

Why p[i] is equivalent to *(p+i) and not *(p+i*sizeof(int))?

这是因为指针算法的工作方式:将整数 n 添加到指针会产生指向第 n 元素 的指针(不是字节)从第一个开始(从 0 开始)。

Why p[i] is equivalent to *(p+i) and not *(p+i*sizeof(int)) ?

因为某些处理器体系结构无法取消引用未指向按其类型大小对齐的地址的指针。这基本上意味着指向 4 字节整数应始终指向 4 的倍数的地址。

当程序试图取消引用未对齐的指针时,可能会导致 "Bus error"。您可以阅读更多相关信息 here on Wikipedia

您要求的是 p + 1 应该将指针递增一个字节而不是一个元素。如果语言是这样设计的,那么写 p++ 将不再对 char 以外的其他类型的指针有效。当程序员忘记写 * sizeof(*p) 来进行加法时,它还会导致指针对齐出现大问题。

这可能会令人困惑,但有非常充分的理由可以说明为什么以这种方式设计语言。