数组int a[n] 里 a 与 a+1 这两个地址相差了4 但是为什么 a+1-a 不是4 而是 1
int a[n];
上面一行代码声明了一个整数数组,数组名是a。其实这里的a是个地址,是数组第0个(首个)元素的地址。
int b = a[2]; //这里用 2 举例是为了避开 0 和 1 的特殊性,方便理解。
这行“令b等于a[d]”的过程其实是:把 a 这个地址 和 2 进行名为“[]” 的运算,返回新地址的内容”。过程是这样的:
a地址指向的内容是整数(从声明中知道), 因此sizeof(int) 得到4 ,意思是判断出一个int值占 4 字节。
"[]"运算其实是把地址a 和 4×下标相加。这里得到的就是 "a + 8(字节)"的地址位置。
返回“a + 8(字节)”的内容,赋值给 b 变量。
上面的“a + 8(字节)”是地址的运算,但是在表达式里面可不能这样写。表达式里,地址和整数的运算会把整数和地址指向的类型换算成同一个单位。举例:
int a[] = {1, 2, 3};
int* address1 = &(a[0]);
int* address2 = &(a[1]);
int ans = address2 - address1; // ans = 4 / sizeof(int); ans 等于 1
int ans2 = int(address2 - address1); //显式转换成整数。
ans 和 ans2 都是以“sizeof(类型)个字节”为单位的。这里是4个字节,他们的结果完全一样,只不过ans的写法用了隐式的类型转换。把地址作差得到的差值除以了这个类型的大小,变成了整数。
你还可以尝试一下bool类型。bool类型占用一个字节。
bool b[] = {0, 1, 1};
bool * address3 = &(b[0]);
bool * address4 = &(b[1]);
int ans3 = address4 - address 3;
得到ans3仍然是1。因为bool占用一个字节,地址作差后除以1得到的就是1.
表达式 "(address3 + 1) == address4"为真。因为1被换算成了 1 * sizeof(bool) 还是1。
因此在实际运用中,把两个已知类型的,类型相同的地址相加减就能得出它们的距离了。这里的距离的单位是这个类型占用的字节数。