想问下同一个数组,指针减指针为什么等于下标
如以下代码:
为什么打印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。
【相关推荐】