C指標基礎(四)

2021-07-28 13:23:16 字數 2793 閱讀 7585

這篇文章我們來一起討論一下指標與陣列。指標與陣列密不可分,但是絕不能將二者混為一談。

我們可以用陣列的名字作為指向陣列第乙個元素的指標。因此通常情況下,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...