引用基本用法(所谓的引用,就是取别名)
引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是C++增加了另外种给函数传递地址的途径,这就是按引用传递( pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。
■变量名实质上是段连续内存空间的别名,是一个标号门牌号
程序中通过变量来申请并命名内存空间
■通过变量的名字可以使用存储空间
对一段连续的内存空向只能取一个别名吗?
C++中新增了引用的概念,引用可以作为一个已定义变量的别名。中
引用必须初始化
b已经初始化了,不可以再被c修改了(b只能是a的引用了,不可以再变为c的引用)
给数组建立引用
先定义一个数组类型的别名,即定义一个数组类型,然后定义一个引用 (typedef BYTE T_IMSI[8]; )
在32位的系统中,下面程序的输出为:
typedef unsigned char ARRAY[100];
void testReference(const ARRAY supi1, const ARRAY& supi2)
{
printf("%d,%d", sizeof(supi1), sizeof(supi2));
}
A. 4,100
B. 100,100
C. 100,4
D. 4,4
正确答案: | A |
答案解析: | 数组以传值的方式作为函数入参时,会退化成指针,但是以传引用的方式作为函数入参时,不会退化。 |
注意事项:
如下代码,VS中,第一次可以打印,但是后面再打印就会报错,因为引用了返回的局部变量时,编译器做了优化
局部变量销毁后还再使用,很危险
3. 返回引用(返回值是引用类型),可以作为左值
4. 引用的本质是指针常量,指针常量必须要初始化,所以引用必须要初始化(const离谁近,修饰谁)
-----编译器自动帮忙转换(取*,加& ....等等)
5. 指针的引用
eg. 不用引用的方法(二级指针)
/*
使用二级指针的原因:
假设是这样
void get(int *p,int num)
{
p=(int *)malloc(num*sizeof(int));
return;
}
调用函数:
int *pi;
get(pi,10);
get函数里的这个参数p只是pi的一个副本,get函数结束后就没了,malloc分配的内存首地址也没带出来,pi还是原来的pi没变,还发生了内存泄漏。只能改变 *p 的值并带回。
想用一级指针当参数 可以这样:
int* get(int *p,int num) //返回指针
*/
eg. 指针引用(替换**二级指针),更简洁,好理解
6. 常量的引用 (常引用) (const是用来辅助阅读代码的(别人阅读),所以最好不要间接修改他的值):
const int &ref
const 防君子不防小人
修饰形参为只读