轉(zhuǎn) 指針與數(shù)組

指針與數(shù)組是C語言中很重要的兩個概念,它們之間有著密切的關(guān)系,利用這種關(guān)系,可以增強(qiáng)處理數(shù)組的靈活性,加快運(yùn)行速度,本文著重討論指針與數(shù)組之間的聯(lián)系及在編程中的應(yīng)用。
  1.指針與數(shù)組的關(guān)系
  當(dāng)一個指針變量被初始化成數(shù)組名時,就說該指針變量指向了數(shù)組。如:
  char str[20], *ptr;
  ptr=str;
  ptr被置為數(shù)組str的第一個元素的地址,因為數(shù)組名就是該數(shù)組的首地址,也是數(shù)組第一個元素的地址。此時可以認(rèn)為指針ptr就是數(shù)組str(反之不成立),這樣原來對數(shù)組的處理都可以用指針來實現(xiàn)。如對數(shù)組元素的訪問,既可以用下標(biāo)變量訪問,也可以用指針訪問。
  2.指向數(shù)組元素的指針
  若有如下定義:
  int a[10], *pa;
  pa=a;
  則p=&a[0]是將數(shù)組第1個元素的地址賦給了指針變量p。
  實際上,C語言中數(shù)組名就是數(shù)組的首地址,所以第一個元素的地址可以用兩種方法獲得:p=&a[0]或p=a。
  這兩種方法在形式上相像,其區(qū)別在于:pa是指針變量,a是數(shù)組名。值得注意的是:pa是一個可以變化的指針變量,而a是一個常數(shù)。因為數(shù)組一經(jīng)被說明,數(shù)組的地址也就是固定的,因此a是不能變化的,不允許使用a++、++a或語句a+=10,而pa++、++pa、pa+=10則是正確的。由此可見,此時指針與數(shù)組融為一體。
  3.指針與一維數(shù)組
  理解指針與一維數(shù)組的關(guān)系,首先要了解在編譯系統(tǒng)中,一維數(shù)組的存儲組織形式和對數(shù)組元素的訪問方法。
  一維數(shù)組是一個線形表,它被存放在一片連續(xù)的內(nèi)存單元中。C語言對數(shù)組的訪問是通過數(shù)組名(數(shù)組的起始地址)加上相對于起始地址的相對量(由下標(biāo)變量給出),得到要訪問的數(shù)組元素的單元地址,然后再對計算出的單元地址的內(nèi)容進(jìn)行訪問。通常把數(shù)據(jù)類型所占單元的字節(jié)個數(shù)稱為擴(kuò)大因子。
  實際上編譯系統(tǒng)將數(shù)組元素的形式a[i]轉(zhuǎn)換成*(a+i),然后才進(jìn)行運(yùn)算。對于一般數(shù)組元素的形式:<數(shù)組名>[<下標(biāo)表達(dá)式>],編譯程序?qū)⑵滢D(zhuǎn)換成:*(<數(shù)組名>+<下標(biāo)表達(dá)式>),其中下標(biāo)表達(dá)式為:下標(biāo)表達(dá)式*擴(kuò)大因子。整個式子計算結(jié)果是一個內(nèi)存地址,最后的結(jié)果為:*<地址>=<地址所對應(yīng)單元的地址的內(nèi)容>。由此可見,C語言對數(shù)組的處理,實際上是轉(zhuǎn)換成指針地址的運(yùn)算。
  數(shù)組與指針暗中結(jié)合在一起。因此,任何能由下標(biāo)完成的操作,都可以用指針來實現(xiàn),一個不帶下標(biāo)的數(shù)組名就是一個指向該數(shù)組的指針。
  4.指針與多維數(shù)組
  用指針變量可以指向一維數(shù)組,也可以指向多維數(shù)組。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。
  例如,在一個三維數(shù)組中,引用元素c[i][j][k]的地址計算最終將換成:*(*(*(c+i)+j)+k)。了解了多維數(shù)組的存儲形式和訪問多維數(shù)組元素的內(nèi)部轉(zhuǎn)換公式后,再看當(dāng)一個指針變量指向多維數(shù)組及其元素的情況。
  1 指向數(shù)組元素的指針變量
  若有如下說明:
  int a[3][4];
  int *p;
  p=a;
  p是指向整型變量的指針;p=a使p指向整型二維數(shù)組a的首地址。
 ?。?*(p+1)+2)表示取a[1][2]的內(nèi)容;*p表示取a[0][1]的內(nèi)容,因為p是指向整型變量的指針;p++表示p的內(nèi)容加1,即p中存放的地址增加一個整型量的字節(jié)數(shù)2,從而使p指向下一個整型量a[0][1]。
  2 指向由j個整數(shù)組成的一維數(shù)組的指針變量
  當(dāng)指針變量p不是指向整型變量,而是指向一個包含j個元素的一維數(shù)組。如果p=a[0],則p++不是指向a[0][1],而是指向a[1]。這時p的增值以一維數(shù)組的長度為單位。
  5.指針與字符數(shù)組
  C語言中許多字符串操作都是由指向字符數(shù)組的指針及指針的運(yùn)算來實現(xiàn)的。因為對于字符串來說,一般都是嚴(yán)格的順序存取方式,使用指針可以打破這種存取方式,更為靈活地處理字符串。
  另外由于字符串以′\0′作為結(jié)束符,而′\0′的ASCII碼是0,它正好是C語言的邏輯假值,所以可以直接用它作為判斷字符串結(jié)束的條件,而不需要用字符串的長度來判斷。C語言中類似的字符串處理函數(shù)都是用指針來完成,使程序運(yùn)行速度更快、效率更高,而且更易于理解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,614評論 3 44
  • 前言:復(fù)雜類型說明 要了解指針,多多少少會出現(xiàn)一些比較復(fù)雜的類型,所以我先介紹一下如何完全理解一個復(fù)雜類型,要理解...
    有理想有暴富的小青年閱讀 635評論 0 4
  • 一直打野,然后出山?那是順風(fēng)局,低端局! 高端局的套路是,打野,抓住機(jī)會配合隊友殺人!打野殺人,打野殺人! 優(yōu)先出...
    烏龜?shù)穆?/span>閱讀 252評論 0 0
  • 她漫步走在小路上,右鞋底踢著石子,做鞋底抹煞地板。這些年來,要想的事情太多了,難得時間靜一靜。 她翻開一本...
    海小姚閱讀 174評論 1 1
  • 阿克蘇頂管 阿克蘇地區(qū)頂管施工要在減少交通干擾、保證工程質(zhì)量、確保人員安全的情況下施工。 具體要求如下:阿克蘇頂管...
    業(yè)余老王閱讀 3,289評論 0 0

友情鏈接更多精彩內(nèi)容