为何C语言中可将int指针信息存入int变量?指针底层存什么?
关于C语言指针与int变量的两个问题
先看你给出的代码:
#include <stdio.h> int main() { int v1, v2, *p; p = &v1; v2 = &v1; printf("%d\t%d\n",p,v2); printf("%d\t%d\n",sizeof(v2),sizeof(p)); return 0; }
问题1:8字节指针为何能存入4字节int变量?
这不是合法操作,属于未定义行为:
- 在64位系统中,指针占8字节,int占4字节。把
&v1(8字节地址)赋值给v2(4字节int)时,会直接截断地址的高4字节,只保留低4字节存入v2。 - 如果
v1的地址高4字节不为0,v2里存的就是不完整的错误地址。编译器可能不会报错,但这种写法完全不符合C标准,后续用v2做任何地址相关操作都会引发不可预料的问题。
问题2:指针变量底层仅存储内存地址吗?
在x86、x86_64、ARM等绝大多数通用系统架构中,指针变量只存储目标变量的内存地址,没有额外附加内容:
- 指针的大小由系统地址总线宽度决定:32位系统地址总线是32位,指针占4字节;64位系统地址总线是64位,指针占8字节,刚好能完整存储一个内存地址。
- 极少数特殊架构可能有例外,但日常开发接触的通用平台里,指针就是单纯的地址值。
内容的提问来源于stack exchange,提问作者Zaratruta
相关产品推荐
相关产品推荐

