【C 語言入門】160.指標與陣列

指標和陣列有甚麼不同?

以以下範例為例:

int v[5];//宣告定義有一個 5 個元素的 int 陣列,佔據 5 個 int 大小的記憶體
int *n;  //宣告定義一個 int 指標,佔據 1 個 int *大小的記憶體

從裡面存的東西和輸入來看,這兩者的輸入沒有太大的關係,v 是個陣列,有連續的空間存了很多個相同的元素,n 是個指標,他只有一個空間,他只能存一個位子。

一個整數的陣列和一個整數的指標之間的關係是怎樣的呢?

整數的陣列中,每個元素一定是個整數,每個整數都會有一個獨一無二的位置。

v[0] 到 v[4] ,每個都會有一個位置。

因為 v 是個整數的陣列,因此每個元素都會是整數,每個元素的位置都會是一個整數的位置。

而 n 可以存一個整數的位置,換句話說,我們是不是可以把 v[0] 的位址存到 v 裡面。

int v[5];//宣告定義有一個 5 個元素的 int 陣列,佔據 5 個 int 大小的記憶體
int *n;  //宣告定義一個 int 指標,佔據 1 個 int *大小的記憶體

n = &v[0];

陣列和指標最重要的關係

v 是整數的陣列,n 是整數的指標/整數的位址。

C 語言可以把陣列型別的值,複製給一個指標的變數

int v[5];//宣告定義有一個 5 個元素的 int 陣列,佔據 5 個 int 大小的記憶體
int *n;  //宣告定義一個 int 指標,佔據 1 個 int *大小的記憶體

n = &v[0];
n = v; 

v 是一個整數陣列,他就可以隱性轉型成一個整數的指標。

而且這個指標,就是第一個元素的指標。

一個陣列型別,可以隱性轉型成改陣列第一個元素的位置的指標。

n = &v[0] 和 n = v 代表一樣的意思。

我們可以對指標做整數的加減運算,v 陣列有 5 個元素,分別是 v[0] 到 v[4]。

n 是一個指標,存的是一個整數的位置,v 被隱性轉型成 v[0] 的位置。

int v[5];
int *n = v;

也就是說,我們做完初始化設定後, n 裡面存的是 v[0] 的位置,這是 C 語言規定的。

int v[5];
int *n = v;
n   == &v[0];
n+1 == &v[0]+1;
int v[5];
int *n = v;
n   == &v[0];
n+1 == &v[1];
int v[5];
int *n = v;
n   == &v[0];     n   == &v[0];
n+1 == &v[0]+1;   n+1 == &v[1];
n+2 == &v[0]+2;   n+2 == &v[2];
int v[5];
int *n = v;
n   == &v[0];     *n     == v[0];  // *n = 0 等價於 v[0] = 0
n+1 == &v[1];     *(n+1) == v[1];  // *(n+1) = 0 等價於 v[1] = 0
n+2 == &v[2];     *(n+2) == v[2];  // *(n+2) = 0 等價於 v[2] = 0

Leave a Comment

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