1.C++指針作形參,會有不少陷阱,不少時候也許並不如咱們想的那樣。好比咱們想經過一個函數改變指針的值:ios
#include<</SPAN>iostream> using namespace std; void test_point(int *p) { int a=2; p=&a; //關鍵點 } int main() { int x=1; int *p1=&x; test_point(p1); cout<<*p1<<endl; return 0; }
這段代碼明顯想經過函數改變p1的值,可是結果卻沒有變化,輸出仍舊是1。問題就出在關鍵點那裏!函數
二、再看一個代碼:spa
#include<</SPAN>iostream> using namespace std; void test_point(int *p) { int a=2; *p=a; //關鍵地方,體會與上一段代碼的不一樣 } int main() { int x=1; int *p1=&x; test_point(p1); cout<<*p1<<endl; return 0; }
這段代碼卻可以改變輸出值。區別就在*p=a與p=&a之間。指針
3.《C++ primer(第四版)》105頁能夠發現其中的解釋:code
對p=&a,稱之爲給指針賦值,意思是給指針自己一個指向的對象。對象
而對*p=a稱之爲經過指針進行賦值,意思是改變指針所指對象的值。blog
解釋以下:對於p=&a,就是把函數形參指針p指向a(給指針賦值,賦上a的地址便可指向a),臨時變量a在函數調用完以後就不復存在,實參p1io
也不會被改變,*p1=4;而*p=a就是經過指針進行賦值,也就是說*p是指指針p指向的值,給*p賦值a,就是給*p所指向的值賦值,指針傳參傳給形參p的是x的地址,也就是說在函數中*p其實表示給x賦值,這樣即便局部變量a消失了,可是x的值早已經過指針真正改變了。class