按值傳遞:在呼叫函式中將原函式的值拷貝乙份過去被呼叫的函式,在被呼叫函式中對該值程式設計客棧的修改不會影響原函式的值。
按位址傳遞:在呼叫函式的時候將原函式的值所在的位址拷貝乙份過去,被呼叫函式對這個位址所作的修改會影響原來的值。
首先我們要知道「a的位址」和「a位址中的內容」的區別,資料是存放在記憶體中的,每乙個變數都有乙個記憶體位址, 變數的內容存放在對應記憶體位址的空間中
比方說定義
int a = 10;
那麼a在記憶體中的位址是0x1100,在這個位址中儲存的資料是10
假設建立指標p,把a的位址賦值給p,就是把a的首位址0x1100賦值給指標p,這個時候p的值就是變數a在記憶體中的首位址
int a =10;
int*p;
p=&a; //把a的首位址賦值給p
簡單點的理解就好比你去圖書館借書,每本書都會有他的乙個編號(位址),記錄它所在的位置,而這個書,就是這個位址對應的內容,
如果你用指標,得到的是這個書所對應的編號(位址) ,儲存內容就是位址
如果你是變數賦值,值傳遞,那麼就相當於影印了一遍這個書(位址對應的內容),然後用乙個新的編號(位址),去儲存你影印的這本書
從命名來理解
所以我們就會發現:
值傳遞,或者變數賦值,修改變數的值,修改的是新的新的編號(位址)中的內容(影印的書),不會影響到原來編號(位址)中的資料。
也就是形參是實參內容的拷貝,並不是位址的拷貝,所以改變形參的值並不會影響實參的值
使用址傳遞,用指標修改變數的值,就是把原編號(位址)中的書給修改了,換了一本新的書,就相當於對實參本身進行的操作。
宣告declaration:描述在其他地方建立的物件,並不分配記憶體。(可以出現在多個地方)
定義definition:產生乙個新的物件,並分配記憶體。(只能出現一次)
新開闢乙個記憶體空間,儲存原來變數的值,修改變數修改的是新的記憶體空間中的值。所以,原始的引數不會被函式修改。
值傳遞的優點: 通過值來傳遞的引數可以是數字,變數,表示式。原本引數的值不會被修改。
值傳遞的缺點: 不能修改原引數的值。
#include
void swap (int x, int y)
int main (void)
輸出:址傳遞就是指標傳遞,形參實際是指向實參位址的指標,當對形參的進行操作時,就相當於對實參本身進行的操作,可以改變指標指向內容的值,但是不能改變指標本身的位址。
#include
void swap (int *x, int *y)
int main(void)
在你了解了什麼是值傳遞和址傳遞之後,我們來看乙個面試題:
#include
#include
#include
void getmemory( char *p )
int main (void)
請問執行會有什麼樣的結果? 會輸出hello world嗎?
答:程式崩潰,沒有輸出
因為 getmemory 並不能傳遞動態記憶體,test 函式中的 str 一直都是 null。strcpy(str, 「hello world」);將使程式崩潰
函式中的p其實是實參str的乙份拷貝,函式中的操作都是對q進行的,str仍然是null,所以輸出*str的值產生崩潰
也就是:傳遞給形參的指標仍然是實參指標的乙份拷貝
這一點需要注意
解決的話可以把形參改為二重指標,程式便可以按預想中的情形進行:
二重指標指向一重指標的位址也就是傳遞過來的實際是*str的引數本身
#include
#include 程式設計客棧
#include
void getmemory( char **p )
int main (void)
值傳遞 和址傳遞
c 關於引數按值傳遞和按址傳遞的,swap為乙個交換函式 交換2個數的值,通常交換值的時候會用到臨時變數,本例中直接通過原有變數進行操作實現了變數的值的交換 code class program b a,b 值傳遞 void swap int a,int b b a,b static void ma...
C語言中的值傳遞與址傳遞和引用傳遞
c語言中的值傳遞與址傳遞 在剛接觸c語言的學習過程中,很多小白都會在函式引數傳遞上被難住,由於我也是小白,所以我也不例外。之前在做oj的時候遇到一題,掛在了自定義的函式引數傳遞的問題上。下面先放兩個簡單的例子。函式swap用來交換兩個數的值。include void swap int m,int n...
C語言 值傳遞與址傳遞
一 三道考題 1.考題一 程式 如下 void exchg1 int x,int y void main 輸出的結果 x y a b 問下劃線的部分應是什麼,請完成。2.考題二 如下 exchg2 int px,int py main 輸出的結果為 px py a b 問下劃線的部分應是什麼,請完成...