内容
一.引用
二.&的三个作用
一.定义:
引用是已定义变量的别名
而typedef是给类型起别名,比如结构体类型
二.使用示例:
int main()
{
int a = 12;
int& b = a;
cout<<b<<' '<<a<<' '<<&a<<' '<<&b<<endl;
system("pause");
return 0;
}
输出结果就是
12 12 0x6ffe04 0x6ffe04
请按任意键继续. . .
三.本质
从上面的使用示例也可以大体看出它的本质是与被引用的变量共享一块空间,也就是他俩相互关联,这个与指针就不同了,指针是单独有自己的一块空间,那一块空间装着被指向变量的地址。
四.注意事项
1:定义时一定要初始化
2:同一个变量可以有多个引用
3:引用还可以被引用
4:引用一但关联了a后就不能再关联其他的了,比如b
5:引用与被引用的变量地址都是一个
五.引用的例子
①常量的引用
int main()
{
const int &a = 12;//这里前面一定要有const,因为12是常量。且不能再 a = 13;
cout<<a<<endl;
system("pause");
return 0;
}
②一维数组的引用
int main()
{
int arr[5];
int(&a)[5] = arr;//这里一定要有小括号,否则a就先跟[]结合了
system("pause");
return 0;
}
③二维数组的引用
int main()
{
int arr[2][3];
int (&a)[2][3] = arr;
system("pause");
return 0;
}
④指针的引用
int main()
{
int a = 12;
int *p = &a;
int* (&b) = p;
system("pause");
return 0;
}
六.引用与函数
①引用做参数
引用做参数,传过来的实参是引用的那个类型的变量即可
void fun(int&c)
{
cout<<c<<endl;
}
int main()
{
int a = 12;
fun(a);
system("pause");
return 0;
}
最后输出12
注意一个区分,看下面的代码
void fun(int c)
{
cout<<c<<endl;
}
int main()
{
int a = 12;
fun(a);
system("pause");
return 0;
}
这两个c的本质区别是:上面的c是与a共享或者关联共同的一块空间,而下面的c是有自己单独的一块空间,而且在执行完函数后这块空间被释放,因为是局部变量。
所以对上面的c改变也是对a改变,所以可通过引用做参数来代替地址做参数对值进行改变
②引用与返回值
int& fun()
{
int c = 12;
return c;
}
int main()
{
int& b = fun();
cout<<b<<endl;
system("pause");
return 0;
}
其实这个代码是不对的。但是把引用做返回值的形式写出来了
为什么不对?
因为引用有一个注意事项:不要引用局部变量!
看这里c就是局部变量,在执行完这个函数之后,c所在空间被释放,那么b关联的就是非法空间,虽然在很多编译器上可以正常运行,但是这里是不对的
七.引用与指针的区别
①引用声明就要初始化,指针不用
②引用初始化之后就不能引用其他的了,而指针可以指向其他空间
③引用不占存储空间,而指针占空间
八.&的三个作用
1:取地址
2:引用
3:位运算