【C++】21.函数传参 传指针和传引用的区别
指針傳參
向函數傳指針參數時,注意區分指針的指向(地址) 與 指針指向的地址中存放的值的區別:
- 改變形參指針的指向,實參指針指向不會變,實參指向的地址存放的值也不會變;
- 改變形參指針指向的地址中存放的值,實參指針指向的地址中的值也會改變。
例1:改變形參指針的指向
例如,有個指針ptr1指向變量a。把ptr1傳給函數的一個形參指針ptr2(這也是值傳遞,它所傳遞的是一個地址值)。如果在函數中將形參指針ptr2指向了另外一個變量b的地址,那也只是形參指針ptr2的指向變了,不影響實參ptr1。
void test(int *ptr2) {int c = 2;ptr2 = (&c); }int main() {int a = 1;int *ptr1 = &a;test(ptr1);std::cout << "*ptr1= " << *ptr1 << std::endl; //結果是 1return 0; }可以看到,函數參數傳了指針,形參指針改變指向,卻并沒有改變實參指針指向地址中的值。
例2:改變形參指針指向的地址中存放的值
下面這個傳參傳指針,但是函數中沒有改變形參的指向,只改變了地址中的值,所以會改變實參指針指向地址中的值:
void test(int*ptr2){(*ptr2)=3; }int main(){int a=1,b=2;int *ptr1=&a;test(ptr1);std::cout<< "*ptr1= " <<*ptr1<<std::endl; //結果是 3 return 0; }可以看到,函數參數傳了指針,形參指針指向的地址中存放的值被修改了,(形參指針沒有改變指向),實參指針指向地址中的值也被修改了。因為形參指針和實參指針都是指向
內存中同一塊區域。
更詳細的解釋可參考:c++ 引用傳參和指針傳參的區別
指針參數傳遞:
- 指針參數傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,會在棧中開辟內存空間以存放由主調函數傳遞進來的實參值,從而形成了實參的一個副本(替身)。值傳遞的特點是,被調函數對形式參數的任何操作都是作為局部變量進行的,不會影響主調函數的實參變量的值(形參指針變了,實參指針不會變)。
引用參數傳遞
-
引用參數傳遞過程中,被調函數的形式參數也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量(根據別名找到主調函數中的本體)。因此,被調函數對形參的任何操作都會影響主調函數中的實參變量。
-
引用傳遞和指針傳遞是不同的,雖然他們都是在被調函數棧空間上的一個局部變量,但是任何對于引用參數的處理都會通過一個間接尋址的方式操作到主調函數中的相關變量。而對于指針傳遞的參數,如果改變被調函數中的指針地址,它將應用不到主調函數的相關變量。如果想通過指針參數傳遞來改變主調函數中的相關變量(地址),那就得使用指向指針的指針或者指針引用。
-
從編譯的角度來講,程序在編譯時分別將指針和引用添加到符號表上,符號表中記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值(與實參名字不同,地址相同)。符號表生成之后就不會再改,因此指針可以改變其指向的對象(指針變量中的值可以改),而引用對象則不能修改。
總結
以上是生活随笔為你收集整理的【C++】21.函数传参 传指针和传引用的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【多线程】std::unique_loc
- 下一篇: 【Socket网络编程】14. perr