c++从入门到精通,引用相关介绍

在这里插入图片描述

引用的实质及应用

很多刚入门c++的计算机小白,在面露难色学完指针后再接触C++中的引用。就会有一种十分舒适的感觉。在c++中引用无论如何都是在某些方面替代指针的容易上手的工具。引用通俗一点就是别名,而指针是涉及计算机底层内存的地址。当然既然是工具我们就得深入了解引用。引用的实质还是指针常量,只不过更加“平易近人”

引用的实质

首先让我们复习以下***指针常量***

指针常量特点:指针的指向不可以修改,但是指针指向的值可以修改,后面两字可修改

#include<iostream>
using namespace std;
int main() {
	int a = 10;
	int b = 10;
	int* p = &a;//定义一个指针p指向a的地址。
//指针常量特点:指针的指向不可以修改,但是指针指向的值可以修改,
	int* const p2 = &a;//定义一个指针常量p2指向a的地址。
	//p2 = &b  //错误,因为指针指向不可修改
	*p2 = 20;  //正确,指针指向的值可以修改。
	system("pause");
	return 0;
}

这里就不画内存条详细解释了。>_<

引用的注意事项

根据指针常量的特点:

  • 引用必须初始化

  • 引用一旦初始化以后便不可修改

a = 10;
b = 20;
int &c = a; //这就是将引用c初始化。
//int &c    错误
c = b 
/*!!!!这并不是更改引用,而是赋值操作。
即a及a的别名c均重新变成了20*/

结合指针常量这也是非常好理解的。(也许你并不想提这几个字)@- _ @-。

引用的相关用法

  1. 引用作函数参数

可以实现指针传递的功能并代替指针。我们知道引用的实质,但在我们用的时候。我们只需要考虑这就是个别名

#include<iostream>
using namespace std;
//值传递。只可改变形式参数,不可改变实参。
void hanshu_1(int a, int b){
    int temp = a;
    a = b;
    b = temp;
}
//地址传递。可改变实参。
void hanshu_2(int* a, int* b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
//引用传递。也可改变实参,更加通俗易懂。
void hanshu_3(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}
int main(){
    int a = 10;
    int b = 20;
    //值传递
    hanshu_1(a,b);
    cout<<"a与b的值是"<<a<<";"<<b<<endl;//不会交换
    //地址传递
    hanshu_2(&a,&b);
    cout<<"a与b的值是"<<a<<";"<<b<<endl;//会交换
    //引用传递
    hanshu_3(a,b);
    cout<<"a与b的值是"<<a<<";"<<b<<endl;//会交换
}

引用作函数返回值

  1. 不要返回局部变量的引用。
#include<iostream>
using namespace std;
int& hanshu(){
    int a = 10;
    return a
}
int main(){
    int &test = hanshu();
    cout << test << endl;//第一次返回系统会默认帮你保存局部变量a的值
    cout << test << endl;//栈区中的a已被释放,不会返回  10
}

上面的函数有问题。具体可自己尝试。

栈区的基部概念:

栈区数据由编译器管理开辟与释放:

注意!不要在函数中返回局部变量的地址。因为局部变量存放在栈区,数据在函数执行完后会自动释放。

  1. 函数的调用可作为左值
#include<iostream>
using namespace std;
int& hanshu(){
    static int a = 10;//静态变量存放在堆区。
    return a
}
int main(){
   int &test = hanshu();
   hanshu() = 1000;//左值即在等号的左边
/*此时a与test均变为1000
   因为返回的是引用,就相当于a赋值为1000!
*/       
}

常量引用

  • 加上const修饰形成防止误操作使实参改变。

!!!以防万一,将来如果出错,在上万行代码中找bug很恐怖@-_@-

void hanshu_1(const int& a){
    cout<<a<<endl;
}
  • 可实现优化代码

因为引用本身需要一个合法的内存空间。结合指针不可以对一个没有指向的指针所指向的量进行赋值。

int &a = 10;//错误,因为引用本身需要一个合法的内存空间。

但是下面的可行。更简洁因为编译器帮我们作了相应的处理使其合法。

即帮我们创建了一个临时变量来存储10,再引用。

const int &a = 10;

关于引用就总结这么多了,谢谢大家阅读。
推荐自学C++的课程,哔哩哔哩up黑马程序员,个人感觉课程十分nice
点击这里
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值