學習了C語言以後,關於指針部分看了無數遍,有時候明明以爲本身看懂了,指針就是地址,可是老是在看代碼時候糊里糊塗的搞不明白,最近又關於指針強化了一把。編程
大部分狀況下對於程序中指針糊塗是由於不明白指針符「*」有兩個做用:函數
第一,做爲標識符,定義變量爲指針,如int *p;//只是說明變量p是指針變量,而沒有實際意義。學習
第二,做爲運算符,像+,—,運算符同樣,如cout<<*p;//輸出指針變量p所指向的內容。spa
通常在程序中,第一次出現的指針符*,是做爲標識符,申明指針變量,以後出現是做爲運算符,但也不必定,主要仍是看程序語境。指針
而「&」符號是一元運算符,取變量地址。code
好了,關於指針我目前使用最多的是做爲參數傳遞。因爲本身研究圖像處理,程序中每每要處理上千的圖片,內存經常溢出,內存分配尤爲重要,這時候我被迫學習了指針的使用。對象
面向對象編程函數傳遞每每是值傳遞,可是值傳遞的形參是實參的拷貝,若是此時我用值傳遞,上千張圖片在內存中再拷貝一份可想而知,因此考慮用指針傳遞。blog
//指針傳遞 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自己。