引用的基本语法
& 符号写在左侧是引用,写在右侧是取地址
- 引用基本语法 Type &alias = OriginalName
- 引用必须初始化
void test(){
int a = 10;
int &b = a;
cout << b << endl;
}
int main() {
test();
return 0;
}
- 引用初始化后不可以修改
- 对数组建立引用
void test2(){
int arr[10];//创建1-10的数组
for (int i = 0; i < 10; ++i) {
arr[i] = i;
}
//第1种方式
int(&parr)[10] = arr;
for (int j = 0; j < 10; ++j) {
cout << parr[j] <<endl;
}
//第2种方式:起别名
typedef int(ARRAY)[10];//ARRAY是具有10个元素的int类型的数组
ARRAY &parr2 = arr;
for (int j = 0; j < 10; ++j) {
cout << parr2[j] <<endl;
}
}
int main() {
// test();
test2();
return 0;
}
引用的注意事项
- 引用必须引用一块合法的内存空间
int &a = 10;//10不是变量,没有内存空间
- 不要返回局部变量的引用
int& doWork(){
int a1 = 10;
return a1;
}
void test3(){
//此时接收局部变量的引用,但局部变量在函数结束后会销毁
//部分编译器在第1次打印时会做优化,接下来的打印会出现乱码
//解决方案时加static关键字
//int &dw = doWork();
static int &dw = doWork();
cout << dw << endl;
}
int main() {
// test();
// test2();
test3();
return 0;
}
- ==如果一个函数返回值是引用,那么返回值可以当左值==
int& doWork(){
static int a1 = 10;
return a1;
}
void test4(){
doWork() = 1000;
//相当于a=1000
}
参数传递
上面演示了引用传递,下面是值传递和引用传递的代码
- 值传递 ==这样的值传递不能起到交换元素的作用,解决方案有传递数组和数组的2个索引,或者用地址传递,或者麻烦一些,就写返回值==
void swap(int a,int b){
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 10;
int b = 20;
swap(a,b);
cout << a << b << endl;
return 0;
}
- 地址传递 ==地址传递直接修改了内存,所以会直接修改值==
void swap2(int* a,int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
int a = 10;
int b = 20;
swap2(&a,&b);
cout << a << b << endl;
return 0;
}
- 引用传递 ==类似于传递地址,接收到的是变量的引用,也是直接修改的内存
void swap3(int &a,int &b){
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 10;
int b = 20;
swap3(a,b);
cout << a << b << endl;
return 0;
}
指针和引用的区别
==引用的本质就是指针常量==
int main() {
int a = 10;
int& b = a;//自动转换为int* const b = &a;
//还可以这么记,双地址就是指针,这就说明了为什么引用必须初始化
return 0;
}
==下面这两行代码,定义了一个整形变量i和一个指针变量p,该指针变量指向a的存储单元,即p的值是i存储单元的地址==
int i = 1;
int *p = &a;
==下面这两行代码,定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元==
int a = 1;
int &b = a;