山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省
引用一個數組元素,可以用下面兩種方法:
( 1 )下標法,如a[i]形式;
( 2 )指針法,如* ( a + i )或* ( p + i )。其中a是數組名,p是指向數組元素的指針變量,其初值p = a。
例題:
有一個整型數組a,有10個元素,要求輸出數組中的全部元素。
解題思路:
引用數組中各元素的值有3種方法:
編寫程序:
( 1 )下標法
?運行結果:
?( 2 )通過數組名計算數組元素地址,找出元素的值;
運行結果:?
與上面程序相同
程序分析:
( a + i )是a數組中序號為i的元素的地址,* ( a + i )是該元素的值。用& a[i]表示a[i]元素的地址,也可以改用( a + i )表示,即:
scanf (“% d”,a + i );
( 3 )用指針變量指向數組元素。
運行結果:
與(1)相同。
程序分析:
先使指針變量p指向a數組的首元素(序號為0的元素,即a [ 0)接著在輸出* p,* p就是p當前指向的元素(即a [ 0 ])的值。然后執行p + +,使p指向下一個元素a [ 1 ],再輸出* p,此時* p是a [ 1 ]的值,依此類推,直到p = a + 10,此時停止執行循環體。
第111,112可以改為
for ( p = a;p < a + 10 );p++ )
? scanf("%d",p);
用指針變量表示當前元素的地址。
3種方法的比較:
第(1 )和第(2 )種方法執行效率是相同的。C編譯系統是將a [ i ]轉換為*?( a + i )處理的,即先計算元素地址。因此用第(1 )和第(2 )種方法找數組元素費時較多。
第(3 )種方法比第(1 )、第(2)種方法快,用指針變量直接指向元素,不必每次都重新計算地址,像p ++這樣的自加操作是比較快的。這種有規律地改變地址值( p++ )能大大提高執行效率。
用下標法比較直觀,能直接知道是第幾個元素。例如,a [ 5 ]是數組中序號為5的元素(注意序號從0算起)。用地址法或指針變量的方法不直觀,難以很快地判斷出當前處理的是哪一個元素。要仔細分析指針變量p的當前指向,才能判斷當前輸出的是第幾個元素。有經驗的專業人員往往喜歡用第(3 )種形式,用p + +進行控制,程序簡潔、高效。第(1 )種形式,直觀、不易出錯。
注意:在使用指針變量指向數組元素時,有以下幾個問題要注意:
( 1 )可以通過改變指針變量的值指向不同的元素。例如,上述第(3 )種方法是用指針變量p來指向元素,用p + +使p的值不斷改變從而指向不同的元素。如果不用p變化的方法而用數組名a變化的方法(例如,用a ++)行不行呢?是不行的。因為數組名a代表數組首元素的地址,它是一個指針型常量,它的值在程序運行期間是固定不變的。既然a是常量,所以a + +是無法實現的。
( 2 )要注意指針變量的當前值。
?