C中指針符*和取址符&

學習了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自己。

相關文章
相關標籤/搜索