傳值呼叫與傳位址呼叫(傳引用)

2021-05-26 19:28:42 字數 1134 閱讀 9991

c/c++中引數傳遞有兩種方式,傳值或傳位址(傳引用),通常我們要在被呼叫函式中改變乙個變數的值就需要傳位址呼叫方式,例如:

void swap_by_value(int a, int b)

void swap_by_ptr(int* pa, int* pb)

int main(int argc, char* argv)

很顯然,通過傳值呼叫並不能改變main函式中的a與b,要想改變a與b的值就必須通過傳位址方式,然後在被呼叫函式中通過指標訪問到主函式中的變數。

可是通過傳遞變數指標就一定是傳位址呼叫麼?看下面乙個例子

#include

#include

#include

void get_str(char* p)

int main(int argc, char* argv)

其中引數p是乙個指標,程式想通過p來得到在get_str(char* p)中分配的一塊記憶體。但是上面的**並不能完成此功能。原因是程式需要在get_str(char* p)中修改main函式中的指標變數p,使其指向malloc返回的一塊記憶體,要想在 get_str(char* p)中修改main函式中p的值就只有把p的位址傳過去,在get_str中通過位址訪問主函式中的變數p。正確的**如下:

#include

#include

#include

void get_str(char** p)

int main(int argc, char* argv)

引用是c++中的語法,結合了傳位址和傳值的優點,即傳遞的是乙個位址,但在形式上又沒有指標那個怪異的符合*,看上去舒服多了。

下面是乙個傳引用版的swap()函式

void swap_by_ref(int& a, int& b)

int main(int argc, char* argv)

總之,如果想在被呼叫函式中改變哪個變數的值就需要把那個變數的位址傳給被呼叫函式,這樣在被呼叫函式中通過位址就可以訪問和修改這個變數。傳值的時候會對引數進行拷貝,然後傳給被呼叫函式,而傳位址只是對位址進行乙份拷貝,然後賦給形參,這樣在c++中如果傳遞乙個比較大的物件時效率就有所區別了。對於簡單型別的變數來說傳值和傳位址在根本上是沒有區別的,都是傳遞乙個數給被呼叫函式,而怎樣去解釋和使用這個數是我們事先約定好的。

函式呼叫傳值 傳位址與引用的選擇

從函式呼叫的角度理解三者之間的區別 傳值 函式引數壓棧的是引數的副本。任何的修改是在副本上作用,沒有作用在原來的變數上。傳指標 壓棧的是指標變數的副本。當你對指標解指標操作時,其值是指向原來的那個變數,所以對原來變數操作。傳引用 壓棧的是引用的副本。由於引用是指向某個變數的,對引用的操作其實就是對他...

傳值呼叫與傳址呼叫

眾所周知,函式的呼叫分為傳值呼叫和傳址呼叫,那他們的區別是什麼呢?傳值呼叫 函式的形參和實參分別占有不同的記憶體塊,對形參的修改不會影響實參。傳址呼叫 傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫函式的方法。這種傳參方式可以讓函式和函式外邊的變數建立起真正的聯絡,也就是函式的內部...

傳值 傳引用 傳位址

1.值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。void swap int a,int b 呼叫 int x,y swap x,y 實...