结构体类型中星号的使用位置及两种写法差异咨询
结构体指针中星号位置的那些事儿
嘿,这个问题绝对是C语言圈子里的经典“风格口水仗”了——本质上两种写法没有语法对错之分,核心差异是编码习惯和对语法本质的侧重,我给你拆解明白:
先划重点:两种写法完全等价
不管是struct node* x还是struct node *x,编译器都会直接解析为:变量x是一个指向struct node类型的指针。它们在编译后的结果没有任何区别,纯粹是写法上的偏好。
两种写法的风格差异
1. struct node* x:强调“指针类型”
这种写法把struct node*当成一个完整的“指针类型”来看,更符合“类型 + 变量名”的直觉逻辑。比如你会写int num,那struct node* x看起来就像是“指针类型struct node*”加上变量x,新手更容易理解x的类型是指针。
但这里有个容易踩的坑:如果同时声明多个变量,比如:
struct node* x, y;
很多人会误以为x和y都是指针,但实际上只有x是指针,y是普通的struct node变量!因为C语言里星号*是绑定到单个变量名的,不是绑定到前面的类型。
2. struct node *x:贴近语法本质
这种写法更忠实于C语言的语法规则——星号*属于变量,而不是类型。它清晰地告诉你:“x是一个指针,指向struct node类型”。
用这种写法声明多个变量时,陷阱就很明显了:
struct node *x, y;
一眼就能看出来x是指针,y是普通结构体。如果想让两个都是指针,必须给每个变量都加星号:
struct node *x, *y;
很多老派C程序员或者注重语法严谨性的团队会偏好这种写法,因为它能避免多变量声明时的误解。
星号的“正确”位置:没有绝对答案,只有一致规范
其实不存在绝对的“正确位置”,关键是保持风格一致:
- 如果是个人项目,选你看着顺眼、用着顺手的就行;
- 如果是团队协作,严格遵循团队的编码规范——统一的风格能让代码可读性更高,减少不必要的沟通成本。
另外,如果你想彻底避免多变量声明的陷阱,最好的办法是一个声明只写一个变量,比如:
struct node* x; struct node* y;
这样不管用哪种风格,都不会出错。
内容的提问来源于stack exchange,提问作者MSD
相关产品推荐
相关产品推荐

