[C++]指標和引用(一)

丫就是熊個貓貓發表於2016-12-02

指標和引用

指標的概念

資料在記憶體中是如何存取的?

系統根據程式中定義變數的型別,給變數分配一定的長度空間。字元型佔1個位元組,整型數佔4個位元組.....。記憶體區的每個位元組都有編號,稱之為地址。

 

1、直接訪問

按變數地址存取變數的值。cin>>i;   實際上放到定義 i 單元的地址中。

2、間接訪問

將變數的地址存放在另一個單元p中,通過 p 取出變數的地址,再針對變數操作。

 

一個變數的地址稱為該變數的指標。

如果在程式中定義了一個變數或陣列,那麼,這個變數或陣列的地址(指標)也就確定為一個常量。

變數的指標和指向變數的指標變數

變數的指標就是變數的地址,當變數定義後,其指標(地址)是一常量。

 

可以定義一個變數專門用來存放另一變數的地址,這種變數我們稱之為指標變數。在編譯時同樣分配一定位元組的儲存單元,未賦初值時,該儲存單元內的值是隨機的。

指標變數定義的一般形式為:

 

指標變數同樣也可以賦值:

 

也可以在定義指標變數時賦初值:

 

一個指標變數只能指向同一型別的變數。即整型指標變數只能放整型資料的地址,而不能放其它型別資料的地址。

 *在定義語句中只表示變數的型別是指標,沒有任何計算意義。

 * 在語句中表示“指向”。&表示“地址”。

 

指標變數的引用

指標變數只能存放地址,不要將非地址資料賦給指標變數。

++, - -,  * 優先順序相同,都是右結合性。

 

指標變數作為函式引數:

函式的引數可以是指標型別,它的作用是將一個變數的地址傳送到另一個函式中。

指標變數作為函式引數與變數本身作函式引數不同,變數作函式引數傳遞的是具體值,而指標作函式引數傳遞的是記憶體的地址。

輸入a, b兩個整數,按大小輸出這兩個數。

swap(int *p1, int *p2)

{  int  t;

    t=*p1;    *p1=*p2;   *p2=t;

}

void main(void)

{   int  *point1, *point2, a,b;

    cin>>a>>b;

    point1=&a;  point2=&b;

    if (a<b)

          swap (point1, point2);        

    cout<<“a=“<<a<<“,b=”<<b<<endl;

    cout<<*point1<<“,”<<*point2<<endl;

}

用指標變數作函式引數,在被調函式的執行過程中,應使指標變數所指向的引數值發生變化,這樣,函式在呼叫結束後,其變化值才能保留回主調函式。

函式呼叫不能改變實參指標變數的值,但可以改變實參指標變數所指向變數的值。

用指標變數作函式引數,可以得到多個變化了的值。

 

陣列的指標和指向陣列的指標變數

陣列與變數一樣,在記憶體中佔據單元,有地址,一樣可以用指標來表示。C++規定:陣列名就是陣列的起始地址;又規定:陣列的指標就是陣列的起始地址。陣列元素的指標就是陣列元素的地址。

一、指向陣列元素的指標變數的定義與賦值

 

二、通過指標引用陣列元素

 

 

用指向陣列的指標變數輸出陣列的全部元素

 

三、陣列名作函式引數

陣列名可以作函式的實參和形參,傳遞的是陣列的地址。這樣,實參、形參共同指向同一段記憶體單元,記憶體單元中的資料發生變化,這種變化會反應到主調函式內。

在函式呼叫時,形引數組並沒有另外開闢新的儲存單元,而是以實引數組的首地址作為形引數組的首地址。這樣形引數組的元素值發生了變化也就使實引數組的元素值發生了變化。

1、形參實參都用陣列名

 

 

2、實參用陣列名,形參用指標變數

 

3、形參實參都用指標變數

 

4、實參為指標變數,形參為陣列名

 

 

相關文章