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

时间:2012-07-20 16:21:32

标签: c pointers

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

有人可以向我解释这个程序的输出吗?

6 个答案:

答案 0 :(得分:9)

这意味着为指针分配整数值的(实现定义的)操作发生。这通常意味着p指向60的内存地址和q40的地址。这些内存地址可能位于虚拟内存,硬件内存中,许多实现都有不同的转换例程。

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

但这不完全没用吗?

绝对不是,在嵌入式硬件编程中使用 lot 来访问某些功能或调用内置函数。


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

答案 1 :(得分:8)

它使p指向内存地址60q指向内存地址40。那么大概你的架构有4字节int s,所以p - q等于5((60 - 40)/ 4)。

答案 2 :(得分:1)

您正在创建两个指针值,然后执行指针数学运算。显然你的系统sizeof(int)是4个字节,所以两个指针值之间的距离是5。

答案 3 :(得分:1)

每个指针pq都是指向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。 :)