【C++】C++中的&(引用)的简单理解
程序员文章站
2024-03-21 17:41:10
...
本文通过三方面来理解指针
我们知道在C语言中函数的传参有两种方式:
1.传值 2.传址
虽然这两种方式都可以实现函数传参但是却各自有着自己的优缺点:
传值:无法改变形参的值
传址:不是很形象而且不安全
所以在升级版C++中为了解决这种问题就使用了引用&
一.什么是变量的引用???
1.概念:引用是给变量取一个别名,它不会开辟新的内存空间,它和引用的变量使用的是同一块内存空间。(下边可以得以验证)
注意:引用并不是定义一个新的变量,而是给变量取一个别名
格式:类型& 引用变量名(对象) = 引用实体
int& ra = a;
引用必须初始化
一个变量只能有一个引用,但是引用引用了一个实体后就不能引用其他变量
int main()
{
int a = 5;
//int* pa = &a;
int &pa;
cout << pa << endl;
system("pause");
return 0;
}
为什么要进行初始化?
这是因为他定义时不初始化,就再没有机会去引用其他实体。
int main()
{
int a = 5;
int b = 6;
int &pa = a;
int &ppa = a;
int &pa = b;
system("pause");
return 0;
}
下边来看一段代码:
#include<Windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& ra = a;
cout << "ra:" << &ra << endl;
cout << "a:" << &a << endl;
system("pause");
return 0;
}
我们根据上边运行的结果可以很清楚的验证引用取的别名和变量是共用一块内存空间
2.引用的特性
- 引用必须初始化
- 一个变量可以有多个引用(就好比一个人可以有多个绰号)
- 引用一旦引用实体,再不能引用其他实体
- 不能建立引用数组
- 不能建立引用的引用
- 没有引用的指针
- 可以取引用的地址(其实也就是取变量的地址)
-
区别引用声明符&和地址运算符&。(出现在声明中的&是引用声明符其他的是地址运算符)
例如:
int& a = ra; //引用声明符
cout << "ra:" << &ra << endl; //地址运算符
3.常引用
分为一下三种情况,由于小弟文学水平确实有限文字总结不来只能是代码演示:
#include<Windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
//第一种情况
const int ra = 10;
//int& a = ra; //编译时会出错,a为常量
const int& a = ra;
//第二种情况
//int& b = 10; //b为常量,会出错
const int& b = 10;
//第三种情况
float c = 1.4;
//int& rc = c; //类型不同,会出错
const int& rc = c;
system("pause");
return 0;
}
二.引用的简单使用
使用场景
1.作为函数的形参(传地址)
void Swap(int& a, int& b)
{
a ^= b;
b ^= a;
a ^= b;
}
2.作为函数返回值
int& Sum(int& a)
{
a += 10;
return a;
}
3.注意:不能返回栈空间上的引用
4.传值,传地址,传引用的效率比较
引用>地址>值
5.引用和指针底层是一样的,都是用指针来实现
三.指针和引用的区别
相同点 | 不同点 |
底层的实现方式相同,都是按指针的方式实现 | 引用再定义时必须初始化,指针没有要求 |
一旦一个引用被初始化为指向一个对象,就不能在指向其他对象,而指针可以在任何时候指向任何一 个同类型对象 | |
没有NULL引用,但是有NULL指针 | |
在sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址*所占的空间字节个数(4个字节) | |
引用自加改变变量内容,指针自加改变了指针方向 | |
有多级指针没有多级引用 | |
指针需要手动寻址,引用通过编译器实现寻址 | |
引用比指针使用起来相对安全 |