C C 中傳值和傳位址(引用)

2021-09-06 21:48:06 字數 1306 閱讀 7209

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)

void get_str(char* p)

其中引數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)

void get_str(char** p)

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

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

void swap_by_ref(int& a, int& b)

int main(int argc, char* argv)

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

**:2015-03-14 10:44:10

傳值 傳引用 傳位址

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

傳值 傳位址 傳引用 的區別

傳值 傳位址 傳引用 1 傳值 優點 函式的 不會影響外部的實參 可讀性較高 缺點 傳參效率低 不能通過形參改變實參 對實參有保護作用 void swap int x,int y 2 傳位址 優點 傳參效率高 傳位址只需要4個位元組 確定 傳值變數大小不確定,有可能佔很大空間 可以通過形參改變實參 ...

PHP 傳值和傳引用 傳位址的區別

傳值,是把實參的值賦值給行參 那麼對行參的修改,不會影響實參的值 傳位址是傳值的一種特殊方式,只是他傳遞的是位址,不是普通的如int 那麼傳位址以後,實參和行參都指向同乙個物件 傳引用真正的以位址的方式傳遞引數 傳遞以後,行參和實參都是同乙個物件,只是他們名字不同而已 對行參的修改將影響實參的值 a...