2

可能重复:
带指针的 C 问题

我需要一些关于指针的帮助,特别是以下示例:

#include <stdio.h>
int main()
{
    int *i, *j;

    i = (int *) 60;
    j = (int *) 40;
    printf("%d", i - j);

    return 0;
}

此代码生10成为输出。我只需要知道这里到底i - j做了什么。

4

6 回答 6

11

i和分别j指向内存位置6040

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

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

于 2012-08-02T14:59:05.960 回答
3

该程序可能应该打印和之间的指针差异6040转换为指向的指针int。指针差异是从地址到地址(不包括)int可以放入数组中的 s的数量。4060

也就是说,该程序违反了 C 标准。指针算术是未定义的,除非指针指向相同的 ( static,自动或malloc'd) 数组,并且您不能可靠地打印指针差异%d(使用%td代替)。

于 2012-08-02T15:01:13.490 回答
1

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

的结果10表明您正在使用2 字节整数的系统上运行它: 和 之间有 20 个内存地址ij并且您的代码会打印,因此两个地址之间10102 字节。ints

但是在另一个系统上,使用 4 字节整数,这将打印:和之间的520 个内存地址,因此两个地址之间有4 字节ij5 ints

于 2012-08-02T15:00:56.300 回答
0
printf("%d",i-j); return 0;

i 和 j 都是指向整数的指针。因此它们遵循指针算术。根据指向整数的指针数学指针总是移位 sizeof(int)。我认为你使用 gcc 编译器,其中 sizeof int 为 4。所以 60-40=20 但单位为 4,所以输出为 5。

但是如果您使用 sizeof int 为 2 的 turbo c,则输出为 10。

笔记

如果指针包含在某些表达式评估中,则它们遵循指针算术。

于 2012-08-02T15:03:52.907 回答
-1

ianj是指向 int 变量的指针,这意味着它将存储 int 变量的虚拟地址。

如果我们对该变量进行任何指针算术运算,它将根据所指向的变量类型的大小进行预演。例如,如果 int 的大小为 4 字节,则将i++值从60to增加。64

所以你得到 10 i - j,这意味着 int 的大小在你的环境中是 2 。总是i - j会给你多少元素(类型int)可以容纳在那个范围内。

int所以在 60 到 40 之间,如果大小int为 2 个字节,我们可以存储 10 个类型的元素。

于 2012-08-02T18:08:00.713 回答
-3

首先,声明了两个整数指针,分别称为 i 和 j。请注意,它们的值是存储指针的内存地址,而不是整数本身(指针的概念)。

接下来,指针 i 和 j 分别更改为 60 和 40。现在这代表内存中的一个点,而不是整数 60 和 40,因为 i 和 j 从未被取消引用。

然后它打印 ij 的内存地址,这将减去这两个内存地址。

于 2012-08-02T14:59:52.530 回答