C++ 函數的參數傳遞能夠分爲:值傳遞和引用傳遞。函數
二者的最大區別也很簡單,若是該函數的參數只是讀的話,值傳遞就能夠知足。若是該函數的參數須要進行修改並返回的時候,就應該進行引用傳遞。測試
C++指針做爲參數也遵循以上原則,先來看幾個例子:spa
void test1(int *p) { *p = 5; } int main() { int a = 1; int *p = &a; std::cout << *p << std::endl; test1(p); std::cout << *p << std::endl; return 1; } //結果爲:1 5 void test2(int *p) { int b = 5; p = &b; } int main() { int a = 1; int *p = &a; std::cout << *p << std::endl; test2(p); std::cout << *p << std::endl; return 1; } //結果爲: 1 1 void test3(int *&p) { int b = 5; p = &b; } int main() { int a = 1; int *p = &a; std::cout << *p << std::endl; test3(p); std::cout << *p << std::endl; return 1; } //結果爲:1 5
經過以上三種測試,咱們能夠發現指針做爲參數形參傳遞的一個基本原理:指針
指針做爲函數的參數,能夠修改指針地址指向的值,而且可以正確返回,可是沒法經過直接修改指針的地址來改變指針的返回,由於指針參數當中,指針的地址是值傳遞,無返經過修改值傳遞獲得正確返回。若是想經過修改指針的地址來修改指針的返回結果,須要經過引用傳遞,則必須將指針改成指針的引用做爲函數參數,如void test3(*& p)函數同樣。code
另外還有一種方法須要思考一下,既然的指針做爲參數,其地址是值傳遞,不能進行修改地址而獲得有效返回,可是咱們能夠修改指針地址指向的值,進行有效返回。既然若是,咱們能夠在指針參數的基礎上再加一個指針,這樣原指針就是指針地址指向的值了,能夠進行修改返回,具體代碼能夠以下所示:blog
void test4(int **p) { int b = 5; *p =&b; } int main() { int a = 1; int *p=&a; std::cout << *p << std::endl; test(&p); std::cout << *p << std::endl; return 1; } //結果爲:1 5