引用傳實參
希望傳實參時,除了傳地址,然後那邊用指針接收外,還可以直接用“引用”這種機製,十分方便,而且讓代碼更加簡潔清晰
唯一的缺點就是如果隻看調用的代碼,不知道是不是傳實參,不過如果是統一的用法就不會出錯了
#include <iostream> //引用地址空間 void exchange(int &a,int &b) { printf("inside before:a=%d,b=%d\n",a,b); printf("inside before address:&a=%X,&b=%X\n",&a,&b); int tmp=a; a=b; b=tmp; printf("inside after:a=%d,b=%d\n",a,b); printf("inside after address:&a=%X,&b=%X\n\n",&a,&b); } int main() { int a=999; int b=5; printf("before:a=%d,b=%d\n",a,b); printf("before address:&a=%X,&b=%X\n\n",&a,&b); exchange(a,b); printf("after:a=%d,b=%d\n",a,b); printf("after address:&a=%X,&b=%X\n",&a,&b); return 0; }
運行結果為:
before:a=999,b=5
before address:&a=12FF44,&b=12FF40
inside before:a=999,b=5
inside before address:&a=12FF44,&b=12FF40
inside after:a=5,b=999
inside after address:&a=12FF44,&b=12FF40
after:a=5,b=999
after address:&a=12FF44,&b=12FF40
還發現了一個有趣的現象就是,當用小寫的 %x 表示的時候,輸出的就是 12ff44 的小寫表示
當用大寫的 %X表示的時候,輸出的就是 12FF44 的大寫表示
轉一個百度知道上麵不錯的講解:
記住:函數全是值傳遞。。參數都是 傳遞原變量的值的一個 拷貝。不過你要弄明白傳遞的是什麼值。 a,普通變量時值傳遞,嗯,沒問題。你不能改變原來變量的值。 b,如果是指針,是地址的一個拷貝,其實也是值傳遞(地址的值傳遞)。你不能改變原來變量(地址)的值,但能(其實不是一定能)改變這個地址指向的內容,即所謂的實參被改變了。。。 c,如果是引用,傳遞的也是一個地址,不過這個地址又解析過了的,所以能直接用,不用再加*去解析(地址值傳遞,用時已經解析了)。改變值同指針一樣,不過不能改變地址就更明顯了(引用其實是一個解析了的const 指針) 1,值傳遞,而且不能修改原來的值。分配了空間。 2,你是指 char* p=0; char* &p2=p;樣子麼?對的,能這樣子,這時你用p2就和用p一樣了,表達的意思就是作為參數傳遞,你能改變參數的值了,就是能改變實參指針的地址了。。。。而且函數有時需要傳參數改變地址,參數就可以 char* &p2這樣子(也可以char** 不過要解析地址後用)。然後就可以在函數裏麵修改地址,然後原來那個指針(即指針的值(地址))就被改變了。其實原理和我上麵說的一樣。不過有多重*
最後更新:2017-04-03 14:53:58