生活随笔
收集整理的這篇文章主要介紹了
【c++】5.函数传指针与传值特容易混淆的点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數傳指針與傳值特容易混淆的點
這里只做一部分的解析,詳解請參考 指針參數傳遞動態內存 https://blog.csdn.net/daaikuaichuan/article/details/77229599
參考 https://bbs.csdn.net/topics/240071177
傳指針的目的是改變指針指向單元的值,而不是改變指針本身(即指針表示的地址).
如果函數參數是指針類型,需要具體分析:
見后面的代碼中:
void swap1(int *p1, int *p2) 是傳值,只不過這個值是個指針(地址);
void swap2(int *p1, int *p2)是傳指針,在函數內部是更改p1和p2指向的值,這也是我們最常用的方式。
如果函數內部是改變指針的指向(地址),則相當于傳值,雖然在函數內形參p1和p2指針指向改變了,但是調用了該函數之后,形參對應的實參p1和p2的指向地址完全沒改變。
p1,p2 是通過值傳入函數的,只不過這個值是個指針(地址),可看作函數局部變量。
#include <string.h>#include <iostream>
#include <map>
#include <string>
#include <vector>
void swap1(int *p1
, int *p2
) {std
::cout
<< "p1= " << p1
<< std
::endl
;std
::cout
<< "p2= " << p2
<< std
::endl
;int *temp
= NULL;if (*p1
< *p2
) {temp
= p1
;p1
= p2
;p2
= temp
;}std
::cout
<< "p1= " << p1
<< std
::endl
;std
::cout
<< "p2= " << p2
<< std
::endl
;
}
void swap2(int *p1
, int *p2
) {int temp
= 0;if (*p1
< *p2
) {temp
= *p1
;*p1
= *p2
;*p2
= temp
;}
}
int main(int argc
, char *argv
[]) {int a
= 2, b
= 3;std
::cout
<< "a= " << a
<< " , "<< "b= " << b
<< std
::endl
;int *pointer_1
, *pointer_2
;pointer_1
= &a
;pointer_2
= &b
;std
::cout
<< "pointer_1= " << pointer_1
<< std
::endl
;std
::cout
<< "pointer_2= " << pointer_2
<< std
::endl
;swap1(pointer_1
, pointer_2
);std
::cout
<< "swap1:" << std
::endl
;std
::cout
<< "*pointer_1= " << *pointer_1
<< " , "<< "*pointer_2= " << *pointer_2
<< std
::endl
;std
::cout
<< "pointer_1= " << pointer_1
<< std
::endl
;std
::cout
<< "pointer_2= " << pointer_2
<< std
::endl
;swap2(pointer_1
, pointer_2
);std
::cout
<< "swap2:" << std
::endl
;std
::cout
<< "*pointer_1= " << *pointer_1
<< " , "<< "*pointer_2= " << *pointer_2
<< std
::endl
;return -1;
}
總結
以上是生活随笔為你收集整理的【c++】5.函数传指针与传值特容易混淆的点的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。