#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[]={10,20,30,40,50,60,70};
int *i,*j,*k;
k=2686703;
i=&arr[1];
j=&arr[5];
printf("%d\n%d\n",i,j) ;
printf("%d\n",j-i);
printf("%d",*(k));
return 0;
}
输出:
2686700
2686716
garbage value
为什么j和i之间的差异= 4而不是16?如果为数组中的每个整数保留4个字节,为什么它们的垃圾值与此中间地址相对应?
答案 0 :(得分:2)
为什么j和i之间的差异是4而不是16,如果为数组中的每个整数保留4个字节
因为这是指针算术的工作方式:它将sizeof(element)
除以差异。这简化了使用指针的编程,因为程序员更容易根据数组元素而不是原始字节来考虑偏移。
为什么垃圾值与此中间地址相对应
您取消引用指针k
,它被赋予一个未与任何整数对齐的值。一般来说,这是未定义的行为。但是,在您的情况下,您选择了一个恰好指向数组中间的值。根据系统的不同,结果可能是任何东西 - 从因未读对齐读取而崩溃到将有效字节重新解释为不同的整数。