以下示例来自Wikipedia.
int arr[4] = {0, 1, 2, 3};
int* p = arr + 5; // undefined behavior
Run Code Online (Sandbox Code Playgroud)
如果我从不取消引用p,那么为什么arr + 5单独的未定义行为?我希望指针表现为整数 - 除了取消引用时,指针的值被视为内存地址.
标准规定:
除非两个指针指向同一个数组对象的元素或者指向数组对象的最后一个元素之后,否则行为是未定义的.
为什么在最后一个元素之后引用一个是有效的?
考虑下面的 C 代码。
#include <stdio.h>
int main(){
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
printf("\n%u, %u, %u", x,&x,*x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,每个 printf 语句都打印相同的值,如下所述。
6356724, 6356724, 6356724
6356688, 6356688, 6356688
Process returned 0 (0x0) execution time : 0.128 s
Press any key to continue.
Run Code Online (Sandbox Code Playgroud)
我想知道每个 printf 语句的结果如何相同。这是我对二维数组内存布局的理解。

现在我相信 x+3 指的是( x + 3 * 指针算术所需的大小) = 24 和 *(x +3 ) = *(24) = 2036 …