一、对变量的引用
语法:①&和别名结合 表示引用
②给某个变量取别名,就定义某个变量
③从上往下替换
int num = 10;
int &a = num; //此处&不是取地址,而是标明,a是引用变量,即a是num的别名
注意:引用必须要有初始化;引用一旦初始化后,就不能修改别名。
int a = 10;
int &b = a;
cout << "a = " << a << endl;
b = 100;
cout << "a = " << a << endl;
cout << "a的地址 = " << &a << endl;
cout << "b的地址 = " << &b << endl;
二、对数组的引用
法1、
int arr[5] = {0, 1, 2, 3, 4};
int (&myarr)[5] = arr;
int i = 0;
for(; i < 5; i++){
cout << myarr[i] << " ";
}
cout << endl;
法2、
typedef int TYPE_ARR[5];
TYPE_ARR &myArr = arr;
for(i = 0; i < 5; i++){
cout << myArr[i] << " ";
}
cout << endl;
三、引用作为函数的参数
void swap01(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void swap02(int &a, int &b){ //函数的引用
int tmp = a;
a = b;
b = tmp;
}
void test02(){
int data1 = 10;
int data2 = 20;
cout << "data1 = " << data1 << ", data2 = " << data2 << endl;
//swap01(&data1, &data2); // 成功交换
swap02(data1, data2);
cout << "data1 = " << data1 << ", data2 = " << data2 << endl;
}
四、引用作为函数的返回值
//引用作为函数的返回值类型
int& myData(void){
int num = 100;
return num; //函数返回值是啥变量, 引用就是该变量的别名
//函数的返回值是引用时 不要返回局部变量
}
int& myData1(void){
static int num1 = 200;
return num1;
}
void test03(){
//ret是函数返回值的别名
//int &ret = myData();
//cout << "return = "<< ret << endl;
int &ret1 = myData1();
cout << "return = "<< ret1 << endl;
}
当函数的返回值作为左值,那么函数的返回值类型必须是引用。
int& myData2(void){
static int num = 10; //static变量只会赋值一次
cout << "num = " << num<<endl;
return num;
}
void test04(){
//函数的返回值作为左值
myData2() = 2000;
myData2();
}
五、引用的本质
引用的本质是在c++内部实现的一个指针常量。Type& ref = val; // Type* const ref = &val; c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是在编译器内部实现的,用户不可见。
六、指针的引用
void my_str(char* &str1){
str1 = (char *)calloc(1, 32); //为str1申请空间
strcpy(str1, "hello world!");
return;
}
void test05(){
char* str = NULL;
my_str(str);
cout << "str = " << str << endl;
free(str);
}
七、常引用
1.引导出常引用
typedef struct{
int num;
char name[32];
} STU;
void myPrintSTU(const STU &tmp){
cout << "num = " << tmp.num << ", name = " << tmp.name << endl;
}
void test06(){
STU lucy = {10, "lucy"};
myPrintSTU(lucy);
}
普通结构体变量作为形参,开销太大;采用常引用以空间换时间,可以提高运算效率
2.常量的引用
void test01()
{
//给常量10取个别名 num
//int &针对的是int, 而10是const int类型
// const int针对的是const int, 10是const int 类型
const int &num = 10;
cout << "num = " << num << endl;
}