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

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

4

6 回答 6

10

这意味着将整数值分配给指针的(实现定义的)动作发生。这通常意味着p指向 的内存地址60q的地址40。这些内存地址可以在虚拟内存、硬件内存中,并且许多实现对这些有不同的转换例程。

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

但这不是完全没有价值吗?

肯定不是,它在嵌入式硬件编程中被大量用于访问某些功能或调用内置函数。


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

于 2012-07-20T16:23:08.783 回答
8

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

于 2012-07-20T16:24:54.830 回答
1

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

于 2012-07-20T16:25:27.120 回答
1

每个指针pq都是一个指向 int 的指针。p指向内存地址 60 和q内存地址 40。当从 中减去qp,结果是中间有多少个 4 字节int,在本例中为 5。这样做是为了使使用带有数组的指针更容易,如果它们是在同一个数组中。

有关指针算法的更多信息,请参阅此站点

于 2012-07-20T16:26:13.157 回答
1

该语句声明了一个指向地址 60 处的整数的指针

int *p = (int*) 60;  

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

于 2012-07-20T16:28:20.567 回答
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) 一样获得(即整数占用的字节数)。

HTH。:)

于 2012-07-20T16:35:56.473 回答