2引用
2.1引用的基本使用
作用:给变量起别名(类似于是指针常量【不能修改指向但是可以修改指向内存上的数据】)
引用只能是栈区或者堆区
区别在于int* const p = &a; 指针开辟内存给p用来存放a的地址,而引用不需要
指针是变成了两个内存而引用仍然是一个内存。
语法 数据类型 &别名 = 原名;(其实就是给a这块内存起一个别名)
通过别名和原名修改内存上的数据是一样的。
2.2引用的注意事项
引用必须初始化;
int &b;//错误的 int a = 10; int &b = a;//引用在初始化后就不可以改变了 int c = 100;//不可以变成c的别名 b = c;//这是赋值操作而不是更改引用,把a上的数据变成了100;
2.3引用做函数参数
作用:函数传参时可以利用引用的技术让形参修饰实参
有点:可以简化指针修饰实参;
在函数传递中通过引用是将实参当作形参传进去的可以不开辟新的空间
引用做形参不需要初始化
swap(int &a,int &b)//不需要初始化因为已经有了(int &a = a,和int &b = b)传递时已经算是初始化了 这里是局部变量等价于main中的a,b;不开辟新的空间而是直接对原a,b内存上的数据进行改变; { int tmp = a; a = b; b = tmp; } swap(int *a,int *b)//指针这里是形参在栈开辟新的空间 { int tmp = *a; *a = *b; *b = tmp; } int main(){ int a = 10; int b = 20; swap(a,b);//这里其实已经初始化了 //区别于指针的地址传递swap(&a,&b)函数定义格式是一样的 }
2.4引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量的引用;
用法:函数调用作为左值
不要返回局部变量的引用; int & test01(){ static int a = 10;//在栈中开辟保存,属于局部变量,前面加static来拉长其生命周期就可以输出; return a; } int main(){ int &ref = test01(); cout<<ref<<endl;//输出的是10; } //函数调用可以作为左值 //等号左边是左值 test02()//这里调用了函数 = 1000;
2.5引用的本质
本质是指针常量
int *const ref = &a int & p = a; cout<<p<<endl; cout<<*ref<<endl;//两者输出数据是一样的
2.6常量引用
常量引用主要用来修饰形参,防止误操作
int &ref = 10;//不合法 const int &ref = 10;//合法 //编译器进行修改代码操作 // int tmp = 10; //const int &ref = tmp; ref = 20;//不合法原因 //加了const之后则值不可以修改 void show(const int &p);//既修饰形参又修饰实参,此时即便不小心修改了p也不会改变真正的值。 int main(){ int a = 10; show(a); show(10);//这是不合法的因为10是在常量区的(全局区) }
引用在函数中传递可以寄暗哨空间开辟
无论是指针传递还是值传递都需要开辟的另外的空间(指针是开辟四个字节内存而值传递是直接完全拷贝一个副本)
可是引用可以直接在原来的内存地址上对其进行修改;
1万+

被折叠的 条评论
为什么被折叠?



