C++語言中函數參數傳遞的本質是值傳遞

C語言中只有值傳遞,也就是傳遞副本,指針傳遞的只是地址的副本

當然,如果你傳遞了一個指向某個變量的指針,而函數對該指針執行了間接訪問操作,那麼函數就可以改變那個變量,但參數還是傳值方式傳遞的,這是兩個概念,不矛盾。

而對於引用傳遞,表面上看不會產生一個副本,看下面的代碼吧,不多多了

#include<iostream>
#include<string>
using namespace std;
//總結真正的理解值傳遞和指針傳遞,不是實參是指針變量,就代表是傳指針,也是傳值,因爲都是
//傳的變量,不管是指針變量,還是其他變量。
void testgetmemory(char *p)
{
	printf("testgetmemory 指針 p addr is [%x], p's value is[%x],*p is %c\n", &p,p,*p);
	*p = 'z';
}

void testgetmemory1(char &q)
{
	printf("testgetmemory 引用 q addr is [%x] q is %c\n", &q, q);
	q = 'z';
}
int main()
{
	char w = 'c';
	printf("w addr is [%x],w is %c\n", &w, w);
	testgetmemory1(w);
	testgetmemory(&w);
	return 0;
}

輸出的結果如下:

w addr is [3ef8f3],w is c
testgetmemory 引用 q addr is [3ef8f3] q is c
testgetmemory 指針 p addr is [3ef81c], p's value is[3ef8f3],*p is z
請按任意鍵繼續. . .

現在看總結如下:

傳遞指針同樣會產生一個副本

而傳遞引用確實沒有副本,因爲傳毒引用的話,和之前的變量地址相同都是 3cf7df

而傳遞指針變量的時候 產生了一個副本指針變量,其地址已經不是3cf7df而是一個新的地址,3cf708

但是這個變量裏面的內容是上面的地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章