接下來為各位介紹陣列和指標的關係。在這裡要先跟大家討論說明,陣列其實本身就是一種指標,但指標本身是一種陣列嗎?答案是否定的,但你的確可以把指標當作陣列在使用(也就是所謂的動態陣列,這個以後會提到)。 

我們先設一個一維陣列,其內容為 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

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(8) 人氣()