1. 程式人生 > >C中指針符*和取址符&

C中指針符*和取址符&

nbsp 有時 重要 拷貝 目前 col class log span

學習了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本身。

C中指針符*和取址符&