C++指针和引用(简单直白的解释,新手小白上手快,容易理解)

为了更容易理解指针和引用的区别。我们先执行一段代码。

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++,以一个初学者的视角来解释,更能被同是初学者的你们来理解。后续我会继续更新的,可以关注我!

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值