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

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

指標和引用

陣列名作函式引數

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

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

 

既然陣列做形參沒有開闢新的記憶體單元,接受的只是實引數組的首地址,那麼,這個首地址也可以在被調函式中用一個指標變數來接受,通過在被調函式中對這個指標變數的指向進行操作而使實引數組發生變化。

 

四、指向多維陣列的指標和指標變數

用指標變數也可以指向多維陣列,表示的同樣是多維陣列的首地址。

 

可以將a陣列看作一個一維陣列,這個一維陣列的每個元素又是一個具有4個int型資料的一維陣列,這樣,我們就可以利用一維陣列的概念來標記一些寫法。

a[0]=*(a+0)   a+0為a[0]的地址&a[0],其值為2000H。

a[1]=*(a+1)   a+1為a[1]的地址&a[1],其值為2010H。

a[2]=*(a+2)   a+2為a[2]的地址&a[2],其值為2020H。

a[0]為一維陣列名,其陣列有四個int型的元素:

a[0][0],a[0][1],a[0][2],a[0][3]

同樣,a[0]代表一維陣列的首地址,所以,a[0]為&a[0][0]。

 

 

 

a為二維陣列名,a+1為a[1]的地址,也就是陣列第一行的地址,所以a為行指標。

a[1]為一維陣列名,a[1]+1為a[1][1]的地址,也就是陣列第一行第一列的地址,所以a[1]為列指標。

可以看到:a,  a+0 ,  *(a+0), a[0], &a[0][0]表示的都是2000H,即二維陣列的首地址。   

實際上,a[0], a[1], a[2]並不是實際的元素,它們在記憶體並不佔具體的儲存單元,只是為了我們表示方便起見而設計出的一種表示方式。

 

 

字串的指標和指向字串的指標變數

字串的表示形式

1、用字元陣列實現

void main(void )

{  char string[ ]=“I love China”;

    cout<<string;

}

string為陣列名,代表陣列的首地址,是常量。

2、用字元指標表示字串

void main(void)

{  char *string=“I love China”;

    cout<<string;

}

 

將記憶體中字串常量的首地址賦給一個指標變數

字串指標作函式引數

將一個字串從一個函式傳遞到另一個函式,可以用地址傳遞的辦法。即用字元陣列名作引數或用指向字串的指標變數作引數。在被調函式中可以改變原字串的內容。

 

字元指標變數與字元陣列

字元陣列和字元指標變數都可以實現字串的儲存和運算,區別在於:

字元陣列名是常量,定義時必須指明佔用的空間大小。

字元指標變數是變數,裡面儲存的是字元型地址,可以整體賦值,但字串必須以‘\0’結尾。

 

函式的指標和指向函式的指標變數

可以用指標變數指向變數、字串、陣列,也可以指向一個函式。

一個存放地址的指標變數空間可以存放資料的地址(整型、字元型),也可以存放陣列、字串的地址,還可以存放函式的地址。

函式在編譯時被分配給一個入口地址。這個入口地址就稱為函式的地址,也是函式的指標。像陣列一樣,C++語言規定,函式名就代表函式的入口地址

 

專門存放函式地址的指標變數稱為指向函式的指標變數。

 

函式名max代表函式在記憶體中的入口地址,是一個常量,不可被賦值。

而指向函式的指標變數 p 可以先後指向不同的同種型別的函式。但不可作加減運算。

 

實參:實際的函式名(函式地址)

形參:指向函式的指標變數

與實參函式的型別完全一致(返回值、引數)

通用函式:所有的內部函式呼叫都用函式指標呼叫

 

返回指標值的函式

被調函式返回的不是一個資料,而是一個地址。所以函式的型別為指標型別。

 

指標陣列和指向指標的指標

指標陣列的概念

一個陣列,其元素均為指標型別的資料,稱為指標陣列。也就是說,指標陣列中的每一個元素都是指標變數,可以放地址。

 

常用字元指標陣列,陣列中的元素指向字串首地址,這樣比字元陣列節省空間。

 

指向指標的指標變數

 

同樣,p也有地址,可以再引用一個指標變數指向它。

 

稱prt為指向指標的指標變數。其基型別是指向整型資料的指標變數,而非整型資料。

 

指標陣列作main( )函式的形參

程式是由main( )函式處向下執行的。main函式也可以帶引數。

其它函式由main函式呼叫的,即在程式中呼叫的,但main函式卻是由DOS系統呼叫的,所以main函式實參的值是在DOS命令列中給出的,是隨著檔案的執行命令一起給出的。

 

main函式形參的形式:

main(  int argc, char * argv[ ])

main( int  argc, char  **argv)

argc為命令列中引數的個數(包括檔名);

argv為指向命令列中引數(字串)的指標陣列。

 

小結

1、指標變數可以有空值,即指標變數不指向任何地址。

2、兩指標可以相減,不可相加。若要進行相減運算,則兩指標必須指向同一陣列,相減結果為相距的陣列元素個數

3、指向同一陣列的兩個指標變數可以比較大小:p2>p1

 

在記憶體動態分配儲存空間

在定義變數或陣列的同時即在記憶體為其開闢了指定的固定空間。

int  n,   a[10];

char    str[100];

一經定義,即為固定地址的空間,在記憶體不能被別的變數所佔用。

在程式內我們有時需要根據實際需要開闢空間,如輸入學生成績,但每個班的學生人數不同,一般將人數定得很大,這樣佔用記憶體。

 

相關文章