c++ 基本引用

在c++中,引用是一个基本的语法,解决了C语言指针易错的问题,极大的方便了使用,可以在使用指针的地方用引用代替。

1. 引用基本用法

#include<iostream>

using namespace std;

int main(int argc, char **argv)
{
	int a = 10;
	int &b = a;
	
	b = 20;
	cout << "b = " << b << endl;
	a = 30;
	cout << "a = " << a << endl;
	return 0;
}

此函数运行结果:

b = 20;
a = 30;

int &b = a;就是基本引用语法,引用在初始化时必须赋值,不然编译器会报错。引用就是内存块的别名,相当于给这个内存块又起了一个名字,既可以使用原来的名字访问或修改内存块的值,也可以通过这个名字访问或修改内存块值

2. 引用的本质

引用的本质就是一个常指针,即:

char * const p;

因为引用本身占用4个字节内存空间(在32位系统),和指针相同。它只能修改他初始化时所指向的内存空间,不能指向别的空间。

3. 返回一个引用

当一个函数返回一个引用时,具体返回的是什么是根据用什么东西来接进行判断的,比如:

int & g()
{
	int t = 10;
	return a;
}

int main(int argc, char **argv)
{
	int a = g();
	cout << "a = " << a <<endl;
	int &b = g();
	cout << "b = " << b <<endl;
}

如果接引用的类型是int 等普通变量,则返回的是10,所以打印a的结果是a = 10;如果接引用的类型是引用,则会把t变量的地址返回给b,通过引用b可以访问t的内存块,但是当g()函数执行完时,t内存块会被析构掉,所以打印b的内容时,要么出错,要么乱码。
由此可以看出,返回引用的内容是什么,要具体看接引用的类型是什么,会根据不同的类型来返回不用的东西。

4. 指针引用

/* 指针引用用来申请内存	*/
int get2(teracher*& p)
{
	p = (struct teracher *)malloc(sizeof(struct teracher));
	if (p == NULL) {
		return -2;
	}
	p->age = 200;

	return 0;
}
int main(void)
{
	teracher *t1=NULL;
	int ret;

	/* 使用引用	*/
	ret = get2(t1);
	cout << "ret = " << ret << endl;
	cout << "t1->age = " << t1->age << endl;
	free(t1);
	
	return 0;
}

这就是指针引用,调用get2()函数参数,就是相当于修改p的值就是修改t1的值,所以将申请的内存的首地址赋值给p,就等于将内存的首地址赋值给t1,然后加上星号,就可以间接访问申请的内存了。

5. 常引用

常引用分为两种,一种是用变量初始化常引用,另一种是用常量初始化常引用

1.用变量初始化常引用
int x=10;
const int &y = x;
这样就相当于将y作为只读属性,y只能读取x值,不能修改,x是正常操作
2.用常量初始化常引用
const int &y = 21;
这句话在c++编译器中是不会报错的,因为是常引用来保存的。相当于给21也分配了一个四字节的空间大小。
int &y = 21;
如果在这样,是会报错的,因为21没有内存空间,无法做引用。
发布了15 篇原创文章 · 获赞 7 · 访问量 273

猜你喜欢

转载自blog.csdn.net/weixin_42397613/article/details/105288574