为了更容易理解指针和引用的区别。我们先执行一段代码。
int main(){
int a = 1;
int *p = &a;
cout<<"a = "<<a<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"p = "<<p<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
int b= 1;
int &c = b;
cout<<"b = "<<b<<endl;
cout<<"&b = "<<&b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
return 0;
};
下面是执行结果:
a = 1
&a = 0x28ff28
p = 0x28ff28
*p = 1
&p = 0x28ff24
b = 1
&b = 0x28ff20
&c = 0x28ff20
c = 1
一目了然了,对吗?
我看到很多文章说,引用和变量的值是一样的,引用只不过是变量的一个别名。这句话是对的。但是对于新手小白来说,心里是凌乱的。*和&是什么鬼???
指针:存的是变量的地址。如图所示,指针p的值等于a的值的内存地址0x28ff28,我们这里说的指针是单独一个p,前面不带任何符号的。一旦带了,它的概念就变了。*p = 1,取的变量a的值,*p取的内存地址里面的变量的值。&p = 0x28ff24,这里的怎么又不一样了?这里是声明指针p之后,系统给这个指针p分配的地址,&在这里就是取内存地址的意思。&p就是获取指针p的内存地址,而指针p的内存地址里内容是什么?就是变量a的内存地址。这样表述是不是很清晰明了呢?
引用:变量的别名。我们说的引用是单独一个c,前面不带任何符号的,c = 1,它跟变量的值一样,我们通常说的变量的别名就是这个意思了。一旦它前面带了符号,它的概念就变了。&c=ox28ff20,&c取的是变量b的内存地址,可以看到&b=&c,这就是引用。我们可以再通俗的理解一下,引用一旦被初始化为一个对象,就不能被指向另一个对象。就相当于房东把房子租给你了,他就不能再租给别人,而你租了这个房子,你就可以为所欲为了。再绕回来,就是变量把它的房子(内存地址)给引用了,引用就可以为所欲为改它的内容了。
我们来改变一下引用的值:
int main(){
int b= 1;
int &c = b;
cout<<"b = "<<b<<endl;
cout<<"&b = "<<&b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
int d = 2;
c = d;
cout<<"b = "<<b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
return 0;
};
结果:
b = 1
&b = 0x22fe40
&c = 0x22fe40
c = 1
b = 2
&c = 0x22fe40
c = 2
引用c的值从1变成了2,b的值也从1变成了2,但是引用C的地址是始终没有改变的。
引用的几个特点:
1.引用的类型必须和其绑定的变量的类型相同
double d = 12.3;
int &a = d;//错误,类型必须一致
int x = 0;
int &y = x;//正确
return 0;
2.声明引用的同时必须对其初始化,否则报错。
int &a;//错误,必须初始化
return 0;
3.声明引用的初始化赋值必须是左值。要么就前面加个const。什么是左值,就是不能直接赋值,而是等于其他变量。
int c = 1;
int &a = 1;//错误,必须赋值左值
int &b = c;//正确
4.引用不是定义一个新的变量或对象,因此内存不会为引用开辟新的空间存储这个引用
int value = 10;
int &new_value = value;
const int &new_value2 = new_value;
cout<<”value在内存中的地址为:”<<&value<<endl;
cout<<” new_value在内存中的地址为:”<<& new_value <<endl;
cout<<” new_value2在内存中的地址为:”<<& new_value2 <<endl;
//这3个值的地址一样
5. 引用通常用于函数参数列表和函数返回值。
// 函数声明
void swap(int& x, int& y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int& x, int& y)
{
int temp; temp = x;
/* 保存地址 x 的值 */
x = y;
/* 把 y 赋值给 x */
y = temp;
/* 把 x 赋值给 y */
return;
}
喜欢的点个赞!!!我也是最近开始学习C++,以一个初学者的视角来解释,更能被同是初学者的你们来理解。后续我会继续更新的,可以关注我!