申明:轉載請注明出處!
學習了C語言之后,關於指針部分看了無數遍,有時候明明覺得自己看懂了,指針就是地址,但是總是在看代碼時候糊里糊塗的搞不明白,最近又關於指針強化了一把。
大部分情況下對於程序中指針糊塗是因為不明白指針符“*”有兩個作用:
第一,作為標識符,定義變量為指針,如int *p;//只是說明變量p是指針變量,而沒有實際意義。
第二,作為運算符,像+,—,運算符一樣,如cout<<*p;//輸出指針變量p所指向的內容。
一般在程序中,第一次出現的指針符*,是作為標識符,申明指針變量,之后出現是作為運算符,但也不一定,主要還是看程序語境。
而“&”符號是一元運算符,取變量地址。
好了,關於指針我目前使用最多的是作為參數傳遞。由於自己研究圖像處理,程序中往往要處理上千的圖片,內存常常溢出,內存分配尤其重要,這時候我被迫學習了指針的使用。
面向對象編程函數傳遞往往是值傳遞,但是值傳遞的形參是實參的拷貝,如果此時我用值傳遞,上千張圖片在內存中再拷貝一份可想而知,所以考慮用指針傳遞。
//指針傳遞 void swap(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; cout<<*a<<‘ ’<<*b<<’\n’; } int main(){ int x=1; int y=2; swap(&x,&y); cout<<x<<‘ ’<<y<<’\n’; } //輸出2 1 , 2 1
上段程序中,實參傳遞的是x,y 的地址,形參定義a,b為指針變量,a,b內容為x,y地址的拷貝,程序中*a,*b是x,y地址所指向的內容,即為x,y。
所以程序中操作的也是x,y本身,此程序不需要重新在內存中開辟新的空間,之間操作實參本身。
另一種傳遞方式,引用傳遞,作用和指針傳遞一樣
//引用傳遞: void swap(int &a,int &b) { int temp; temp=a; a=b; b=temp; cout<<a<<’ ‘<<b<<’\n’; } int main(){ int x=1; int y=2; swap(x,y); cout<<x<<’ ‘<<y<<’\n’; return 0; }
上段代碼跟指針傳遞結果一樣,均輸出2 1 , 2 1
函數調用形式跟值傳遞一樣,但是被調用函數的形參則引用x,y 的地址,函數中操作的也是x,y本身。