引用的声明
引用是将已定义变量起别名 用法一样
typedef 给类型起别名
#include <iostream>
using namespace std;
int main()
{
//变量起别名
int a = 12;
int& c = a;//声明变量的一个引用c,c是变量a的一个别名 &为引用符号
int& d = a;//引用声明的时候必须初始化
cout << &a << ' ' << &c << ' ' << &d << endl;
int& e = c;
c = 13;
cout << a << endl;
system("pause");
return 0;
}
其他类型的引用
1、基本数据类型: int b = 12; int &c = b; int &d = b;
定义时就要初始化
不能再指向其他的
2、常量的引用
const int &n = 12;
const char &c = 'a';
const float &f = 123.123f;
3、复合数据类型的引用
数组的引用 方式同数组指针一样
int a[2];
int (&b)[2] = a;
int a[2][3];
int (&c)[2][3] = a;
结构体的引用 类型 & 名字 = 结构体实例;
指针的引用
int* p = NULL;
int* (&d) = p;
引用做参数
fun:首先b的值初始化为12,指向一块空间,然后作为实参传入fun函数中,用b给a初始化,所以a的值也为12
fun1 : a, b各自指向一块空间,然后b的值初始化a
fun2;b指向一块地址0x10,值为12.a也指向一块地址,现b的地址0x10初始化a,然后*a的操作,就指向了b的地址
那么,有个问题:既然fun和fun2都是操作一块空间b,那有什么不同呢?
引用做参数是直接操作b空间,指针做参数是间接操作,也就是先操作地址,这样比较麻烦,也比较慢
#include <iostream>
using namespace std;
//引用做参数
void fun(int& a)//引用
{
a = 13;
//cout << a << endl;
}
void fun1(int a)//形参
{
a = 14;
//cout << a << endl;
}
void fun2(int* a)//指针
{
*a = 15;
}
int main()
{
int b = 12;
//fun(b);
/*fun1(b);*/
fun2(&b);
cout << b << endl;
system("pause");
return 0;
}
引用做返回值
不要引用局部变量 引用局部变量完毕后会立即释放掉,在操作空间就是非法空间 会有警报,有正常值
指针与引用的区别
1、引用需要初始化,而指针不需要
2、p = &a; 引用初始化之后就不能引用其他空间了,指针可以指向其他空间
3、引用不占用空间,而指针需要(4字节)
4、引用直接操作空间,效率更高
5、引用更安全,指针操作会发生偏移,而引用只是发生内存运算,不改变地址
6、指针更灵活,c\c++均可
&三种作用
1、引用 声明变量的时候有效
2、&变量,表示取地址
3、%数字,表述位与运算
#include <iostream>
using namespace std;
int& fun() //类型
{
int a = 12;
return a;
}
int main()
{
int& b = fun();
cout << b << endl;///操作非法空间
system("pause");
return 0;
}
交换两个变量的值
ExChange:首先,a对应一块地址,值为13,b为15,然后a,b作为实参传递给形参 a1,b1然后根据函数内部交换值
ExChange2: 首先,a对应一块地址,值为13,b为15,ab的值传递给 a1,b1,其初始化为13,15,内部a1,b1交换,而ab没变
#include <iostream>
using namespace std;
void ExChange(int& a1, int& b1)//引用,只不过是多个变量
{
int ntemp = a1;
a1 = b1;
b1 = ntemp;
}
void ExChange2(int a1, int b1)//形参
{
int ntemp = a1;
a1 = b1;
b1 = ntemp;
}
int main()
{
int a = 13;
int b = 15;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
//ExChange(a, b);
ExChange2(a, b);//不能交换
cout << "a:" << a << endl;
cout << "b:" << b << endl;
system("pause");
return 0;
}
//由于和上面需要写的一样,此处就没有添加指针类型