閱讀237 返回首頁    go 阿裏雲 go 技術社區[雲棲]


引用傳實參

希望傳實參時,除了傳地址,然後那邊用指針接收外,還可以直接用“引用”這種機製,十分方便,而且讓代碼更加簡潔清晰

唯一的缺點就是如果隻看調用的代碼,不知道是不是傳實參,不過如果是統一的用法就不會出錯了


#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

  上一篇:go DriverStudio 和 WDF驅動 通過GUID獲取設備句柄的差別
  下一篇:go js中insertAdjacentHTML的用法