“int *p = (int*) 60” 是什么意思?

15
#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;
}

请问有人能解释一下这个程序的输出结果吗?


12
p 是指向地址空间开始处偏移 60 字节处的 int 类型指针。q 是指向地址空间开始处偏移 40 字节处的 int 类型指针。它们之间的差值为 20 字节,或者说 20/sizeof(int) = 5int 元素大小。 - Hristo Iliev
6个回答

10
这意味着将整数值分配给指针的(实现定义的)操作已经发生。这通常意味着

p 指向内存地址为 60,而 q 指向内存地址为 40。这些内存地址可能在虚拟内存、硬件内存中,而且许多实现对此都有不同的转换程序。

由于这是实现定义的,任何事情都可能发生,如您的实现所描述的。

但这不是完全没有用处吗?

绝对不是,它在嵌入式硬件编程中被广泛用于访问特定功能或调用内置函数。


在您的系统上,int 很可能是 4 字节宽,因此 p - q 等于 (60-40) / 4 == 5


看起来很可预测;20/sizeof(int) = 5。 - user195488

8

它让p指向内存地址60,而q指向内存地址40。然后假设您的架构具有4字节的int,因此p - q等于5((60-40)/ 4)。


1
该语句声明了一个指向地址为60的整数的指针。
int *p = (int*) 60;  

你可能已经知道了这一点;这样做的危险在于:你怎么知道地址60上实际存储了一个整数?


那么,我们可以像这样访问p并给它赋值吗?*p = 20 - user12392751

1

您正在创建两个指针值,然后进行指针数学运算。显然,在您的系统上sizeof(int)为4字节,因此两个指针值之间的距离为5。


1
每个指针pq都是指向int的指针。p指向内存地址60,q指向内存地址40。当你从q中减去p时,结果是介于它们之间有多少个4字节的int,在这种情况下是5个。这样做是为了使指针与数组一起使用更容易,如果它们在同一个数组中。

请参阅this site获取有关指针算术的更多信息。


0
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)(即整数占用的字节数)来获得这个值。
希望对你有所帮助。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接