引用和指標最明顯的區別是宣告的時候,指標可以不初始化,而引用必須在宣告時就初始化,並且與某個變數關聯以後,將一直為那個變數「效忠」,它就像是一種「常指標」(位址不可改變)。
相同點是兩者在函式中都有位址的意義。
區別:1. 指標是乙個變數實體,而引用是個別名;
2. 引用使用時無需解引用(*),指標需要解引用;
3. 引用只能在定義時被初始化一次,之後不可變,指標可變;
4. 引用沒有const的概念,因為它在初始化以後就是乙個「const」的,指標有const和非const之分;
5. 引用必須初始化,指標可以不初始化;
6. 「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身(所指向的變數或物件的位址)的大小;
7. 指標和引用的自增(++)運算意義不一樣,引用操作內容,指標操作位址;
int main()
執行結果:
引用在初始化以後位址就不再改變,始終跟隨指向的變數,操作引用就是運算元據本身。
在c語言中,想要在呼叫函式時不按值傳遞引數,只有一種辦法,通過傳指標傳遞實參的位址
。c++則提供了多一種傳址的方式,傳引用。傳遞給呼叫函式的引數不再是引數變數的乙份拷貝,而是實參本身本身,加入形參是類型別的而且類物件的體積很大,那麼傳引用無疑是提高傳參效率的最佳選擇!
傳引用和傳指標都能做到改變實參的值,要想不改實參的值,可以在被呼叫函式中宣告形參的型別為const型引用,在型別不匹配的情況下被呼叫函式會為實參建立臨時變數,在函式中使用臨時變數而不直接操作實參本身,也不會去改變實參的值!所以在c++中,函式的形參為引用形參時,盡量使用const修飾,好處多多。
void callback(int &val)
int main()
這種編譯器會發現的錯誤,原因在於傳引用是傳遞實參本身,此時編譯器不會對變數型別進行檢查,而是直接丟擲錯誤(如果是傳值,則不存在這個問題,在拷貝實參的過程中編譯器會進行強制型別轉換)。
總之,使用引用,一是希望通過呼叫函式來改變實參,如果實參是內建資料型別、陣列、結構,則選擇傳指標,如果是類型別則選擇傳引用,當然這不是規定完全可以不遵照。二是傳遞資料物件的別名而不是拷貝整個資料物件可以提高程式的效能,這可以說是更重要的原因,如果資料物件是內建型別或小型資料物件則使用傳值即可,如果資料物件是類物件,按照c++的最新規則,應盡量使用傳引用。
幾個問題的
1.寫乙個函式返回引數二進位制中 1 的個數 比如 15 0000 1111 4 個 1 程式原型 int count one bits unsigned int value 解 無符號整型為32位,所以利用迴圈32次,逐個判斷二進位制每一位是不是1 int count one bits unsig...
String的幾個問題
1.已知strcpy的函式原型 char strcpy char strdest,const char strsrc 其中strdest 是目的字串,strsrc 是源字串。不呼叫c c 的字串庫函式,請編寫函式 strcpy。答案 char strcpy char strdest,const ch...
幾個問題的思考
對幾個問題的思考,對自己一種警醒也是總結,鞏固和提高 1.flex是什麼?某天早上躺在床上問起了自己這個問題,自己總結了乙個答案 flex是乙個面向程式設計師,基於元件,使用mxml標籤和as指令碼語言進行開發,同時基於事件並且資料互動方式為非同步的框架。2.怎麼成為傳說中的高手或者技術牛人?所謂的...