這篇文章我們來一起討論一下指標與陣列。指標與陣列密不可分,但是絕不能將二者混為一談。
我們可以用陣列的名字作為指向陣列第乙個元素的指標。因此通常情況下,a+i
等同於&a[i]
,*(a+i)
等同於a[i]
,其中a是陣列名。於是我們可以這樣操作:
int a[100];
*a = 7; // 陣列第乙個元素賦值7
*(a+2) = 4; // 陣列第2個元素賦值4
既然我們可以用陣列名作為指標,那麼反過來也是可以的。
int a[9], *p = a;
p[3] = 5; // 陣列a的第三個元素賦值5
通常情況下,p[i]
可以看作*(p+i)
。
了解了上面的用法後,我們可以很輕鬆地用指標來處理陣列。下面我們來吃幾個栗子。
#define n 10
...int a[n], sum, *p;
...sum = 0;
for (p = &a[0]; p < &a[n]; p++)
sum += *p;
上面的例子中,我們將p指向陣列a的第乙個元素,然後依次對指標p自增從而遍歷整個陣列。你可能會懷疑p < &a[n]
的用法,其實這樣做是完全正確的。即使元素a[n]
不存在,但是對它使用取位址運算子也是合法的。
#define r 9
#define c 8
int a[r][c];
int *p, sum = 0;
...for (p = &a[0][0]; p <= &a[r-1][c-1]; p++)
sum += *p;
如果我們要對乙個二維陣列進行求和,通常我們會用兩個巢狀的for
迴圈,但是如果我們有了指標的話,我們只用乙個迴圈就可以搞定,只不過可讀性變差了。
...
int a[r][c], *p, i;
...for (p = &a[i][0]; p < &a[i][c]; p++)
sum += *p;
上面的**很容易理解,但是我們可以進一步簡化。&a[i][0]
指向第i行的第乙個元素,而對於二維陣列,a[i]
即為指向第i行的第乙個元素的指標,因此我們完全可以用a[i]
代替&a[i][0]
,同理可以用a[i]+c
代替&a[i][c]
。
int a[r][c], *p, i;
...for (p = a[i]; p < a[i] + c; p++)
sum += *p;
同樣,第二個栗子的**也可以簡化成這樣:
...
int a[r][c];
int *p, sum = 0;
...for (p = a[0]; p < a[r]; p++)
sum += *p;
因為a[0]指向陣列第i行的第乙個元素,同樣也是陣列的第乙個元素。
int a[r][c], (*p)[c], i, sum = 0;
...for (p = &a[0]; p < &a[r]; p++)
sum += (*p)[i];
上面的**有些晦澀。在宣告中,我們把p
指向長度為c
的整型陣列的指標,在(*p)[c]
中,*p
是需要使用括號的;如果沒有括號,編譯器將認為p
是指標陣列,而不是指向陣列的指標。表示式p++
把p
移動到下一行的開始位置。在表示式(*p)[i]
中*p
表示a
的一整行,因此(*p)[i]
選中了該行第i列的那個元素。如果你還是不懂的話,你可以聯想一下一維陣列的宣告方法int a[c]
,再看看這裡p
的宣告(*p)[c]
,是不是可以對應上呢?(*p)
可以對應陣列a的名字a
,而p
對應&a
。(*p)[i]
中的括號是必要的,因為編譯器會將*p[i]
解釋為*(p[i])
。
其實,上面的**還可以進一步簡化:
int a[r][c], (*p)[c], i, sum = 0;
...for (p = a; p < a+r; p++)
sum += (*p)[i];
理解上面這個**,必須首先要理解a
(記住此時陣列為二維陣列)的含義。a不是指向a[0][0]
的指標,而是指向a[0]
的指標。因此&a[0]
就可以簡化為a
。
c語言程式設計現代方法, k.n.king, 人民郵電出版社
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
C語言基礎四 指標
指標表示乙個位址,什麼型別的指標就應該指向什麼型別的記憶體空間,例如int 型別的指標就應該指向乙個int型別的空間。int a 7 int p null 指標的定義 p a 指標的繫結 p 5 指標的解引用對於同型別指標p1,p2,一般有這幾種運算 p1 3,p1 3,p2 p1 int a 5 ...
C語言基礎(四)指標 陣列
2016.7.25 任何型別的一維 二維 三維指標占用空間大小相同4個位元組 32位作業系統 8個位元組 64位 指標與陣列 陣列 表示一段連續的記憶體空間,用來儲存多個相同型別的值。1.陣列名的值是陣列首元素的位址 即陣列名是指向陣列首元素的指標 int array 5 printf array ...
C 基礎 四 指標的理解
指標的用途通過指標可以訪問記憶體 記錄位址編號 includeusing namespace std int main 指標占用的記憶體空間注意各種型別的指標占用位元組是固定的 在32位作業系統 4個位元組 在64位作業系統 8個位元組 cout sizeof int sizeof int endl...