You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针变量var与&(*var)的区别是什么?二者是否不等?

聊聊C语言里var和&(*var)的那些事儿

嘿,这个问题问到点子上了——很多刚接触C语言的开发者看到&(*var)这种写法都会懵:既然var本身就是指针,为啥还要多此一举先解引用再取地址?我来给你掰扯清楚:

核心结论:合法指针下两者完全等价

当var是一个有效、非空的指针(比如int *var = malloc(sizeof(int));这种指向合法内存的指针)时,&(*var)和var在语义、值上完全一致,var != &(*var)的判断结果必然是false(也就是C语言里的0)。

为啥会等价?看C标准的规定

C语言标准里明确了这个语法糖:对指针p执行*p解引用后,再用&取地址,结果等同于直接使用p,而且编译器会直接把&(*var)优化成var——不会真的去访问var指向的内存(这也避免了不必要的内存访问开销)。

说白了,这俩写法在编译器眼里是同一个东西,只是写法不同而已。

那为啥有人会写&(*var)?

你提到的代码里出现这种冗余写法,大概率是这几种原因:

  • 历史遗留习惯:早年有些编译器对指针语法的处理不够智能,或者老一辈程序员为了刻意强调“我要的是指向对象的地址”,慢慢形成了这种写法。
  • 宏兼容需求:如果代码里有宏,参数可能是对象或者指针,&(*x)这种写法能统一适配(比如如果x是对象,&(*x)其实就是&x;如果x是指针,就等价于x)。但在普通的非宏代码里,这种写法完全没必要。

特殊情况:空指针的坑

如果var是NULL,那*var本身就是未定义行为(C标准里没规定空指针解引用的结果),此时&(*var)的结果也不可控——有的编译器会直接返回NULL,有的可能直接崩溃。但这种场景本身就违反了指针使用的基本规则,正常代码里不会这么写。

总结一下

  • 对有效非空指针:var和&(*var)完全等价,var == &(*var)一定成立。
  • 空指针场景:&(*var)属于未定义行为,别这么写。
  • 实际开发里,直接用var就好,&(*var)纯属冗余,还容易让人困惑。

内容的提问来源于stack exchange,提问作者SGarnotel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:48