【C++入门】引用符&详解

1、C++的&引用符介绍

(1)&符号在C语言中表示取地址运算;
(2)C++对&符号进行拓展,&符号新增了引用的用法;
(3)声明引用时,必须同时对其进行初始化;
(4)引用声明完毕后,相当于目标变量有两个名称,引用名就相当于变量的别名,操作引号名就相当于操作变量本身;

2、引用和指针的对比

(1)指针在C和C++中都有,且使用方法和实现本质完全相同;但是引用只有C++才有;
(2)引用的定义和识别的关键符号是&,注意和指针取地址的含义进行区分;
(3)引用可以理解成功能弱化、安全性增、受限的指针;
(4)引用型变量在定义时必须初始化,而指针变量可以不初始化;
(5)引用型变量初始化后就不能再修改,而指针变量可以;
(6)引用主要用在函数传参和返回值;

3、&引用符实战

3.1、示例代码

#include <iostream>

using namespace std;

//C语言用指针实现两个int型数的交换
void swap1(int *pa, int *pb)
{
	int tmp;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
	
}

//C++用引用符&实现两个int型数的交换
//传入的是变量名的引用名,操作引用名就相当于操作变量本身
void swap2(int &ra, int &rb)
{
	int tmp;
	tmp = ra;
	ra = rb;
	rb = tmp;
	
}

int main()
{
	int a = 1, b = 2;
	int c = 3, d = 4;
	
	//传入变量的指针
	swap1(&a, &b);
	
	//直接传变量名,相当于是传的引用名
	swap2(c, d);
	
	
	cout<< "a=" << a <<";"<< "b=" << b << endl;	
	cout<<"c=" << c <<";"<< "d=" << d << endl;	
	
	return 0;
}

3.2、代码分析

//程序输出结果
[root#]$ a=2;b=1
[root#]$ c=4;d=3

(1)上面的代码用指针和引用两种方式,实现了交换两个int型变量数值的函数;
(2)重点关注&符号在指针和引用两种方式是如何使用的;

4、引用的本质分析

4.1、用const修饰引用

int a;
const int &b = a;

//下面的代码在编译的时候会报错
//因为用const去修饰引用就表示引用是只读的,不能修改
void swap2(const int &ra, const int &rb)
{
	int tmp;
	tmp = ra;
	ra = rb;
	rb = tmp;
	
}

//报错信息
In function ‘void swap2(const int&, const int&):
error: assignment of read-only reference ‘ra’
error: assignment of read-only reference ‘rb’

(1)b是变量a的引用名,const修饰后,无法通过b来修改a;
(2)const修饰引用主要是用在函数传参中,当传入的引用只需要读而不需要改时,就可以用const去修饰引用,防止函数中误操作去进行修改,这个C语言的函数用const去修饰传参的思路是一样的;

4.2、引用和sizeof运算符

4.2.1、示例代码

#include <iostream>

using namespace std;

int main()
{
	int a = 1;
	char b;
	long long c;
	
	int &ra = a;
	char &rb = b;
	long long &rc = c;
	cout << "sizeof(ra)=" << sizeof(ra)<<endl;
	cout << "sizeof(rb)=" << sizeof(rb)<<endl;
	cout << "sizeof(rc)=" << sizeof(rc)<<endl;
	
	return 0;
}

4.2.2、结果分析

[root#]$ ./a.out 
sizeof(ra)=4
sizeof(rb)=1
sizeof(rc)=8

(1)sizeof得到的不是引用本身的大小,而是引用指向的目标变量的大小;
(2)可以这样理解,引用名就是一个别名而已,本身没有大小,对引用名做sizeof操作,就是对引用指向的变量做sizeof操作;
(3)sizeof操作体现了指针和引用的区别,对指针变量做sizeof操作,得到的确定的字节,4字节(32位操作系统)或者8字节(64位操作系统);

4.3、引用的本质是const指针

(1)int &b = a; 类似于 int * const b = &a;
(2)C++标准并没有规定引用是否占用内存空间,但是大多数编译器都把引用实现为const指针,所以大部分编译器中引用也是要占内存空间的;
(3)引用是天然const的,所以定义时必须初始化指向变量,否则就没意义了;
(4)引用本质是指针,是地址,所以才能实现传址调用的效果;
总结:功能上来说,引用是受限制的指针,相当于用const修饰的指针变量类型;

  • 30
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C++中,使用"&"号可以获取一个变量的内存地址,也就是指针。在函数定义和调用时,"&"号有不同的用法。 1. 以引用作为函数参数 在函数定义时,可以使用"&"号将变量作为引用类型的参数传入函数中。例如: ```c++ void swap(int& a, int& b) { int temp = a; a = b; b = temp; } int main() { int x = 1, y = 2; swap(x, y); cout << x << " " << y << endl; // 输出2 1 return 0; } ``` 在这个例子中,swap函数的参数是int类型的引用a和b,传入的是x和y的地址。在函数内部,直接操作a和b的值,就会影响到x和y的值。 2. 返回一个指针 在函数定义时,可以使用"&"号返回一个指针类型的值。例如: ```c++ int* findMax(int* arr, int size) { if (size == 0) { return nullptr; } int* max = &arr[0]; for (int i = 1; i < size; i++) { if (arr[i] > *max) { max = &arr[i]; } } return max; } int main() { int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; int* pMax = findMax(arr, 10); cout << *pMax << endl; // 输出9 return 0; } ``` 在这个例子中,findMax函数返回一个int类型的指针,指向数组中最大的元素。在函数内部,使用"&"号获取每个元素的地址,然后比较它们的值,找到最大的元素的地址,并返回该地址所指向的值。 3. 取地址运算&和指针运算* "&"号和"*"号是C++中的两个重要的运算,它们分别表示取地址和解引用。例如: ```c++ int x = 1; int* p = &x; // 取x的地址,赋给指针p cout << *p << endl; // 解引用指针p,输出1 ``` 在这个例子中,使用"&"号获取变量x的地址,并将其赋给指针p。使用"*"号解引用指针p,输出变量x的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值