可能重复:
C question with pointers
我需要一些指针帮助,特别是以下示例:
#include <stdio.h>
int main()
{
int *i, *j;
i = (int *) 60;
j = (int *) 40;
printf("%d", i - j);
return 0;
}
此代码生成10
作为输出。我只需要知道i - j
到底在做什么。
答案 0 :(得分:11)
i
和j
分别指向内存位置60
和40
。
你在这里做的是指针减法。如果i
和j
是字节指针(char *),i-j
将是20
,正如人们所期望的那样。
但是,对于其他指针,它会返回两个指针之间元素的数量。在大多数系统上,(int *)60 - (int *)40
将为5
,因为在这20个字节中有5个4字节整数的空间。显然,您的平台有16位整数。
答案 1 :(得分:3)
该程序可能会打印60
和40
之间的指针差异,转换为指向int
的指针。指针差异是从地址int
到地址40
(不包括)的数组中适合60
的数量。
那就是说,该程序违反了C标准。指针算法是未定义的,除非指针指向相同的(static
,自动或malloc
'd)数组,并且您无法可靠地打印与%d
的指针差异(使用{{1}而不是)。
答案 2 :(得分:1)
这是指针算术,代码i - j
减去两个指向int 的指针。这种算法知道所涉及的数据大小,因此在这种情况下将返回两个地址之间ints
的数量。
10
的结果表示您在具有 2字节整数的系统上运行此操作:i
和j
之间的20个内存地址,并且您的代码打印10
,因此两个地址之间有10
个2字节ints
。
但在另一个系统上,使用4字节整数,这将打印5
:i
和j
之间的20个内存地址,因此有5
两个地址之间的4字节 ints
。
答案 3 :(得分:0)
printf("%d",i-j); return 0;
i和j都是指向整数的指针。因此它们跟随指针的数学。 按指针数学指向整数的指针总是移位sizeof(int).I 认为你使用gcc编译器,其中sizeof int是4.So 60-40 = 20但是因为单位是4所以输出是 5。
但是如果你使用turbo c,其中sizeof int是2.t out out put是10。
如果指针包含在某些表达式评估中,那么它们会跟随指针的数学。
答案 4 :(得分:-1)
i
j
是指向int变量的指针,表示将存储int变量的虚拟地址。
如果我们对此变量执行任何指针算术,它将根据指向的变量类型的大小进行预编码。例如,如果int的大小为4个字节,i++
会将值从60
增加到64
。
因此i - j
得到10,这意味着你的环境中int的大小为2。始终i - j
将为您提供可以容纳该范围的元素(类型int
)的数量。
因此,如果int
的大小为2个字节,那么在60到40之间,我们可以存储10个int
类型的元素。
答案 5 :(得分:-3)
首先,声明两个称为i和j的整数指针。请注意,它们的值是存储指针的内存地址,而不是整数本身(指针的概念)。
接下来,指针i&amp; j分别变为60和40。现在这代表了记忆中的一个位置,而不是整数六十和四十,因为我和j从未被解除引用。
然后打印出i-j的内存地址,它将减去这两个内存地址。