C++引用小结
引用的本質就是給同一個內存空間起不同的名字
#include <iostream>using namespace std;int main() {int a =10;int &b = a;b =20; //通過引用變量b和a指向同一個內存,改變b的值 就能夠改變a的值 在這里雖然只是對b進行賦值 // printf("a = %d\n",a);cout << "a = " << dec << a <<endl;cout << "b = " << hex << b << endl; system("pause"); return 0; }引用必須要進行初始化
#include <iostream>using namespace std;//引用的基本基本知識void mySwap(int *a ,int* b) { //在swap函數中要使用指針進行值的交換定義一個指針的時候必須頂一個變量這樣能夠防止沒有初始化的指針會隨意指向存放系統參數的內存地址,要是不進行初始化很可能會替換掉系統中重要的參數而導致不可預知的情況發生int *c, d;c = &d;*c = *a;*a = *b;*b = *c; }int main() {int x,y;x = 10;y = 20;mySwap(&x,&y);cout << "x =" << x << "y =" << y <<endl;system("pause"); return 0; } //這種函數是萬萬要不得的,因為很可能導致系統的崩潰void mySwap(int *a ,int* b) {int *c;*c = *a;*a = *b;*b = *c; } #include <iostream>using namespace std;//引用的基本基本知識void mySwap(int *a ,int* b) {int c;c = *a;*a = *b;*b = c; }//使用引用 void mySwap02(int &a ,int &b) {int c;c = a;a = b;b = c; }int main() {int x,y;x = 10;y = 20;mySwap02(x,y); //在調用的時候 a 就是x的別名,b就是y的別名其實就相當于取 &a = x; &b = y;cout << "x =" << x << "y =" << y <<endl;system("pause"); return 0; }對復雜數據的應用
#include <iostream>using namespace std; //復雜數據類型的引用struct Teacher {char name[64];int age; }; void printfT(Teacher &pT) {cout << pT.age << endl; } void printfT2(Teacher &pT) //引用相當于別名直接可惡意更改變量原來的數值 {pT.age = 26;cout << pT.age << endl; } int main() { Teacher t1;t1.age = 35;printfT(t1);printfT2(t1);system("pause"); return 0; }引用作為變量的別名存在,因此在一些場合可以替代指針
引用相對于指針有更好的可讀性和實用性
在單獨的定義一個引用的時候,必須進行初始化,因此引用就像一個常量
引用和原來的地址是一樣的,這樣來說引用是對同一塊地址不同的別名:
#include <iostream>using namespace std;int main() { const int c1 = 10;int a = 12;int &b = a;printf("a = %d, b = %d\n",&a,&b);cout << "hello world!" << endl;system("pause"); return 0; }輸出的結果是一樣的,引用的地址使用一樣的,只是對同一塊地址不同的別名,這是一點很重要的點;
引用就是同一內存空間內存門牌號的不同別名
普通引用也占內存空間
而且和指針占用的內存空間是一樣的
在32位系統中指針的大小固定是4無論指針的類型是啥大小都是4,也就是說當系統的架構大小固定的時候指針的大小是固定的
因此可以看出引用的本身其實就相當于常量指針,
Type& name <==> Type * const name;
C++編譯器在編譯的過程中使用常量指針作為引用的內部實現,也因此引用所占用得到空間與指針的大小是相同的;、
但是從使用的角度來說引用給人的感覺是變量的別名,沒有自己的存儲空間,但是記住這只是C++的實用性遮蔽了引用的本質,引用變量本身是占內存的內部的大小和指針的相同,因為引用實現的細節就是常量指針;
不要使用C語言編譯器的思想來思考C++編譯器,在碰見左邊的形式的引用的時候C++編譯器會將其轉化為→_→的形式,當C++發現a為引用變量的時候會將a自動加上取值符號;所以不能以簡單的只針對額那一套來思考也引用,要考慮到C++的編譯器的作用;
并且在調用的時候C++編譯器會幫助我們取地址,因此調用的時候也只是將變量放到函數的就行例如:
引用的難點
函數的返回值當引用,返回值為棧變量的時候,不能當其他引用變量的初始值,也不能當左值使用,因為棧變量有生命周期。
但如果是靜態變量或者是全局變量就可以
當返回值為棧變量的時候,會出現錯誤
#include <iostream>using namespace std; //函數的返回值是一個引用int getAA1(void ) {int a;a = 10;return a; } int& getAA2(void) {int a; //如果是返回棧上的引用有可能會出現問題a = 10;return a; }int* getAA3(void) {int a;a = 10;return &a; } int main() { int a1 = 0;int a2 = 0;a1 = getAA1();a2 = getAA2(); // 返回a的副本,將返回的值賦給a2int &a3 = getAA2(); //返回a的值的時候使用引用接,會把a的地址傳給&a3 這時a3其實得到的是就不變量的地址,再次使用的時候已經有可能被釋放了//打印的時候使用 a3因為a3是一個引用因此C++編譯器會默認的使用*a3的得到情況去打印cout << "a1 = " << a1<< endl << "a2 = " << a2 << endl << "a3 = "<< a3 <<endl;cout << "hello world!" << endl;system("pause"); return 0; }當為全局變量或者靜態變量的時候正常的使用
#include <iostream>using namespace std; //函數的返回值是一個引用int getAA1(void ) {static int a = 10;a ++ ;return a; } int& getAA2(void) {static int a = 10;a ++ ;return a; }int* getAA3(void) {static int a = 10;a ++ ;return &a; } int main() { int a1 = 0;int a2 = 0;a1 = getAA1();a2 = getAA2(); // 返回a的副本,將返回的值賦給a2int &a3 = getAA2(); //返回a的值的時候使用引用接,會把a的地址傳給&a3 這時a3其實得到的是就不變量的地址,再次使用的時候已經有可能被釋放了//打印的時候使用 a3因為a3是一個引用因此C++編譯器會默認的使用*a3的得到情況去打印cout << "a1 = " << a1<< endl << "a2 = " << a2 << endl << "a3 = "<< a3 <<endl;cout << "hello world!" << endl;system("pause"); return 0; }神奇的引用,使用引用函數能夠當左值,并且能夠實現函數的對接調用
#include <iostream>using namespace std;////////////////////////////////////////////////////////////////////////// //函數當左值 // [11/23/2017 Andrew] //返回變量的值 int g1() {static int a = 10;a ++;return a; } ////////////////////////////////////////////////////////////////////////// // 返回變量本身 [11/23/2017 Andrew] //返回變量所標識的內存空間 //--------- //程序能夠正常的通過說明返回引用能夠當左值,因為返回引用返回的是變量本身 int & g2() {static int a = 10;a ++;return a; }int main() {// g1() = 100; //不能夠使用 g2() = 100;system("pause"); return 0; }在C語言中可以通過指針修改const 類型的值,因此C語言中的const是一個冒牌貨
指針存在的最大的意義,就是使用二級指針間接的賦值
總結
- 上一篇: 【2017年第2期】税务大数据分析的技术
- 下一篇: 作者:赵晨(1980-),男,深圳般若计