|
┃ ╂──→ ┃ 'a' ┃ ┗━━━┛ ┗━━━┛ p2 j ┏━━━┓ ┏━━━┓ ┃ ╂──→ ┃ 'a' ┃ ┗━━━┛ ┗━━━┛ 圖4. *p2=*p1時的情形 通過指針訪問它所指向的一個變量是以間接訪問的形式進行的, 所以比直接訪問一個變量要費時間, 而且不直觀, 因為通過指 針要訪問哪一個變量, 取決于指針的值(即指向), 例如"*p2=*p1;"實際上就是"j=i;", 前者不僅速度慢而且目的不明。但由于指針 是變量, 我們可以通過改變它們的指向, 以間接訪問不同的變量, 這給程序員帶來靈活性, 也使程序代碼編寫得更為簡潔和有效。 指針變量可出現(xiàn)在表達式中, 設 int x, y *px=&x; 指針變量px指向整數(shù)x, 則*px可出現(xiàn)在x能出現(xiàn)的任何地方。例如: y=*px+5; /*表示把x的內(nèi)容加5并賦給y*/ y=++*px; /*px的內(nèi)容加上1之后賦給y [++*px相當于++(px)]*/ y=*px++; /*相當于y=*px; px++*/
1.2. 地址運算 指針允許的運算方式有: (1). 指針在一定條件下, 可進行比較, 這里所說的一定條件, 是指兩個指針指向同一個對象才有意義, 例如兩個指針變量p, q指向同一數(shù)組, 則<, >, >=, <=, ==等關(guān)系運算符都能正常進行。若p==q為真, 則表示p, q指向數(shù)組的同一元素; 若p < q為真, 則表示p所指向的數(shù)組元素在q所指向的數(shù)組元素之前(對于指向數(shù)組元素的指針在下面將作詳細討論)。 (2). 指針和整數(shù)可進行加、減運算。設p是指向某一數(shù)組元素的指針,開始時指向數(shù)組的第0號元素, 設n為一整數(shù), 則
p+n
就表示指向數(shù)組的第n號元素(下標為n的元素)。 不論指針變量指向何種數(shù)據(jù)類型, 指針和整數(shù)進行加、減運算時, 編譯程序總根據(jù)所指對象的數(shù)據(jù)長度對n放大, 在一般微機 上, char放大因子為1, int、short放大因子為2, long和float放大因子為4, double放大因子為8。 對于下面講述到的結(jié)構(gòu)或聯(lián) 合, 也仍然遵守這一原則。 (3). 兩個指針變量在一定條件下, 可進行減法運算。設p, q指向同一數(shù)組, 則p-q的絕對值表示p 所指對象與q所指對象之間 的元素個數(shù)。 其相減的結(jié)果遵守對象類型的字節(jié)長度進行縮小的規(guī)則。
2. 指針和數(shù)組 指針和數(shù)組有著密切的關(guān)系, 任何能由數(shù)組下標完成的操作也都可用指針來實現(xiàn), 但程序中使用指針可使代碼更緊湊、更靈活。
2.1. 指向數(shù)組元素的指針 我們定義一個整型數(shù)組和一個指向整型的指針變量: int a[10], *p; 和前面介紹過的方法相同, 可以使整型指針p指向數(shù)組中任何一個元素, 假定給出賦值運算:
p=&a[0];
此時, p指向數(shù)組中的第0號元素, 即a[0], 指針變量p中包含了數(shù)組元素a[0] 的地址, 由于數(shù)組元素在內(nèi)存中是連續(xù)存放的, 因 此, 我們就可以通過指針變量p及其有關(guān)運算間接訪問數(shù)組中的任何一個元素。 Turbo C中, 數(shù)組名是數(shù)組的第0號元素的地址, 因此下面兩個語句是等價的 p=&a[0]; p=a; 根據(jù)地址運算規(guī)則, a+1為a[1]的地址, a+i就為a[i]的地址。 下面我們用指針給出數(shù)組元素的地址和內(nèi)容的幾種表示形式。 (1). p+i和a+i均表示a[i]的地址, 或者講, 它們均指向數(shù)組第i號元素, 即指向a[i]。 (2). *(p+i)和*(a+i)都表示p+i和a+i所指對象的內(nèi)容, 即為a[i]。 (3). 指向數(shù)組元素的指針, 也可以表示成數(shù)組的形式, 也就是說, 它允許指針變量帶下標, 如p[i]與*(p+i)等價。
|