说我有以下代码:
int main() {
char *a = malloc(4 * sizeof(char));
int b = 0;
b = (a + 1) - a;
printf("%dn", 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]
之间的距离是一个双重大小。
当您具有相同类型的2个指针(理想情况下,指向同一数组的元素)时,从较高的指针中减去下部指针会给您带来距离元素的数量)之间。这是指针算术的关键特征。因此,在您的示例中,从a+1
中减去a
给您1的结果,因为两个地址之间有1个元素指向(结果为1,无论您使用char*
还是double*
POINTERS)。
这是简单的算术。(a+1)-a
表达式可以简化为1
。如果您首先将其重写为(a-a) + 1
,可以很容易地看到。这等于sizeof (char)
,因为char
的大小始终为1。
(请注意,此推理可能并不总是适用于指针算术。a-a
是0
,但a+a
无效。)