天天看點

32 通過指針引用數組

32 通過指針引用數組

01 數組元素的指針

指針變量既可以指向變量,也可以指向數組元素。所謂數組元素的指針就是數組元素的位址。

引用數組元素可以用下标法,也可以用指針法,即通過指向數組元素的指針找到所需的元素。

使用指針法能使目标程式品質高(占記憶體少,運作速度快)。

在C語言中,數組名(不包括形參數組名,形參數組并不占據實際的記憶體單元)代表數組中首元素的位址。

02 在引用數組元素時指針的運算

在一定條件下允許對指針進行加和減的運算。

當指針指向數組元素時,譬如,指針變量p指向數組元素a[0],我們希望用p+1表示指向下一個元素a[1]。

在指針指向數組元素時,可以對指針進行以下運算:

(1)加一個整數,如p+1。

(2)減一個整數,如p-1。

(3)自加運算,如p++,++p。

(4)自減運算,如p--,--p。

(5)兩個指針相減,如p1-p2(隻有p1和p2都指向同一數組中的元素時才有意義)。

在 C 語言中,指針變量加 1 表示跳過該指針變量對應的基類型所占位元組數大小的空間。指向數組元素的指針,其基類型為數組元素類型,指針加 1 表示跳過一個數組元素空間,指向下一個數組元素。

例如:

int *p,a[10];p=a;
//相當于 p=&a[0];      

說明:數組名 a 相當于數組首元素 a[0] 的位址,即 a 等價于 &a[0]。

上述語句定義了整型指針變量 p 和整型數組 a,并使 p 初始指向數組首元素 a[0]。

03 通過指針引用數組元素

當指針變量和數組元素建立聯系後,可通過以下方式通路數組元素。

1. 間接通路:*(數組名+i); 的形式。其中,i 為整數,其範圍為:0<i<N,N 為數組大小。數組名 a 為首元素的位址,是位址常量,a+i 表示跳過 i 個資料元素的存儲空間,即(a+i)表示 a[i] 元素的位址,進而 *(a+i) 表示 a[i]。

如果指針變量 p 被初始化為 a 之後,不再改變,那麼也可以使用 *(p + i) 的形式通路 a[i],不過這樣就失去了使用指針變量通路數組元素的意義。

2.間接通路:*(指針變量);的形式。當執行語句 p=a; 後,可以通過改變 p 自身的值(可通過自增、自減運算),進而使得 p 中儲存不同的數組元素的位址,進而通過 *p 通路該數組中不同的元素。這是使用指針通路數組元素較常用的形式。例如,如下代碼通過使用指針變量的移動來周遊輸出數組中的每個元素。

for (p=a;p<a+N;p++)
//用p的移動範圍控制循環次數printf ("%d\t",*p);      

确定 p 指針移動的起止位址,即循環控制表達式的确定是使用指針通路數組元素的關鍵。

p 初始指向 a[0],即 p=&a[0]; 或 p=a;。

p 終止指向 a[N-1],即 p=&a[N-l]; 或 p=a+N-1;。

故可得 p 的移動範圍為:p>=a && p<=a+N-1;,而 p<=a+N-1 通常寫成 p<a+N;,由此可得循環條件為:for (p=a;p<a+N;p++)。

04 用數組名作函數參數

C語言調用函數時虛實結合的方法都是采用“值傳遞”方式,當用變量名作為函數參數時傳遞的是變量的值,當用數組名作為函數參數時。

由于數組名代表的是數組元素位址,是以傳遞的值是位址,是以要去形參為指針變量。

實參數組名代表一個固定的位址,或者說是指針變量,但形參數組名并不是一個固定的位址,而是按指針變量處理。

05 通過指針引用多元數組