#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;
}
有人可以向我解释这个程序的输出吗?
答案 0 :(得分:9)
这意味着为指针分配整数值的(实现定义的)操作发生。这通常意味着p
指向60
的内存地址和q
处40
的地址。这些内存地址可能位于虚拟内存,硬件内存中,许多实现都有不同的转换例程。
由于这是实现定义的,所以可能会发生任何事情,如您的实现所述。
绝对不是,在嵌入式硬件编程中使用 lot 来访问某些功能或调用内置函数。
您的系统int
上最有可能是4字节宽,因此p - q
等于(60 - 40) / 4 == 5
。
答案 1 :(得分:8)
它使p
指向内存地址60
,q
指向内存地址40
。那么大概你的架构有4字节int
s,所以p - q
等于5
((60 - 40)/ 4)。
答案 2 :(得分:1)
您正在创建两个指针值,然后执行指针数学运算。显然你的系统sizeof(int)
是4个字节,所以两个指针值之间的距离是5。
答案 3 :(得分:1)
每个指针p
和q
都是指向int的指针。 p
指向内存地址60,q
指向内存地址40.当您从q
中减去p
时,结果是多少4字节int
适合介于两者之间,在这种情况下5.如果它们在同一个数组中,则可以更容易地使用带有数组的指针。
有关指针算法的更多信息,请参阅this site。
答案 4 :(得分:1)
该语句声明一个指向地址为60的整数的指针
int *p = (int*) 60;
你可能已经知道了;这样做的危险是:你怎么知道在地址60存储了一个整数?
答案 5 :(得分:0)
int指针初始化是为了确保指针指向整数的内存地址,在这种情况下,内存位置60和40分别用于指针p和q。
输出的结果是内存位置的差异。通常你希望60-40是20,但在这种情况下,你得到5,因为在你的机器中每个整数占用4个字节或32位。
所以你可以这样想:40处的第一个整数需要4个位置,所以下一个整数是44,然后是48,然后是52.因此,当得到内存位置的差异时,程序需要每4个字节阻塞为1个块,并且在40到60之间存在5个块的差异。
在指针数学中,这可以像abs(mem_location1 - mem_location2)/ sizeof(int)一样获得(即整数占用的字节数)。
HTH。 :)