(一)
a,引用的语法概念:Type &name = var;
b,引用的意义:
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性
例:
void myswap2(int *a, int *b) //C语言利用指针间接赋值//可以交换
{
int c = 0;
c = *a;
*a = *b;
*b = c;
}
void myswap3(int &a, int &b) //C++语言中的引用//可以交换
{
int c = 0;
c = a;
a = b;
b = c;
}
c,引用的本质:
1)引用在C++中的内部实现是一个常指针
Type& name Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏。例:
void modifyA1(int &a1)
{
a1 = 300;
}
void modifyA2(int * const a1)
{
*a1 = 200;
}
这两个是等效的函数 ,只不过调用使用了引用的函数不用手工取地址,C++内部会自动取地址,但是使用指针的函数,需要我们手动取地址。
(二),引用的运用:
a,普通运用:
void main()
{
int a = 10;
int &b = a;//引用语法
b = 100; //相当于把a改成100
printf("b:%d \n", b);
printf("a:%d \n", a);
system("pause");
}
注意点:
1:普通引用必须依附于变量 即必须初始化,如:
void main()
{
int a = 10;
int &b = a;
int &c;//这句报错,普通引用必须依附于变量 即必须初始化
system("pause");
}
2:引用做函数参数可以不初始化,
3:引用变量占内存。
b,指针引用,
#include <iostream>
using namespace std;
struct Teacher
{
char name[64];
int age;
};
//在被调用函数 获取资源
int getTeacher(Teacher **p)
{
Teacher *tmp = NULL;
if (p == NULL)
{
return -1;
}
tmp = (Teacher *)malloc(sizeof(Teacher));
if (tmp == NULL)
{
return -2;
}
tmp->age = 33;
//p是实参的地址 *实参的地址 去间接修改实参的值
*p = tmp;
}
//指针引用
int getTeacher2(Teacher * &tmp)
{
tmp = (Teacher *)malloc(sizeof(Teacher));
if (tmp == NULL)
{
return -1;
}
tmp->age = 36;
}
void FreeTeacher(Teacher *pT1)
{
if (pT1 == NULL)
{
return;
}
free(pT1);
}
void main()
{
Teacher *pT1 = NULL;
// getTeacher(&pT1);
getTeacher2(pT1);
cout << "age:" << pT1->age << endl;
FreeTeacher(pT1);
system("pause");
}
c,常引用
实例运用1:
int x = 20;
const int &y = x; //常引用是让变量引用只读属性 不能通过y去修改x了
//y = 20;//报错 不能修改
实例运用2:
void printTeacher(const Teacher &myt)
{
//常引用让实参变量拥有只读属性
printf(“myt.age:%d”, myt.age);
//myt.age = 40; //不能修改
}
void main()
{
Teacher t1;
t1.age = 36;
printTeacher(t1);
system("pause");
}
常引用的两种初始化方式:
1:
{
int x1 = 30;
const int &y1 = x1; //用x1变量去初始化常引用
}
2:
//2用字面量 初始化常量引用
{
const int a = 10; //C++编译器把a放在符号表中
//int &m = 41; //41没有内存,所以无法引用
//引用就是给内存取别名
const int &m = 43; //正确的初始化方式
//c++编译器 会为m分配内存空间
}
“`