【C語言入門】165.指標與遞增遞減運算子

在這篇文章,我們來討論值指標與遞增遞減運算子之間的關係。

他們之間的關係也是來自於陣列。

我們先來談一個陣列規定。

事實上我們要做陣列規定的動作是非常簡單的,但今天我們要介紹遞增遞減運算值與陣列以及指標的關係。

#include <stdio.h>

int main()
{
    int v[5];
    return 0;
}

先舉一個例子,假設我們有一個陣列 v,他有 5 個元素,每個都是整數。

如果要讓每個整數變成 0 的話,我們可以使用陣列的初始化,如下。

#include <stdio.h>

int main()
{
    int v[5] = {0};
    return 0;
}

我給它一個 0,後面四個就會自動補 0。

今天,我們希望用迴圈完成這件事。

#include <stdio.h>

int main()
{
    int v[5];
    for(i = 0; i < 5; i++){
        v[i] = 0;
    }
    return 0;
}

利用這個迴圈我們也可以得到一樣的結果。

用 for 迴圈表達

#include <stdio.h>

int main()
{
    int v[5];
    int i;
    int *p = v;
    for(i = 0; i < 5; i++){
        p[i] = 0;
        printf("%d",p[i]);
    }
    return 0;
}

這時候的 v 是不能直接存在 p 裡面的,v 需要隱性轉型成 v[0],存在 p 裡面。

以後我們對 v[i] 進行操作的時候,也就是對 v[i] 進行操作。

其中 i 是索引號。

那接下來我們看看直接數 p 的方式。

#include <stdio.h>

int main()
{
    int v[5];
    int i;
    int *p;
    for(p = v; p != &v[5]; p++){
        *p = 0;
        printf("%d",*p);
    }
    return 0;
}

迴圈中我們讓 p 一開始去數 v[0] 的位址,然後每次都進行 p++ 的動作。

第一次 p++ 後會變成 v[1] 的位址,第二次 p++ 後會變成 v[2] 的位址,以此類推。

也相當於把 p 裡面的位址所存放的變數,用間接運算子把它取得。

第一次存的是 v[0] 的位址,這時候 *p 也就是 v[0] 的值。

我把 v[0] 的值設成 0。接著 p++,這時候 *p 也就是 v[1] 的值,把 *p 設成 0,也就是把 [0] 設成 0。

v[5] 其實也是這個陣列的尾巴,雖然說 v[5] 是不存在的,但是 v[5] 的位址是可以存在的,這是 C 語言中的一個例外。

因此雖然 v[5] 不能直接讀取,但是 v[5] 的位址是確實存在的。

理解了原理之後,我們也可以這樣寫:

#include <stdio.h>

int main()
{
    int v[5];
    int i;
    int *p;
    for(p = v; p != (v+5); p++){
        *p = 0;
        printf("%d",*p);
    }
    return 0;
}

我們可以把 v[5] 的位址取代為 (v+5),我們之前有提過,v 也代表了 v[0] 的位址,v+5 也就是 v[0] 的位址,再後退 5 格,是 v[5] 的位址的另一種表達方式。

用 while 迴圈表達

當然我們也可以直接用 while 迴圈表達。

#include <stdio.h>

int main()
{
    int v[5];
    int *p = v;
    while(p != (v+5)){
        *p = 0;
        printf("%d",*p);
        p++;
    }
    return 0;
}

而其中,*p = 0p++ 是可以結合成 *p++ 的。

#include <stdio.h>

int main()
{
    int v[5];
    int *p = v;
    while(p != (v+5)){
        *p++ = 0;
        printf("%d",*p);
    }
    return 0;
}

不過最後的程式我書輸出的結果和理想的不一樣,你們也可以執行看看。

Leave a Comment

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