#include <stdio.h>
int main()
{
int *p = (int*) 60; --- Line 1
int *q = (int*) 40; --- Line 2
printf("%d", p-q); //Output is 5
return 0;
}
有人可以向我解释一下这个程序的输出吗?
这意味着将整数值分配给指针的(实现定义的)动作发生。这通常意味着p
指向 的内存地址60
和q
的地址40
。这些内存地址可以在虚拟内存、硬件内存中,并且许多实现对这些有不同的转换例程。
由于这是实现定义的,因此任何事情都可能发生,正如您的实现所描述的那样。
肯定不是,它在嵌入式硬件编程中被大量用于访问某些功能或调用内置函数。
您的系统上最有可能int
是 4 个字节宽,因此p - q
等于(60 - 40) / 4 == 5
.
它p
指向内存地址60
并q
指向内存地址40
。那么大概你的架构有 4 字节int
,所以p - q
等于5
((60 - 40) / 4)。
您正在创建两个指针值,然后进行指针数学运算。显然sizeof(int)
在您的系统上是 4 个字节,所以两个指针值之间的距离是 5。
每个指针p
和q
都是一个指向 int 的指针。p
指向内存地址 60 和q
内存地址 40。当从 中减去q
时p
,结果是中间有多少个 4 字节int
,在本例中为 5。这样做是为了使使用带有数组的指针更容易,如果它们是在同一个数组中。
有关指针算法的更多信息,请参阅此站点。
该语句声明了一个指向地址 60 处的整数的指针
int *p = (int*) 60;
您可能已经知道这一点;这样做的危险在于:你怎么知道地址 60 处实际存储了一个整数?
int 指针初始化是为了确保指针指向整数的内存地址,在这种情况下,指针 p 和 q 分别为内存位置 60 和 40。
输出给您的是内存位置的差异。通常您期望 60-40 为 20,但在这种情况下,您得到 5,因为在您的机器中每个整数占用 4 个字节或 32 位。
所以你可以这样想:第一个整数在 40 处占 4 个位置,所以下一个整数在 44 处,然后是 48,然后是 52。因此,当获取内存位置的差异时,程序将每个 4 字节块作为 1块和 40 和 60 之间有 5 个块的差异。
在指针数学中,这可以像 abs(mem_location1 - mem_location2)/sizeof(int) 一样获得(即整数占用的字节数)。
HTH。:)