C语言中使用%p输出变量地址的疑问:无&符号时输出什么?
C语言
%p格式符的两个常见疑问解答 嘿,让我来把这两个问题给你讲明白:
第一个问题:printf("%p", &a)确实输出变量a的地址吗?
没错!完全正确。&a是C语言的取地址运算符,它的作用就是获取变量a在内存中存储位置的地址值。而%p是标准C中专门用来输出指针(也就是内存地址)的格式说明符,它会把地址值以符合平台规范的十六进制形式输出(大部分编译器会带0x前缀,比如0x7ffeefbff5ac这种样子)。
第二个问题:printf("%p", a)会输出什么?
这就有点问题了——这属于格式符与参数类型不匹配的未定义行为!
%p要求对应的参数必须是一个指针类型(本质是一个地址值),但你这里传的是a,也就是整数6。编译器会把这个整数6强制转换成指针类型来处理,所以通常会输出十六进制的0x6(或者类似的格式,具体取决于你的操作系统和编译器)。但要特别注意:这种写法是不符合C标准的,未定义行为意味着不同平台、不同编译器可能会有完全不同的表现,甚至极端情况下可能导致程序异常。正经写代码的时候绝对不能这么干!
总结一下:
- 用
%p输出地址,必须传指针/地址值(比如&变量名或者指针变量) - 格式符和参数类型必须严格匹配,否则就是未定义行为,风险很大
内容的提问来源于stack exchange,提问作者승기유
相关产品推荐
相关产品推荐

