指標與陣列


在宣告一個陣列之後,陣列名稱用來參考至陣列的第一個元素的記憶體位址,例如在下面的程式中將指出,陣列arr與&arr[0]所指向的 位置是相同的:

#include <iostream> 
using namespace std;

int main() {
int arr[10] = {0};
cout << "arr :\t\t" << arr
<< endl;
cout << "&arr[0]: \t" << &arr[0]
<< endl;

return 0;
}

執行結果:
arr :            0x22ff40
&arr[0]:     0x22ff40


之前也曾經討論過,陣列的索引其實是相對於第一個記憶體位址的位移量,下面這個程式以指標運算與陣列索引操作,顯示出相同的對應位址值:

#include <iostream> 
using namespace std;

int main() {
const int length = 10;
int arr[length] = {0};
int *ptr = arr;

for(int i = 0; i < length; i++) {
cout << "&arr[" << i << "]: " << &arr[i];
cout << "\tptr+" << i << ": " << ptr+i;
cout << endl;
}

return 0;
}

執行結果:

&arr[0]: 0x22ff30       ptr+0: 0x22ff30
&arr[1]: 0x22ff34       ptr+1: 0x22ff34
&arr[2]: 0x22ff38       ptr+2: 0x22ff38
&arr[3]: 0x22ff3c       ptr+3: 0x22ff3c
&arr[4]: 0x22ff40       ptr+4: 0x22ff40
&arr[5]: 0x22ff44       ptr+5: 0x22ff44
&arr[6]: 0x22ff48       ptr+6: 0x22ff48
&arr[7]: 0x22ff4c       ptr+7: 0x22ff4c
&arr[8]: 0x22ff50       ptr+8: 0x22ff50
&arr[9]: 0x22ff54       ptr+9: 0x22ff54


在這個程式中,您將陣列的第一個元素位址指定給ptr,然後對ptr作遞增運算,每遞增一個單位,其與陣列相對應索引的元素之記憶體位址都相同,這可以說 明陣列索引的背後意義。

您也可以利用指標運算來取出陣列的元素值,如以下的程式所示:

#include <iostream> 
using namespace std;

int main() {
const int length = 5;
int arr[length] = {10, 20, 30, 40, 50};
int *ptr = arr;

// 以指標方式存取資料
for(int i = 0; i < length; i++) {
cout << "*(ptr+" << i << "): " << *(ptr+i)
<< endl;
}
cout << endl;

// 以陣列方式存取資料
for(int i = 0; i < length; i++) {
cout << "ptr[" << i << "]: " << ptr[i]
<< endl;
}
cout << endl;

// 以指標方式存取資料
for(int i = 0; i < length; i++) {
cout << "*(arr+" << i << "): " << *(arr+i)
<< endl;
}
cout << endl;

// 以陣列方式存取資料
for(int i = 0; i < length; i++) {
cout << "arr[" << i << "]: " << arr[i]
<< endl;
}
cout << endl;

return 0;
}

執行結果:

*(ptr+0): 10
*(ptr+1): 20
*(ptr+2): 30
*(ptr+3): 40
*(ptr+4): 50

ptr[0]: 10
ptr[1]: 20
ptr[2]: 30
ptr[3]: 40
ptr[4]: 50

*(arr+0): 10
*(arr+1): 20
*(arr+2): 30
*(arr+3): 40
*(arr+4): 50

arr[0]: 10
arr[1]: 20
arr[2]: 30
arr[3]: 40
arr[4]: 50


在上面的程式中,您可以使用指標運算配合*運算子來取出陣列中的每個元素,也可以配合下標運算子來取出陣列元素。