山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省
數組元素的指針
一個變量有地址,一個數組包含若干元素,每個數組元素都在內存中占用存儲單元,它們都有相應的地址。指針變量既然可以指向變量,當然也可以指向數組元素(把某一元素的地址放到一個指針變量中)。所謂數組元素的指針就是數組元素的地址。可以用一個指針變量指向一個數組元素。
例如:
int a [ 10 ] = ( 1,3,5,7,9,11,13,15,17,19 );
int * p ;
p = & a [ 0 ];
以上是使指針變量p指向a數組的第0號元素。
引用數組元素可以用下標法(如a [ 3 ]),也可以用指針法,即通過指向數組元素的指針找到所需的元素。使用指針法能使目標程序質量高(占內存少,運行速度快)。
C語言中,數組名(不包括形參數組名)代表數組中首元素(即序號為0的元素)的地址。因此,下面兩個語句等價:
p=&a[0];
p=a;
注意:程序中的數組名不代表整個數組,只代表數組首元素的地址。上述“p?= a;"的作用是“把a數組的首元素的地址賦給指針變量p”,而不是“把數組a各元素的值賦給p”
在定義指針變量時可以對它初始化,如:
int p &a [ 0 ];
它等效于下面兩行:
int *p;
p=&a[0];
當然定義時也可以寫成
int * p = a ;
它的作用是將a數組首元素(即a [ 0 ])的地址賦給指針變量p(而不是賦值給*p)。
在引用數組元素時指針的運算
在引用數組元素時常常會遇到指針的算術運算。有人會提出問題:對數值型數據進行算術運算(加、減、乘、除等)的目的和含義是清楚的,而在什么情況下需要用到對指針型數據的算術運算呢?其含義是什么?
前已反復說明指針就是地址。對地址進行賦值運算是沒有問題的,但是對地址進行算術運算是什么意思呢?顯然對地址進行乘和除的運算是沒有意義的,實際上也無此必要。那么,能否進行加和減的運算?答案是:在一定條件下允許對指針進行加和減的運算。
那么,在什么情況下需要而且可以對指針進行加和減的運算呢?回答是:當指針指向數組元素的時候。譬如,指針變量p指向數組元素a [ 0 ],我們希望用p +1表示指向下一個元素a1。如果能實現這樣的運算,就會對引用數組元素提供很大的方便。
在指針已指向一個數組元素時,可以對指針進行以下運算:
加一個整數(用+或+ =),如p +1;
減一個整數(用-或- =),如p -1;
自加運算,如p++,++p;
自減運算,如p--,--p。
兩個指針相減,如pl -p2(只有pl和p2都指向同一數組中的元素時才有意義)。
分別說明如下:
( 1 )如果指針變量p已指向數組中的一個元素,則p +1指向同一數組中的下一個元素,p-1指向同一數組中的上一個元素。注意:執行p +1時并不是將p的值(地址)簡單地加1,而是加上一個數組元素所占用的字節數。例如,數組元素是float型,每個元素占4個字節,則p +1意味著使p的值(是地址)加4個字節,以使它指向下一元素。
p +1所代表的地址實際上是p +1×d,d是一個數組元素所占的字節數(在Visual C++中,對int型,d = 4,對float和long型,d = 4;對char型,d = 1 )。若p的值是2000,則p +1的值不是2001,而是2004。
系統怎么知道要把這個1轉換為4,然后與p的值相加呢?不要忘記,在定義指針變量時必須要指定基類型,如:
float * p;
現在p指向float型的數組元素,在執行++p時,系統會根據p的基類型為float型而將其值加4,這樣,p就指向float型數組的下一個元素。如果p原來指向a [ 0 ],執行++p后p的值改變了,在p的原值基礎上加d,這樣p就指向數組的下一個元素a [ 1 ]。
( 2 )如果p的初值為& a [ 0 ],則p + i和a + i就是數組元素a數組a [i]的地址,或者說,它們指向a數組序號為i的元素,這里需要注意的是a代表數組首元素的地址,a +1也是地址,它的計算方法同p +1,即它的實際地址為a +1×d。
( 3 ) * ( p + i )或* ( a + i )是p + i或a + i所指向的數組元素,即a [ i ]。例如,* ( p + 5 )或* ( a + 5 )就是a[?5 ],即:*(p+5),*(a+5)和a[5]三者等價。實際上,在編譯時,對數組元素a[i]就是按* ( a + i )處理的,即按數組首元素的地址加上相對位移量得到要找的元素的地址,然后找出該單元中的內容。若數組a的首元素的地址為1000,設數組為float型,則a [ 3 ]的地址是這樣計算的:1000 + 3×4 = 1012,然后從1012地址所指向的float型單元取出元素的值,即a [ 3 ]的值。
說明:[ ]實際上是變址運算符,即將a [ i ]按a + i計算地址,然后找出此地址單元中的值。
( 4 )如果指針變量pl和p2都指向同一數組中的元素,如執行p2 -p1,結果是p2 - p1的值(兩個地址之差)除以數組元素的長度。假設,p2指向實型數組元素a [ 5 ],p2的值為2020;pl指向a [ 3 ],其值為2012,則p2 - pl的結果是( 2020-2012 )/ 4 = 2。這個結果是有意義的,表示p2所指的元素與pl所指的元素之間差2個元素。這樣,人們就不需要具體地知道pl和p2的值,然后去計算它們的相對位置,而是直接用p2 - p1就可知道它們所指元素的相對距離。
注意:兩個地址不能相加,如pl + p2是無實際意義的。