在C
中考虑以下内容&arr[0] => 0022FEB0
我的系统使用4个字节来存储int数据。
现在&arr[1]=>0022FEB4
并且在运行时int diff=&arr[1]-&arr[0];
现在
1
存储在差异中的值为4
而不是{{1}}。
为什么?
答案 0 :(得分:6)
这就是指针的工作方式。您没有计算字节差异。你正在计算元素数量的差异。
要获取元素大小,请使用sizeof(*arr)
要获得字节差异,请使用(&arr[1]-&arr[0]) * sizeof(*arr)
答案 1 :(得分:3)
我认为你想要的是这个:
int diff = (&arr[1]-&arr[0]) * sizeof(int);
当您告诉编译器您正在使用的数据类型时,它将在算术中考虑它。
答案 2 :(得分:2)
您没有计算字节差异。要计算字节差异,StackOverflow上已有答案。 这是一个回答Getting the difference between two memory addresses
的链接答案 3 :(得分:1)
编译器知道那些指向int
。
#include <stdio.h>
#include <stddef.h>
int main(void) {
int arr[]= {1,2,3,4,5};
/*
int diff=&arr[1]-&arr[0];
In your system, there's a 4 byte difference in memory, so you'd get diff = 1
here because the compiler knows they're ints so the result is diff/sizeof(int)
*/
uintptr_t firstNumAddress = (uintptr_t)&arr[0];
uintptr_t secondNumAddress = (uintptr_t)&arr[1];
ptrdiff_t ptrDiff = secondNumAddress - firstNumAddress;
printf("%lu - %lu = %ti\n", secondNumAddress, firstNumAddress, ptrDiff);
return 0;
}
答案 4 :(得分:1)
您正在进行指针运算,而不是整数运算。
要进行整数算术,只需将地址转换为指针大小相同的整数类型(在32位系统中,可以是4个字节;在64位中,可以是8个字节)。
例如,在C中,只需执行:
int diff = (uintptr_t) &arr[1] - (uintptr_t) &arr[0];
你得到的是字节差异。
答案 5 :(得分:-1)
与中国相同
int diff =(*)(a+1-0)
它是产生结果的代码源。