从零开始学习C++(十四.指针与引用)

217 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

前言

上篇文章主要是了解了一下C++指针的基本概念,今天来看看指针与引用的关系

引用

C++中的引用上篇没有讲,就是&符号,表示一个变量的别名,引用的操作与对变量直接操作完全一样
定义一个int a =10;,然后想改变一下这个变量的值,&a=11完全等价于a=11;
&符号没有在查找a的地址,相当于这个变量又两个名称,引用定义过后不能使用该引用名用作其他变量的别名去使用。
使用引用时必须对进行初始化,不能把一个数组建立一个引用,来测试一下,看会报什么错:

image.png

数组使用引用表示的话会提示无法转换

区别

空指针&空引用

C++中指针表示某块内存的地址,通过这个地址,可以寻址到这块内存的位置。然后只得到这个内存位置存放的内容。
引用是一个变量的别名,它必须有一个开源,所以它不能为空,不能有空的引用。
指针是可以为空的,地址是一个数值,这个数值可以为零,为零就是空指针 在编码中可以判断空指针,但是不能判断空引用,空引用就是不允许的

多赋值

指针可以进行多次赋值,但是引用不行。 指针可以改变指向的地址,例如:

#include <iostream>
using namespace std;

int main() {
	int a = 1;
	int b = 2;
	int* p;
	p = &a;
	cout << *p << endl;
	p = &b;
	cout << *p << endl;

}

image.png 引用初始化的时候就确认了引用的对象,再次更改引用对象的时候就会报错

#include <iostream>
using namespace std;

int main() {
	int a = 1;
	int b = 2;
	int &p =a;
	cout << &p << endl;
	&p = b;
	cout << &p << endl;

}

image.png

使用指针交换变量

在前面用冒泡排序对变量内容交换的时候,也是数组内容元素位置交换的时候goalng使用一个等于号就可以交换了,C++还需要定义一个临时变量来交换。现在学习了指针和引用,可以用这个两个方案交换两个变量的内容:

#include <iostream>
using namespace std;

/*指针交换*/
void swap1(int* pa, int* pb)
{
	int temp = 0;
	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

/*引用交换*/
void swap2(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
int main() {
	int a = 1;
	int b = 2;
	cout << "交换前:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	swap1(&a, &b);
	cout << "指针交换后:" << endl;
	cout << "a = " << a  << endl;
	cout << "b = " << b << endl;
	swap2(a, b);
	cout << "引用交换后:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

image.png 指针交换很直观的改变了变量存放的内容地址,引用交换读取了a,b的引用,隐性改变了其中的值,如果去掉swap2方法中接收参数的&的符号,就只是改变局部变量,不会改变main函数中的变量。

总结

C++中的*和&非常常见,如果不理解它阅读代码就会寸步难行,今天就了解到这个到这里。