我对此有点困惑。 在我的系统上,如果我这样做:
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
答案 0 :(得分:3)
C11,6.3.2.3,第5和第6段:
整数可以转换为任何指针类型。除非事先指明,否则 结果是实现定义的,可能没有正确对齐,可能不指向 引用类型的实体,可能是陷阱表示。
任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
因此允许转换,但结果是实现定义的(如果结果不能以整数类型存储,则为undefined)。 (“先前指定的”是指NULL。)
关于指针打印的打印语句大于4字节数据可以表示的内容,这不是真的,因为0xb7778000
在32位整数类型的范围内。
答案 1 :(得分:2)
返回的十六进制地址远远超出了int范围,因此任何将值存储在int中的尝试都会失败。
4
4
4
0xb7778000
并且0xb7778000
是32
位值,因此4
字节的对象可以容纳它。
答案 2 :(得分:1)
不,他们无法“安全”转换。当然它们使用相同数量的存储空间,但不能保证它们以相同的方式解释多个设置位。
关于第二个问题(每个问题请问一个问题),int或指针没有保证的大小。 int大致是总线上数据传输的最佳大小(也称为单词)。它可以在不同的平台上有所不同,但必须相对(等于或)大于short或char。这就是为什么有MAX_INT的标准定义,而不是定义的标准“值”。
指针大致是访问内存位置所需的位数。旧的原始PC有一个8位总线,但有一个12位指针(由于一些奇特的位移),以扩展其内存范围超过其总线大小。