可能重复:
带指针的 C 问题
我需要一些关于指针的帮助,特别是以下示例:
#include <stdio.h>
int main()
{
int *i, *j;
i = (int *) 60;
j = (int *) 40;
printf("%d", i - j);
return 0;
}
此代码生10
成为输出。我只需要知道这里到底i - j
做了什么。
i
和分别j
指向内存位置60
和40
。
你在这里做的是指针减法。如果i
并且j
是字节指针 (char *),i-j
将会是20
, 正如人们所期望的那样。
但是,对于其他指针,它返回两个指针之间的元素数。在大多数系统上,(int *)60 - (int *)40
应该是5
,因为这 20 个字节中有 5 个 4 字节整数的空间。显然,您的平台有 16 位整数。
该程序可能应该打印和之间的指针差异60
,40
转换为指向的指针int
。指针差异是从地址到地址(不包括)int
可以放入数组中的 s的数量。40
60
也就是说,该程序违反了 C 标准。指针算术是未定义的,除非指针指向相同的 ( static
,自动或malloc
'd) 数组,并且您不能可靠地打印指针差异%d
(使用%td
代替)。
这是指针算术,代码i - j
减去两个指向 int的指针。这种算法知道所涉及的数据大小,因此在这种情况下将返回ints
两个地址之间的数量。
的结果10
表明您正在使用2 字节整数的系统上运行它: 和 之间有 20 个内存地址i
,j
并且您的代码会打印,因此两个地址之间10
有10
2 字节。ints
但是在另一个系统上,使用 4 字节整数,这将打印:和之间的5
20 个内存地址,因此两个地址之间有4 字节。i
j
5
ints
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。
如果指针包含在某些表达式评估中,则它们遵循指针算术。
i
anj
是指向 int 变量的指针,这意味着它将存储 int 变量的虚拟地址。
如果我们对该变量进行任何指针算术运算,它将根据所指向的变量类型的大小进行预演。例如,如果 int 的大小为 4 字节,则将i++
值从60
to增加。64
所以你得到 10 i - j
,这意味着 int 的大小在你的环境中是 2 。总是i - j
会给你多少元素(类型int
)可以容纳在那个范围内。
int
所以在 60 到 40 之间,如果大小int
为 2 个字节,我们可以存储 10 个类型的元素。
首先,声明了两个整数指针,分别称为 i 和 j。请注意,它们的值是存储指针的内存地址,而不是整数本身(指针的概念)。
接下来,指针 i 和 j 分别更改为 60 和 40。现在这代表内存中的一个点,而不是整数 60 和 40,因为 i 和 j 从未被取消引用。
然后它打印 ij 的内存地址,这将减去这两个内存地址。