C++中*与&的用法困惑:指针及引用代码报错问题咨询
嘿,刚接触C++指针时被这些语法绕晕太正常了——指针和引用的符号复用确实容易让人混淆,咱们一个个把这些问题拆明白:
问题1:为什么int x = 10; int *pt; *pt = x;会报错,必须写成pt = &x;?
你得先搞明白:指针本身也是一个变量,它的作用是存储另一个变量的内存地址。
当你写int *pt;的时候,只是声明了一个指针变量,但这个变量里存的是随机的垃圾值(也就是所谓的「野指针」),它指向的是一块你无权访问的内存区域。这时候你写*pt = x;,相当于试图把x的值写到这块非法内存里,操作系统自然会报错(可能是段错误或者内存访问违规)。
而pt = &x;做的事情是:把变量x的内存地址(&x就是取x的地址)赋值给指针变量pt。这时候pt就有了合法的指向——它指向x所在的内存空间。之后你再用*pt,才能正确访问或修改x的值。
举个直观的例子:pt就像一个快递地址本,刚买的空白地址本(int *pt;)上写的是乱码地址,你按这个地址寄快递(*pt = x;)肯定会寄错甚至被拒收;而pt = &x;就是把x的正确地址写到地址本上,之后按这个地址操作(*pt)才能找到x。
问题2:为什么int *pt = &x;是合法的?我以为*pt是内容不是地址?
这里的关键是区分「声明时的*」和「使用时的*」:
- 当你在声明变量时写
int *pt,这里的*是用来告诉编译器:「pt是一个指向int类型变量的指针」——它是指针类型的一部分,不是解引用操作。 - 而当你在其他地方写
*pt时,那才是解引用,用来访问pt指向的内存里的内容。
所以int *pt = &x;其实是指针变量的初始化,和下面两行代码完全等价:
int *pt; pt = &x;
它的意思是:声明一个int类型的指针pt,并且把x的地址赋值给pt。这里的=右边是地址,左边是指针变量(pt),类型匹配,所以完全合法。
问题3:为什么让temp和n1共享地址要写int &temp = n1;,而不是int &temp = &n1;?
这里你混淆了引用的语法和取地址操作:
C++里的&有两个完全不同的作用:
- 作为单目运算符时,
&变量是取变量的内存地址(这是你之前理解的用法); - 作为类型修饰符时,
类型 &用来声明一个引用——引用是变量的「别名」,它和原变量共享同一块内存空间。
当你写int &temp = n1;时,这里的&是引用声明符,意思是:temp是n1的别名,temp和n1指向同一块内存(也就是你说的「共享地址」)。这时候你给temp赋值,n1的值也会变,反之亦然。
而如果你写int &temp = &n1;,相当于试图把一个「地址值」(&n1是地址,类型是int*)赋值给一个「int类型的引用」,类型不匹配,编译器肯定会报错。
简单说:引用必须直接绑定到一个已经存在的变量上,而不是绑定到变量的地址上。
内容的提问来源于stack exchange,提问作者3XBULL

