数组int a[n] 里 a 与 a+1 这两个地址相差了4 但是为什么 a+1-a 不是4 而是 1

 我来答
linym66
2018-07-01 · TA获得超过778个赞
知道小有建树答主
回答量:263
采纳率:89%
帮助的人:129万
展开全部
int a[n];

上面一行代码声明了一个整数数组,数组名是a。其实这里的a是个地址,是数组第0个(首个)元素的地址。

int b = a[2]; //这里用 2 举例是为了避开 0 和 1 的特殊性,方便理解。

这行“令b等于a[d]”的过程其实是:把 a 这个地址 和 2 进行名为“[]” 的运算,返回新地址的内容”。过程是这样的:

  1. a地址指向的内容是整数(从声明中知道), 因此sizeof(int) 得到4 ,意思是判断出一个int值占 4 字节。

  2. "[]"运算其实是把地址a 和 4×下标相加。这里得到的就是 "a + 8(字节)"的地址位置。

  3. 返回“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。

因此在实际运用中,把两个已知类型的,类型相同的地址相加减就能得出它们的距离了。这里的距离的单位是这个类型占用的字节数。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式