【C 語言入門】161.使用指標循序存取陣列元素

今天我們來說說有了指標後,循序存取陣列元素有哪些做法。

在學會指標之前,循序存取陣列元素我們最常見的作法是使用計數器,在以下的例子為 i。

i 去數陣列的索引號,計數器一開始是 0,只要是 < 5就繼續數,這樣 v[i] 就會依序是 v[0]、v[1],一直到 v[4]。

#include <stdio.h>

int main()
{
    int v[5] = {1,2,3,4,5};
    int i;
    for(i = 0;i<5;i++){
        printf("%d\n",v[i]);
    }

    return 0;
}

以上是我們以前的做法,在前幾篇文章中,我們介紹了一個新的概念叫指標。

指標可以儲存陣列元素的位置。

#include <stdio.h>

int main()
{
    int v[5] = {1,2,3,4,5};
    int *n = v;
    int i;
    for(i = 0;i<5;i++){
        printf("%d\n", *(n+i));
    }

    return 0;
}

我們可以像以上的例子,用 n 儲存 v,這個 v 實際上是 v[0] 的位址。

v 這個陣列,會隱性轉型成 v[0] 的位址存到 n。

n 是 v[0] 的位址, n+i 就是 v[i] 的位址。

v[i] 的位址就是前面加一個 *,去取得裡面變數的值的時候,我們就會取得 v[i] 號的值。

如果以上的理解不了,可以看以下的程式。


#include <stdio.h>

int main()
{
    int v[5] = {1,2,3,4,5};
    int *n = v;
    int i;
    
    printf("%d\n", *n); // n == &v[0]
    n = n+1;
    printf("%d\n", *n); // n == &v[1]
    n = n+1;
    printf("%d\n", *n); // n == &v[2]
    n = n+1;
    printf("%d\n", *n); // n == &v[3]
    n = n+1;
    printf("%d\n", *n); // n == &v[4]
    return 0;
}

以 n == &v[0] 為例,n == &v[0] 其實也相當於 *n == v[0]。

因此如果要取得 v[0] ,我們可以直接用 *n 取得。

n 一開始存的是 v[0] 的位址,到最後 n 存的會是 v[4] 的位址,也就是 &v[4]。

指標是可以移動的,在我們原本存的是 v[0] 的位址,過程中呢,我可以存 v[1] 的位址、v[2] 的位址、v[3] 的位址、v[4] 的位址,我重複使用 n 。

另外,我們也可以使用 n++ 表示 n=n+1,就變成以下的樣子。

#include <stdio.h>

int main()
{
    int v[5] = {1,2,3,4,5};
    int *n = v;
    int i;
    
    printf("%d\n", *n); // n == &v[0]
    n++;
    printf("%d\n", *n); // n == &v[1]
    n++;
    printf("%d\n", *n); // n == &v[2]
    n++;
    printf("%d\n", *n); // n == &v[3]
    n++;
    printf("%d\n", *n); // n == &v[4]
    return 0;
}

如果直接寫成迴圈會變成:

#include <stdio.h>

int main()
{
    int v[5] = {1,2,3,4,5};
    int *n;
    for(n = v; n!=&v[5];n++){
        printf("%d\n", *n);
    }

    return 0;
}

迴圈中 n = v 中的 v 也就是 v[0] 的位址。

當 n 不等於 v[5] 的位址的時候,v[5] 的概念就是超過 v[4] 一格,也就是條件不成立,這時候我們就可以停止迴圈。

值得注意的是,我們處理的對象永遠都是陣列本身。

Leave a Comment

Your email address will not be published. Required fields are marked *