1.引用的特性
引用是C++對C的增強,C裏面是沒有引用
1.引用基礎
#include <iostream>
using namespace std;
int main() {
int a = 20, b = 30;
int& c = b; // c是初始化爲b的引用
cout << "a=" << a << ", a的地址:" << &a << endl;
cout << "b=" << b << ", b的地址:" << &b << endl;
cout << "c=" << c << ", c的地址:" << &c << endl;
return 0;
}
// 如上結果爲:
a=20, a的地址:0093FCBC
b=30, b的地址:0093FCB0 # b的地址和c的地址一樣,說明存儲在堆內存的地址是一樣的
c=30, c的地址:0093FCB0
- 引用的原理,如上圖所示,如果還不清楚,可以理解爲b和c是一個人的2個不同的名字
- 底層原理如果不理解,下面的知識比較困難了,我的另一篇博文都爲你準備好了:(是不是很貼心)https://blog.csdn.net/chenmozhe22/article/details/106099565
2.引用的特性:初始化後不能再修改了
- 情況一:正常賦值
#include <iostream>
using namespace std;
int main() {
int a = 20, b = 30;
int& c = b;
cout << "a=" << a << ", a的地址:" << &a << endl;
cout << "b=" << b << ", b的地址:" << &b << endl;
cout << "c=" << c << ", c的地址:" << &c << endl;
c = 50;
cout << "a=" << a << ", a的地址:" << &a << endl;
cout << "b=" << b << ", b的地址:" << &b << endl;
cout << "c=" << c << ", c的地址:" << &c << endl;
return 0;
}
a=20, a的地址:010FFB1C
b=30, b的地址:010FFB10
c=30, c的地址:010FFB10
a=20, a的地址:010FFB1C
b=50, b的地址:010FFB10 # b和c的地址,在修改c的參數前後,沒有變動
c=50, c的地址:010FFB10
- 再看情況二:再次初始化引用
如上兩個案例說明:我們不能對引用多次初始化,只能賦值。而一旦初始化之後,引用對應的地址,雖然值可能改變,但地址就一直改變不了了。
3.引用的特性:其他
- 引用不支持空引用(錯誤用法)
int& c; //在初始化的時候,就必須設定引用的變量
c = 20;
- 應用必須是變量,不能是常量(錯誤用法)
int & d = 30;
- 引用只能是一級,不能多級(錯誤用法)
int c = 30;
int&& d = c;
- 引用的自增不能是後自增(錯誤用法)
int c = 30;
int& d = c;
cout << d++ << endl; //後自增打印的結果還是30
在C/C++中,前自增和後自增不一樣的,這個可以查閱左值和右值相關的知識
2.函數中傳遞參數的方式—引用傳遞
#include <iostream>
using namespace std;
void swap(int& a, int& b);
int main() {
int a = 3, b = 4;
cout << "a=" << a << ", b=" << b << endl;
swap(a, b);
cout << "a=" << a << ", b=" << b << endl;
system("pause");
return 0;
}
void swap(int& x, int& y) {
int t = x;
x = y;
y = t;
}
// 結果如下:
a=3, b=4
a=4, b=3
- swap函數的作用,其實是把兩個元素的引用調換了,最終2個元素所指向的內存地址也就調換了