引用
- &符号在C里面是取地址,但是在C++里面跟在类型名后就是是引用的意思而不是取地址。
- 引用相当于给变量取别名,即改变引用等价于改变原来的变量值。
- 一旦引用就不能再改变,即c是a的引用,就不能再变成b的引用。
- 引用在定义时就必须被初始化。
- 定义时指针、引用符号要靠近类型值(代码规范)。
1、三种传参示例
(1)值传参
# include <iostream>
using std::cout;
using std::endl;
//值传参
void swap1(int a,int b) {
int c;
c = a;
a = b;
b = c;
}
int main() {
int x = 1;
int y = 2;
cout << "交换前x:" << x << ";y:" << y << endl;
swap1(x, y);
cout << "交换后x:" << x << ";y:" << y << endl;
return 0;
}
结果:
交换前:1 2
交换前:1 2
其中:
初始 | 最终 | 类型 | |
---|---|---|---|
&x | 0x0086fb4c{1} | 0x0086fb4c{1} | int* |
&y | 0x0086fb40{2} | 0x0086fb40{2} | int* |
&a | 0x0086fa68{1} | 0x0086fa68{2} | int* |
&b | 0x0086fa6c{2} | 0x0086fa6c{1} | int* |
即:x,y与a,b的地址不同,更改的是a与b地址上所存储的值,而不改变x与y。
(2)指针传参
//指针传参 a存储的是参数的地址,*a是地址指向的值
void swap2(int* a,int* b) {
int c;
c = *a;
*a = *b;
*b = c;
}
int main() {
int x = 1;
int y = 2;
cout << "交换前x:" << x << ";y:" << y << endl;
swap2(&x, &y);
cout << "交换后x:" << x << ";y:" << y << endl;
return 0;
}
结果:
交换前:1 2
交换前:2 1
其中:
初始 | 最终 | 类型 | |
---|---|---|---|
&x | 0x00d8fd94 {1} | 0x00d8fd94 {2} | int* |
&y | 0x00d8fd88 {2} | 0x00d8fd88 {1} | int* |
&a | 0x00d8fcb0 {0x00d8fd94 {1}} | 0x00d8fcb0 {0x00d8fd94 {2}} | int** |
&b | 0x00d8fcb4 {0x00d8fd88 {2}} | 0x00d8fcb4 {0x00d8fd88 {1}} | int** |
即:x,y交换前后,地址不变,地址存储的值改变。
a,b存储的是x和y的地址,交换后改变的不是a,b存储的地址,而是a,b存储的地址所指向的值。
也就是说在a和b交换时是a和b指针的指针所指向的数据进行的交换。
& a,&b的类型为int**。
(3)引用传参
//引用传参
void swap3(int& a,int& b) {
int c;
c = a;
a = b;
b = c;
}
int main() {
int x = 1;
int y = 2;
cout << "交换前x:" << x << ";y:" << y << endl;
swap3(x, y);
cout << "交换后x:" << x << ";y:" << y << endl;
return 0;
}
结果:
交换前:1 2
交换前:2 1
其中:
初始 | 最终 | 类型 | |
---|---|---|---|
&x | 0x00bcf978 {1} | 0x00bcf978 {2} | int* |
&y | 0x00bcf96c {2} | 0x00bcf96c {1} | int* |
&a | 0x00bcf978 {1} | 0x00bcf978 {2} | int* |
&b | 0x00bcf96c {2} | 0x00bcf96c {1} | int* |
a | 1 | 2 | int& |
即:x,y经过交换,地址不变,地址表示的值交换。
a,b为x,y的引用,地址就是x,y的地址,交换后地址表示的值交换,则x,y地址表示的值也交换(同一地址)。
a,b的类型为引用类型。
2、其他引用示例
// 1、整型引用
int x = 0, & rx = x;
int& rx2=x;
cout << rx2 << endl;
2、常量指针类型引用
char* s = "hello";
char*& rs = s; // rs的引用类型为char类型的指针,为s的引用
cout << rs << endl;
3、C++指针的定义初始化以及回收
int main() {
//空指针初始化
int* p = nullptr; //整型指针初始化
int* q{ nullptr }; //数组指针初始化
p = new int(42);
q = new int[4]; //q存储的是数组首地址
cout << "Before *P=" <<*p << endl;
*p = 10;
cout << "After *P=" << *p << endl;
cout << "-------------" << endl;
for (int i = 0; i < 4; i++) {
cout << "Before *(q + i):" << *(q + i) << endl;
*(q + i) = i;
}
for (int i = 0; i < 4; i++) {
cout << "After *(q + i):" << *(q + i) << endl;
*(q + i) = i;
}
cout << "-------------" << endl;
cout << "*q:" << *q << endl;
cout << "*q+2:" << *q+2 << endl;
//回收指针
delete p;
delete[]q;
return 0;
}