指针减指针为什么等于下标如以下代码:为什么打印4(关键词-数组)

想问下同一个数组,指针减指针为什么等于下标
如以下代码:
为什么打印4,而不是4*4=16?

int main() {
    int arr[5] = { 0,1,2,3,4 };
    printf("%d", &arr[4] - &arr[0]);
}

因为是int型指针,你转换为void *就是16

#include <stdio.h>
 
int main() {
    int arr[5] = { 0,1,2,3,4 };
    printf("%d", (void *)&arr[4] - (void *)&arr[0]);
}
 

你理解是对的,但是这里它不是字节数。

这是因为在C语言中,指针相减操作会得到它们之间相隔的元素个数,而不是字节的个数。

在这个例子中,&arr[4]&arr[0]分别是数组arr中最后一个元素和第一个元素的地址。指针相减操作会得到它们之间相隔的元素个数,也就是4。

换成char或者long long也是一样的。

long long arr1[5] = { 0,1,2,3,4 };
printf("%d - %d = %u", &arr1[4], &arr1[0] ,&arr1[4] - &arr1[0]);
char arr2[5] = { '0','1','2','3','4' };
printf("%d - %d = %u", &arr2[4], &arr2[0] ,&arr2[4] - &arr2[0]);

指针运算是求元素个数,不是字节数

【以下回答由 GPT 生成】

在C语言中,使用指针进行减法运算得到的结果并不是指针的差值,而是指针之间相差的元素个数。这是因为指针是以字节为单位递增的,而不是以数组元素的个数递增的。

在上述代码中,&arr[0]表示数组第一个元素的地址,&arr[4]表示数组第五个元素的地址。两者相减的结果并不是20(即4乘以4得到的16),而是4。

这是因为在32位系统中,int类型的变量占用4个字节的内存空间。因此,指针之间相差的距离等于地址差值除以int类型的字节数。对于&arr[0]&arr[4],它们相差的距离是16个字节,除以4个字节的int类型大小,得到的结果是4。

因此,输出结果为4。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^