Say I had the following code:
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) ?
}
I don't really understand how b = (a + 1) - a
is equal to sizeof(char)
. If I changed it from char*
to say double*
, it would then be sizeof(double).
答案 0 :(得分:2)
When you add a value to a pointer, the resulting pointer points to a different array element. In this case a
points to array index 0, so a + 1
points to array index 1.
When you then subtract one pointer from another, the result is the difference in the array indexes. So b
will always be 1 regardless of the type of the pointer. Changing a
to have type double *
won't change the result.
答案 1 :(得分:1)
a
是指向char
数组的指针。 a[0]
是数组的第一个元素,a[1]
是数组的第一个元素。 a[0]
和a[1]
之间的距离是一个字符大小。
现在a[0]
等效于*a
,a[1]
等效于*(a+1)
。
如果将a
的类型更改为double *
,则它变成指向double
数组的指针,应用上述逻辑,您将获得{ {1}}和a[0]
为两倍大小。
答案 2 :(得分:1)
当您有2个相同类型的指针(理想情况下,指向同一数组的元素)时,从较高的指针中减去较低的指针将为您提供之间的距离(元素数)他们。这是指针算法的关键功能。因此,在您的示例中,从a
中减去a+1
得到的结果为1,因为所指向的两个地址之间有1个元素(无论您使用char*
还是返回1 double*
个指针。)
答案 3 :(得分:1)
这是简单的算法。表达式(a+1)-a
可以简化为1
。如果您首先将其重写为(a-a) + 1
,则很容易看到。这等于sizeof (char)
,因为char
的大小始终为1。
(请注意,这种推理可能并不总是适用于指针算术。a-a
是0
,但是a+a
无效。)