为什么解引用运算符*会被用于声明指针变量?
C语言指针声明中
*的语法设计原因 这个设计完全是C语言核心设计原则**「声明模仿使用(declaration mirrors use)」**的直接体现,属于故意为之的语法规则。
核心逻辑说明
C语言的声明规则本质是:你怎么使用这个变量得到目标类型的值,就怎么写这个变量的声明。
- 如果你后续对变量
a执行解引用操作*a可以得到一个int类型的结果,那么声明的时候就写int *a,直接对应使用时的写法。 - 这里声明里的
*根本不是解引用运算符,它是类型修饰的一部分,作用是告诉编译器:「该变量是指针类型,对它解引用后会得到int类型的值」。
针对int *a = &b;的特殊说明
很多人混淆的点其实是把声明初始化和普通赋值的语境搞混了,这条语句可以拆成两个独立的逻辑,你就不会觉得违和:
- 指针声明逻辑:
int *a;定义a为指向int的指针类型 - 初始化赋值逻辑:
a = &b;把变量b的内存地址赋值给指针变量a本身,而非赋值给*a
这里的=是声明语法中的初始化符号,不是表达式中的赋值运算符,不会触发*的解引用逻辑,自然不存在对右侧的&b执行解引用的情况。
补充说明
*在C中本身就是多义符号,编译器会根据当前解析的语境自动判断作用:
- 出现在表达式语境中:作为解引用运算符/乘法运算符
- 出现在声明的类型说明语境中:作为指针类型修饰符
这种设计当年由C语言设计者Dennis Ritchie提出,核心目的是降低使用者的记忆成本:你只要知道变量怎么用,自然就知道怎么声明它,不需要单独记一套完全独立的声明语法。比如数组声明int arr[10];也遵循同样的逻辑:你使用arr[5]可以得到int值,声明就对应写int arr[10]。
内容的提问来源于stack exchange,提问作者Paralax01
相关产品推荐
相关产品推荐

