C语言指针声明与初始化语法困惑:为何int *x = &y成立?
关于C语言指针声明中解引用运算符的困惑解答
你的怀疑完全正确:int *x = &y;这条语句里,初始化值&y是直接赋给变量x的,而不是赋给*x。这得从C语言独特的声明语法逻辑说起:
C的声明规则不是把int*当成一个整体的“指针类型”,而是通过变量的“用法”来推导它的类型:
- 当你在表达式中写
*x时,它的类型是int(可以直接参与整数运算),反过来就说明x是一个指向int的指针。
回到你提到的两种场景:
- 分开声明和赋值:
int y = 5; int *x; x = &y;
这里int *x;只是声明x是int指针,后续x = &y;是给指针变量x本身赋值,你能理解这个逻辑没问题。
- 合并声明和初始化:
int y = 5; int *x = &y;
这条语句的结构要拆成两部分看:
int *x是变量声明部分:用*描述x的指针属性(即*x是int);= &y是初始化部分:直接给变量x赋值,和分开写的x = &y;完全等价。
你提到的int* x, z写法也能印证这个逻辑:因为*是绑定到单个变量名的,不是和int绑定成一个整体类型,所以这里x是int指针,而z只是普通的int变量——这也是很多人习惯把*写在变量名旁边(int *x;)而不是类型后面(int* x;)的原因,避免这种误解。
简单总结:不管是分开还是合并写法,指针变量的初始化/赋值都是给变量本身(存储地址的那个变量)赋值,声明里的*只是用来告诉编译器“这个变量是用来存指针的,解引用它会得到一个int”。
内容的提问来源于stack exchange,提问作者tnr
相关产品推荐
相关产品推荐

