嗯,虽然这个问题提出得比较早,但似乎很多答主并没有get到题主在问什么。
题主的问题是运算符优先级的问题,或者是=符号运用方面的问题。
C语言里边,变量声明后边的 = 符号跟赋值语句的的 = 符号含义不同。后来C++也继承了这个特性。而这可能是给题主造成困惑的核心。
int
*
a
=
&
b
;
实际上可以理解为
int
*
(
a
=
&
b
);
//
只是示意,当然这样写是不对的
也就是说, 先把&b赋值给a,然后令 *a 的类型为 int 。
所以这里 &b 是赋值给 a 而不是赋值给 *a。
不过这里就存在一个矛盾:赋值语句的 = 符号的优先级低于 * 号 的,为什么这里 先 计算等于号 后 计算星号?按照运算符优先级规则,此处的 &b 应当赋值给 *a 才对。
个人认为有如下可能:
1,设计上为了方便导致。为了给指针赋值初始值省掉一个括号,这里刻意的特殊处理了赋值符号的优先级。
2,变量声明时初始化使用的 = 符号不是赋值符号,它具有完全不同的语义,从而具备不同的运算符优先级判定。
总的来说,题主的疑问是有道理的,这个地方的处理确实比较反常,此处的语法设计在逻辑上是不够完美的。
当然,如果使用 C++11,题主的问题就不存在了,因为可以用
auto
a
=&
b
;
来解决,谁都不会产生异议。
类型推导是个神器,谁用谁知道。