我知道这个标题有很多问题,但我不是在寻找解决方案.我想知道为什么会这样.我将此作为解决方案
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = pos - points;
Run Code Online (Sandbox Code Playgroud)
但当我使用该代码时,我得到警告隐式转换失去整数精度:'long'到'int'.现在当我使用long作为索引的数据类型
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
long index = pos - points;
Run Code Online (Sandbox Code Playgroud)
它没有发出警告.我试着用很长时间,因为我记得一些关于指针和长期的东西.但是指针没有数据类型(如果我错了请纠正我).点和*pos都用int初始化.那么为什么long fit和int不呢?
为什么他们在解决方案中使用int?解决方案是错误的还是关于xCode(我正在使用)?
谢谢你的回答
小智 7
但当我使用该代码时,我得到警告隐式转换失去整数精度:'long'到'int'.
这意味着在您的平台上,两个指针的区别在于类型long.
我试着用很长时间,因为我记得一些关于指针和长期的东西.但是指针没有数据类型(如果我错了请纠正我).
你错了,一切都有一个类型C.指针有指针类型.两个指针之间的区别是有符号整数类型,但标准没有指定哪一个,不同的平台将使用不同的类型.
但是标准typedef通过名称ptrdiff_t(定义stddef.h)指定a ,必须将其定义为指针差异的有符号整数类型,因此这是您应该用于显示的代码类型的类型.
点和*pos都用int初始化.那么为什么long fit和int不呢?
类型指针指向的是与指针本身不同的东西.指针是地址,在您的系统上,地址可能大于int值.
为什么他们在解决方案中使用int?解决方案是错误的
是的,这是错的.如上所述,表达式pos - points是一些有符号整数类型,它可能int在某些平台上,但你不能假设.
当然,以下也可以:
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = (int)(pos - points);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,你知道结果可以用a来表示int,所以你可以通过显式转换来转换它.但不这样做,在一般.
index = pos - points;是两个指针之间的减法,类型必须是ptrdiff_t.
以下是C11标准委员会草案N1570§6.5.6的描述:
9.当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.结果的大小是实现定义的,其类型(有符号整数类型)是标头中定义的 ptrdiff_t
<stddef.h>.
在你的系统,它发生的类型ptrdiff_t可能是一个typedef以long在评论由@FelixPalmen喜欢提到的,这就是为什么当你声明的编译器是抱怨index的int.