您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C/C++值傳遞和址傳遞有什么區(qū)別”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C/C++值傳遞和址傳遞有什么區(qū)別”這篇文章吧。
C/C++的按值傳遞和按地址傳遞有明顯不同,下面對他們作個區(qū)別:
按值傳遞:在調(diào)用函數(shù)中將原函數(shù)的值拷貝一份過去被調(diào)用的函數(shù),在被調(diào)用函數(shù)中對該值的修改不會影響原函數(shù)的值。
按地址傳遞:在調(diào)用函數(shù)的時候?qū)⒃瘮?shù)的值所在的地址拷貝一份過去,被調(diào)用函數(shù)對這個地址所作的修改會影響原來的值。
首先我們要知道 “a的地址
”和“a地址中的內(nèi)容
”的區(qū)別,數(shù)據(jù)是存放在內(nèi)存中的,每一個變量都有一個內(nèi)存地址, 變量的內(nèi)容存放在對應(yīng)內(nèi)存地址的空間中
比方說定義
int a = 10;
那么a在內(nèi)存中的地址是0x1100,在這個地址中存儲的數(shù)據(jù)是10
假設(shè)創(chuàng)建指針p,把a的地址賦值給p
,就是把a的首地址0x1100賦值給指針p
,這個時候p的值就是變量a在內(nèi)存中的首地址
int a =10; int*p; p=&a; //把a的首地址賦值給P
簡單點的理解就好比你去圖書館借書,每本書都會有他的一個編號(地址
),記錄它所在的位置,而這個書,就是這個地址對應(yīng)的內(nèi)容
,
如果你用指針,得到的是這個書所對應(yīng)的編號(地址
) ,存儲內(nèi)容就是地址
如果你是變量賦值,值傳遞,那么就相當(dāng)于復(fù)印了一遍這個書(地址對應(yīng)的內(nèi)容
),然后用一個新的編號(地址
),去存儲你復(fù)印的這本書
從命名來理解
所以我們就會發(fā)現(xiàn):
值傳遞,或者變量賦值,修改變量的值,修改的是新的新的編號(地址
)中的內(nèi)容(復(fù)印的書),不會影響到原來編號(地址
)中的數(shù)據(jù)。
也就是形參是實參內(nèi)容的拷貝,并不是地址的拷貝,所以改變形參的值并不會影響實參的值
使用址傳遞,用指針修改變量的值,就是把原編號(地址
)中的書給修改了,換了一本新的書,就相當(dāng)于對實參本身進行的操作。
聲明Declaration:描述在其他地方創(chuàng)建的對象,并不分配內(nèi)存。(可以出現(xiàn)在多個地方)
定義Definition:產(chǎn)生一個新的對象,并分配內(nèi)存。(只能出現(xiàn)一次)
新開辟一個內(nèi)存空間,存儲原來變量的值,修改變量修改的是新的內(nèi)存空間中的值。所以,原始的參數(shù)不會被函數(shù)修改。
值傳遞的優(yōu)點: 通過值來傳遞的參數(shù)可以是數(shù)字,變量,表達式。原本參數(shù)的值不會被修改。
值傳遞的缺點: 不能修改原參數(shù)的值。
#include <stdio.h> void swap (int x, int y) { int temp; temp = x; x = y; y = temp; // printf ("x = %d, y = %d\n", x, y); } int main (void) { int a = 4, b = 6; printf ("交換前:\n a = %d, b = %d\n", a, b); swap (a, b); printf ("交換后:\n a = %d, b = %d\n", a, b); return 0; }
輸出:
址傳遞就是指針傳遞,形參實際是指向?qū)崊⒌刂返闹羔槪?dāng)對形參的進行操作時,就相當(dāng)于對實參本身進行的操作,可以改變指針指向內(nèi)容的值,但是不能改變指針本身的地址。
#include <stdio.h> void swap (int *x, int *y) { int temp=*x; *x=*y; *y=temp; //printf("x = %d, y = %d\n", *x, *y); } int main(void) { int a=4; int b=6; printf("交換前:\n a = %d, b = %d\n", a, b); swap (&a,&b); //傳遞的是地址 printf("交換后:\n a = %d, b = %d\n", a, b); return 0; }
在你了解了什么是值傳遞和址傳遞之后,我們來看一個面試題:
#include <stdio.h> #include <string.h> #include <stdlib.h> void GetMemory( char *p ) { p = (char *) malloc( 100 ); } int main (void) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); return 0; }
請問運行會有什么樣的結(jié)果? 會輸出hello world嗎?
答:程序崩潰,沒有輸出
因為 GetMemory 并不能傳遞動態(tài)內(nèi)存,Test 函數(shù)中的 str 一直都是 NULL。strcpy(str, “hello world”);將使程序崩潰
函數(shù)中的p其實是實參str的一份拷貝,函數(shù)中的操作都是對q進行的,str仍然是NULL,所以輸出*str的值產(chǎn)生崩潰
也就是:傳遞給形參的指針仍然是實參指針的一份拷貝
這一點需要注意
解決的話可以把形參改為二重指針,程序便可以按預(yù)想中的情形進行:
二重指針指向一重指針的地址 也就是傳遞過來的實際是*str的參數(shù)本身
#include <stdio.h> #include <string.h> #include <stdlib.h> void GetMemory( char **p ) { *p = (char *) malloc( 100 ); } int main (void) { char *str = NULL; GetMemory(&str); strcpy( str, "hello world" ); printf( str ); return 0; }
以上是“C/C++值傳遞和址傳遞有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。