#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)。
int *p = (int*) 60;
你可能已经知道了这一点;这样做的危险在于:你怎么知道地址60上实际存储了一个整数?
*p = 20
- user12392751您正在创建两个指针值,然后进行指针数学运算。显然,在您的系统上sizeof(int)
为4字节,因此两个指针值之间的距离为5。
p
和q
都是指向int的指针。p
指向内存地址60,q
指向内存地址40。当你从q
中减去p
时,结果是介于它们之间有多少个4字节的int
,在这种情况下是5个。这样做是为了使指针与数组一起使用更容易,如果它们在同一个数组中。
请参阅this site获取有关指针算术的更多信息。
p
是指向地址空间开始处偏移 60 字节处的int
类型指针。q
是指向地址空间开始处偏移 40 字节处的int
类型指针。它们之间的差值为 20 字节,或者说20/sizeof(int) = 5
个int
元素大小。 - Hristo Iliev