这个问题在这里已有答案:
说我有以下代码:
int main() {
char *a = malloc(4 * sizeof(char));
int b = 0;
b = (a + 1) - a;
printf("%d\n", b); // Why does this equal sizeof(char) ?
}
我真的不明白b = (a + 1) - a
是如何等于sizeof(char)
的。如果我将它从char*
更改为double*
,那么它将是sizeof(double)。
向指针添加值时,结果指针指向不同的数组元素。在这种情况下,a
指向数组索引0,因此a + 1
指向数组索引1。
然后,当您从另一个指针中减去一个指针时,结果就是数组索引的差异。因此,无论指针的类型如何,b
将始终为1。将a
更改为double *
类型不会改变结果。
a
是一个指向char
数组的指针。 a[0]
是数组的第一个元素,a[1]
是数组的第一个元素。 a[0]
和a[1]
之间的距离是一个字母大小。
现在a[0]
相当于*a
,而a[1]
相当于*(a+1)
。
如果你将a
的类型更改为double *
,那么它将成为指向double
数组的指针,应用上述逻辑,你将得到a[0]
和a[1]
之间的距离是一个双倍大小。
当你有两个相同类型的指针(理想情况下,指向同一个数组的元素)时,从较高指针中减去较低指针会得到它们之间的距离(元素数)。这是指针算法的一个关键特性。所以,在你的例子中,从a
中减去a+1
会得到1的结果,因为在指向的两个地址之间有1个元素(无论你使用char*
还是double*
指针,结果都是1)。
这是简单的算术。表达式(a+1)-a
可以简化为1
。如果您首先将其重写为(a-a) + 1
,则可以很容易地看到这一点。这等于sizeof (char)
,因为char
的大小总是1。
(请注意,这种推理可能并不总是适用于指针算法.a-a
是0
,但a+a
无效。)