指针变量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
相关产品推荐
相关产品推荐

