我知道这个标题有很多问题,但我不是在寻找解决方案。我想知道为什么会这样。 我有这个作为解决方案
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
int index = pos - points;
但是当我使用该代码时,我收到警告隐式转换会丢失整数精度:"long"到"int"。现在当我使用长而不是索引的数据类型时
int points[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *pos = points + 5;
long index = pos - points;
它没有给出任何警告。我尝试使用长,因为我记得一些关于指针和长的东西。但是指针没有数据类型(如果我错了,请纠正我)。点和 *pos 都使用 int 初始化。那么为什么长拟合和 int 没有呢?
为什么他们在解决方案中使用 int?解决方案是错误的还是关于xCode(我正在使用)?
谢谢你的回答
但是当我使用该代码时,我收到警告隐式转换会丢失整数精度:"long"到"int"。
这意味着在您的平台上,两个指针的差异是long
型 .
我尝试使用长,因为我记得一些关于指针和长的东西。但是指针没有数据类型(如果我错了,请纠正我)。
你错了,所有东西都有 C 中的类型,指针有指针类型。两个指针之间的区别是有符号整数类型,但标准没有指定哪一个,不同的平台将使用不同的类型。
但是该标准通过名称ptrdiff_t
(在stddef.h
中定义)指定一个typedef
,必须将其定义为指针差的有符号整数类型,因此这是您应该用于所显示代码类型的类型。
点和 *pos 都使用 int 初始化。那么为什么长拟合和 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);
在此示例中,您知道结果可以用int
表示,因此您可以通过显式强制转换来转换它。但一般不要这样做。
index = pos - points;
是两个指针之间的减法,其中类型必须ptrdiff_t
。
以下是 C11 标准委员会草案 N1570 § 6.5.6 中的描述:
9 .当减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组最后一个元素的对象 对象;结果是两者下标的差异 数组元素。结果的大小是实现定义的,并且 其类型(有符号整数类型)ptrdiff_t在
<stddef.h>
标头。
在您的系统中,碰巧类型ptrdiff_t
可能是long
typedef
,就像 @FelixPalmen 的评论中提到的那样,这就是为什么当您将index
声明为int
时编译器会抱怨的原因。