c語言的傳值和傳址

2021-08-18 17:15:22 字數 1392 閱讀 5317

我們都知道c語言中函式傳參有兩種方式:傳值和傳址

傳值:

實參把值傳給形參,但沒有傳位址,即對實參的修改無效;生成臨時變數

核心原理:函式會對形參和中間變數重新分配空間

void swap(int pleft, int pright)

優點:安全(函式的***不會影響外部實參),區域性變數值的交換對主函式的變數無影響。

缺點:不能通過修改形參來改變外部實參

實參把自己的記憶體位址傳給了形參,這樣對實參的修改就有效了;同樣也生成臨時變數-該臨時變數為外部實參位址

void swap(int* pleft, int* pright)

優點:節省空間,效率高,改變形參可以修改外部實參

缺點:指標不安全,**難度提高,可能在不用修改外部實參時反而將其修改了

(1)全域性變數(把引數定義為全域性變數,一次性分配空間,傳位址,函式呼叫時無需訪問直接使用)

(2)指標是傳值的,但指標的間接引用是傳位址的

(3)陣列是傳位址的,因為陣列對記憶體要求比較苛刻,系統對陣列不再分配空間,而是傳位址

例項分析:

例1:

void swap(int x,int y)

int main(void)

傳值時,在主函式中呼叫swap()無法改變a,b的值,因為傳給swap()的引數實際上是a,b變數的乙份拷貝_a,_b,他們和a,b的位址並不一樣,當呼叫完swap後,它所佔的記憶體空間會被釋放,所以a,b的值並沒有被改變。

例2:

void swap(int* x,int* y)

int main(void)

傳址時,通過呼叫swap()可以改變a,b的值,因為此時傳遞的是a,b的位址,在swap()中改變*x,*y的值就相當於在改變a,b的值,因為他們的位址是一樣的,即使呼叫完swap後,它所佔的記憶體空間會被釋放,但a,b的值已被改變。

例3:

void getmemory(char* p,int num)

int main(void)

執行會報段錯誤,它和傳址呼叫有區別:getmemory()函式是想改變指標變數str本身的值,而不是改變*str的值,雖然在getmemory()函式中p的值會被改變,但當它呼叫完後,p會被釋放,所以str的值還是為空,要想改變str的值,應該傳&str。

通過例子可以看出,不管是傳址還是傳值都是傳的變數的乙份拷貝,要想改變變數本身的值,就應該傳該變數本身的位址。

傳值和傳址

let dadproto let sonproto dadproto sonproto.name 李四 console.log sonproto name 李四 age 20 console.log dadproto name 李四 age 20簡單資料型別 傳值 let a 10 let b a ...

傳值和傳址

在vb中呼叫函式或過程時,傳遞引數有兩種方式 傳址和傳值。其中vb預設為傳址方式,關鍵字byref一般可以省略。byref a as integer 表示引數a以傳址方式傳遞給函式或過程 byval a as integer 表示引數a以傳值方式傳遞給函式或過程 傳址就是把乙個存放資料的記憶體位址傳...

C語言的傳值和傳址的區別?

傳值時就是在記憶體中新開闢乙個空間,將值賦給這個新開闢的空間,其生命週期為該函式呼叫結束時釋放該空閒,計算結果不影響原呼叫資料記憶體空間的值。傳址時同樣新開闢乙個空間,但不同的是將所用資料空間的記憶體位址存在新開闢的空間中,即指標,函式在資料處理過程中由於是指標,即對源資料進行操作,操作後結果影響原...