![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iY2EjZ1EjMllDZ1MTM3UDZiRzN1AjM3YWMzQWMhJmZk9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
指針與數組是C語言中很重要的兩個概念,它們之間有着密切的關系,利用這種關系,可以增強處理數組的靈活性,加快運作速度,本文着重讨論指針與數組之間的聯系及在程式設計中的應用。
1.指針與數組的關系
當一個指針變量被初始化成數組名時,就說該指針變量指向了數組。如:
char str[20], *ptr;
ptr=str;
ptr被置為數組str的第一個元素的位址,因為數組名就是該數組的首位址,也是數組第一個元素的位址。此時可以認為指針ptr就是數組str(反之不成立),這樣原來對數組的處理都可以用指針來實作。如對數組元素的通路,既可以用下标變量通路,也可以用指針通路。
2.指向數組元素的指針
若有如下定義:
int a[10], *pa;
pa=a;
則p=&a[0]是将數組第1個元素的位址賦給了指針變量p。
實際上,C語言中數組名就是數組的首位址,是以第一個元素的位址可以用兩種方法獲得:p=&a[0]或p=a。
這兩種方法在形式上相像,其差別在于:pa是指針變量,a是數組名。值得注意的是:pa是一個可以變化的指針變量,而a是一個常數。因為數組一經被說明,數組的位址也就是固定的,是以a是不能變化的,不允許使用a++、++a或語句a+=10,而pa++、++pa、pa+=10則是正确的。由此可見,此時指針與數組融為一體。
3.指針與一維數組
了解指針與一維數組的關系,首先要了解在編譯系統中,一維數組的存儲組織形式和對數組元素的通路方法。
一維數組是一個線形表,它被存放在一片連續的記憶體單元中。C語言對數組的通路是通過數組名(數組的起始位址)加上相對于起始位址的相對量(由下标變量給出),得到要通路的數組元素的單元位址,然後再對計算出的單元位址的内容進行通路。通常把資料類型所占單元的位元組個數稱為擴大因子。
實際上編譯系統将數組元素的形式a[i]轉換成*(a+i),然後才進行運算。對于一般數組元素的形式:<數組名>[<下标表達式>],編譯程式将其轉換成:*(<數組名>+<下标表達式>),其中下标表達式為:下标表達式*擴大因子。整個式子計算結果是一個記憶體位址,最後的結果為:*<位址>=<位址所對應單元的位址的内容>。由此可見,C語言對數組的處理,實際上是轉換成指針位址的運算。
數組與指針暗中結合在一起。是以,任何能由下标完成的操作,都可以用指針來實作,一個不帶下标的數組名就是一個指向該數組的指針。
4.指針與多元數組
用指針變量可以指向一維數組,也可以指向多元數組。但在概念上和使用上,多元數組的指針比一維數組的指針要複雜一些。
例如,在一個三維數組中,引用元素c[i][j][k]的位址計算最終将換成:*(*(*(c+i)+j)+k)。了解了多元數組的存儲形式和通路多元數組元素的内部轉換公式後,再看當一個指針變量指向多元數組及其元素的情況。
1 指向數組元素的指針變量
若有如下說明:
int a[3][4];
int *p;
p=a;
p是指向整型變量的指針;p=a使p指向整型二維數組a的首位址。
*(*(p+1)+2)表示取a[1][2]的内容;*p表示取a[0][1]的内容,因為p是指向整型變量的指針;p++表示p的内容加1,即p中存放的位址增加一個整型量的位元組數2,進而使p指向下一個整型量a[0][1]。
2 指向由j個整數組成的一維數組的指針變量
當指針變量p不是指向整型變量,而是指向一個包含j個元素的一維數組。如果p=a[0],則p++不是指向a[0][1],而是指向a[1]。這時p的增值以一維數組的長度為機關。
5.指針與字元數組
C語言中許多字元串操作都是由指向字元數組的指針及指針的運算來實作的。因為對于字元串來說,一般都是嚴格的順序存取方式,使用指針可以打破這種存取方式,更為靈活地處理字元串。
另外由于字元串以′\0′作為結束符,而′\0′的ASCII碼是0,它正好是C語言的邏輯假值,是以可以直接用它作為判斷字元串結束的條件,而不需要用字元串的長度來判斷。C語言中類似的字元串處理函數都是用指針來完成,使程式運作速度更快、效率更高,而且更易于了解。
◆◆
評論讀取中....
請登入後再發表評論!
◆◆
修改失敗,請稍後嘗試