close

C++教學(二十一):指標陣列

指標即然也是變數的一種,有時為了集合資料與處理上的方便,我們也可以使用陣列的方式來管理指標變數,宣告指標陣列的方式與宣告變數是類似的,例如:
代碼:
int *ptr[10];


上面這段程式宣告一個指標陣列ptr,它擁有10個元素,當中的每個元素都可以儲存整數型態變數的記憶體位址,同樣也是使用索引來指定儲存至哪一個元素,例如:
代碼:
#include iostream
using namespace std;

int main() {
int *ptr[5];
int var1 = 10, var2 = 20, var3 = 30,
var4 = 40, var5 = 50;

ptr[0] = &var1 ;
ptr[1] = &var2 ;
ptr[2] = &var3 ;
ptr[3] = &var4 ;
ptr[4] = &var5 ;

for(int i = 0; i 5; i++)
cout *ptr[ i ] = *ptr
;

return 0;
}


執行結果:
代碼:
*ptr[0] = 10
*ptr[1] = 20
*ptr[2] = 30
*ptr[3] = 40
*ptr[4] = 50


上面這個程式是指標陣列的一個簡單應用,接下來我們介紹一個實務點的應用:二維陣列的動態記憶體配置方式。這與之前介紹過的二維陣列動態宣告版本不同,這個版本中,我們可以直接使用[]運算子來指定索引值。

首先我們必須知道在二維陣列中,陣列名稱表示陣列的第一個元素記憶體位置,而第一個索引與第二個索引各有其意義,假設有個陣列是宣告作:
代碼:
int arr[5][10] = {0};


則第一個索引的意義就是:
代碼:
*(arr+i) == &arr[0];


而第二個索引的意義就是:
代碼:
*(arr+i)+j = &arr[j]


所以我們要使用指標的概念來取出陣列指定索引值就是:
代碼:
*(*(arr+i)+j) = arr[j]


所以簡單的來說,二維陣列的名稱具有雙重指標的性質,下面的程式可以印證以上的說法:
代碼:
#include iostream
using namespace std;

int main() {
int arr[2][5] = {10, 20, 30, 40, 50,
60, 70, 80, 90, 100};

for(int i = 0; i 2; i++) {
for(int j = 0; j 5; j++) {
cout arr[ i ][ j ] =
*(*(arr+i)+j) ;
}
cout
;
}

return 0;
}


執行結果:
代碼:
arr[0][0] = 10 arr[0][1] = 20 arr[0][2] = 30 arr[0][3] = 40 arr[0][4] = 50
arr[1][0] = 60 arr[1][1] = 70 arr[1][2] = 80 arr[1][3] = 90 arr[1][4] = 100



以上的程式只是用以說明二維陣列與記憶體位址的關係,當然我們不會無聊到使用指標的方式來存取一個一般的陣列,然而我們在動態二維陣列宣告時,就必須使用到這個觀念了,我們的動態二維陣列宣告示範程式如下所示,我們宣告雙重指標以動態配置二維陣列:
代碼:
#include iostream
using namespace std;

int main() {
int m, n;
int i, j;
int **ptr;

cout 輸入Array維度:;
cin m n;

ptr = new int*[m];

for(i = 0; i m; i++)
*(ptr+i) = new int[n];

for(i = 0; i m; i++)
for(j = 0; j n; j++)
ptr[j] = i+j;


for(i = 0; i m; i++) {
for(j = 0; j n; j++)
cout ptr[j] ;
cout
;
}

for(i = 0; i m; i++)
delete [] (*(ptr+i));

delete [] ptr;

return 0;
}


執行結果:
代碼:
輸入Array維度:5 4
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7


使用new的方式來配置陣列,最後別忘了使用delete將空間還給記憶體。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 天才R 的頭像
    天才R

    做 個 有 趣 的 人

    天才R 發表在 痞客邦 留言(0) 人氣()