接下來為各位介紹陣列和指標的關係。在這裡要先跟大家討論說明,陣列其實本身就是一種指標,但指標本身是一種陣列嗎?答案是否定的,但你的確可以把指標當作陣列在使用(也就是所謂的動態陣列,這個以後會提到)。
我們先設一個一維陣列,其內容為 for(i=0; i<MAX; i++) Array[i] = I; 由於OS分配給陣列的記憶體位置是連續的,所以配置好後其記憶體示意圖如下所示。
儲存值 |
0 |
1 |
2 |
3 |
4 |
記憶體位址 |
12FF44 |
12FF48 |
12FF4C |
12FF50 |
12FF54 |
Array |
Array[0] |
Array[1] |
Array[2] |
Array[3] |
Array[4] |
接著,我們可以把 Array 就當作是一個指標去看,其中
Array[0] = *(Array+0);
Array[1] = *(Array+1);
Array[2] = *(Array+2);
Array[3] = *(Array+3);
Array[4] = *(Array+4);
換個通式會好看一點:Array[i] = *(Array+i);
1. *(Array+i)
Array 一開始就是配置好的整數陣列,如果把Array當作是一個指標看來, (Array+i) ,因為Array是一個整數陣列,一開始的 Array就是整個陣列的起始位址,而+i指的是陣列的起始位址,再往後i個位址。所以(Array+i) 指的是 “第i個陣列的位址”,所以再用 *(Array+i) 去依址取值,就相當於 Array[i] 的功能。
2. 宣告一個指標指向陣列 Array
如果我要宣告另一個陣列指向 Array,可以有三種做法
(2.1) int *ptr1 = Array;
請記得,我曾說過,陣列本身可以當指標去使用。如果現在把 Array 當一個指標,那也不過是將一個指標的內容,丟給另一個指標而已。這種用法是賦予其初值。
(2.2) int *ptr1 = NULL;
ptr1 = Array;
這種用法和 (2.1) 沒有二樣,我就不多說明了。
(2.3) int *ptr1 = &Array[0];
這種用法比較少見。我們都知道 Array[0] 存的是一個元素(在這個例子而言是一個整數),那麼對這個變數進行 & 取址運算,再丟給 ptr1 做初值。(如果這部份看不懂的話,請先看 01_初學指標請進 – 指標與位址 )
注意,當你的整數指標 ptr1 指向 Array位址後,你就可以進行存取的動作,而且和 Array 的操作方式都一樣。
以下source code ,請注意我是如何取得陣列的儲存值和位址值的。若有問題的話,歡迎留言討論。
3. 原始碼
// ====================================
// FileName: PtrArray.cpp
// Author : Edison.Shih.
// Complier: VC 2008
// ====================================
//
#include <stdio.h>
#define MAX 5
// ====================================
//
int main(int argc, char *argv)
{
int i=0;
int Array[MAX];
for(i=0; i<MAX; i++) Array[i] = i;
// show array value - 1
printf("============================== \n");
for(i=0; i<MAX; i++) printf("Array[%d] = %d\n", i, Array[i]);
// show array value - 2
printf("============================== \n");
for(i=0; i<MAX; i++) printf("*(Array+%d) = %d\n", i, *(Array+i));
// show array address - 1
printf("============================== \n");
for(i=0; i<MAX; i++) printf("&Array[%d] = %0X\n", i, &Array[i]);
// show array address - 2
printf("============================== \n");
for(i=0; i<MAX; i++) printf("(Array+%d) = %0X\n", i, (Array+i));
/* method1.
int *ptr1 = Array;
*/
/* method2.
int *ptr1 = NULL;
ptr1 = Array;
*/
/* method3. */
int *ptr1 = &Array[0];
// show array value - 1
printf("============================== \n");
for(i=0; i<MAX; i++) printf("ptr1[%d] = %d\n", i, ptr1[i]);
// show array value - 2
printf("============================== \n");
for(i=0; i<MAX; i++) printf("*(ptr1+%d) = %d\n", i, *(ptr1+i));
// show array address - 1
printf("============================== \n");
for(i=0; i<MAX; i++) printf("&ptr1[%d] = %0X\n", i, &ptr1[i]);
// show array address - 2
printf("============================== \n");
for(i=0; i<MAX; i++) printf("(ptr1+%d) = %0X\n", i, (ptr1+i));
return 0;
}
4. 程式結果
==============================
Array[0] = 0
Array[1] = 1
Array[2] = 2
Array[3] = 3
Array[4] = 4
==============================
*(Array+0) = 0
*(Array+1) = 1
*(Array+2) = 2
*(Array+3) = 3
*(Array+4) = 4
==============================
&Array[0] = 12FF44
&Array[1] = 12FF48
&Array[2] = 12FF4C
&Array[3] = 12FF50
&Array[4] = 12FF54
==============================
(Array+0) = 12FF44
(Array+1) = 12FF48
(Array+2) = 12FF4C
(Array+3) = 12FF50
(Array+4) = 12FF54
==============================
ptr1[0] = 0
ptr1[1] = 1
ptr1[2] = 2
ptr1[3] = 3
ptr1[4] = 4
==============================
*(ptr1+0) = 0
*(ptr1+1) = 1
*(ptr1+2) = 2
*(ptr1+3) = 3
*(ptr1+4) = 4
==============================
&ptr1[0] = 12FF44
&ptr1[1] = 12FF48
&ptr1[2] = 12FF4C
&ptr1[3] = 12FF50
&ptr1[4] = 12FF54
==============================
(ptr1+0) = 12FF44
(ptr1+1) = 12FF48
(ptr1+2) = 12FF4C
(ptr1+3) = 12FF50
(ptr1+4) = 12FF54