指针如何存储在内存中?

时间:2013-07-16 20:36:49

标签: c pointers

我对此有点困惑。 在我的系统上,如果我这样做:

printf("%d", sizeof(int*));

这只会产生4.现在,sizeof(int)也是如此。结论:如果整数和指针都是4个字节,则指针可以安全地“转换”为int  (即它指向的存储器可以存储在int中)。但是,如果我这样做:

int* x;
printf("%p", x);

返回的十六进制地址远远超出了int范围,因此任何将值存储在int中的尝试都会失败。

这怎么可能?如果指针占用4个字节的内存,它如何存储超过2个 32

编辑: 正如一些用户所建议的那样,我发布了代码和输出:

#include <stdio.h>

int main()
{
    printf ("%d\n", sizeof(int));
    printf ("%d\n", sizeof(int*));

    int *x;
    printf ("%d\n", sizeof(x));
    printf ("%p\n", x);
}

输出:

4
4
4
0xb7778000

3 个答案:

答案 0 :(得分:3)

C11,6.3.2.3,第5和第6段:

  

整数可以转换为任何指针类型。除非事先指明,否则   结果是实现定义的,可能没有正确对齐,可能不指向   引用类型的实体,可能是陷阱表示。

     

任何指针类型都可以转换为整数类型。除非事先指明,否则   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果不必在任何整数的值范围内   类型。

因此允许转换,但结果是实现定义的(如果结果不能以整数类型存储,则为undefined)。 (“先前指定的”是指NULL。)

关于指针打印的打印语句大于4字节数据可以表示的内容,这不是真的,因为0xb7778000在32位整数类型的范围内。

答案 1 :(得分:2)

  

返回的十六进制地址远远超出了int范围,因此任何将值存储在int中的尝试都会失败。

4
4
4
0xb7778000

并且0xb777800032位值,因此4字节的对象可以容纳它。

答案 2 :(得分:1)

不,他们无法“安全”转换。当然它们使用相同数量的存储空间,但不能保证它们以相同的方式解释多个设置位。

关于第二个问题(每个问题请问一个问题),int或指针没有保证的大小。 int大致是总线上数据传输的最佳大小(也称为单词)。它可以在不同的平台上有所不同,但必须相对(等于或)大于short或char。这就是为什么有MAX_INT的标准定义,而不是定义的标准“值”。

指针大致是访问内存位置所需的位数。旧的原始PC有一个8位总线,但有一个12位指针(由于一些奇特的位移),以扩展其内存范围超过其总线大小。