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
但是這個變量裏面的內容是上面的地址。