一些指针澄清

时间:2012-08-02 14:53:14

标签: c pointers

  

可能重复:
  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到底在做什么。

6 个答案:

答案 0 :(得分:11)

ij分别指向内存位置6040

你在这里做的是指针减法。如果ij是字节指针(char *),i-j将是20,正如人们所期望的那样。

但是,对于其他指针,它会返回两个指针之间元素的数量。在大多数系统上,(int *)60 - (int *)40将为5,因为在这20个字节中有5个4字节整数的空间。显然,您的平台有16位整数。

答案 1 :(得分:3)

该程序可能会打印6040之间的指针差异,转换为指向int的指针。指针差异是从地址int到地址40(不包括)的数组中适合60的数量。

那就是说,该程序违反了C标准。指针算法是未定义的,除非指针指向相同的(static,自动或malloc'd)数组,并且您无法可靠地打印与%d的指针差异(使用{{1}而不是)。

答案 2 :(得分:1)

这是指针算术,代码i - j减去两个指向int 的指针。这种算法知道所涉及的数据大小,因此在这种情况下将返回两个地址之间ints的数量。

10的结果表示您在具有 2字节整数的系统上运行此操作:ij之间的20个内存地址,并且您的代码打印10,因此两个地址之间有10个2字节ints

但在另一个系统上,使用4字节整数,这将打印5ij之间的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的内存地址,它将减去这两个内存地址。