乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CSDN技術(shù)中心 第五章 指向數(shù)組的指針

       蔡蔡 2005-09-19

      第五章 指向數(shù)組的指針

      講到第五章了,數(shù)組兩個字還離不開我們的左右,數(shù)組的內(nèi)容也真多,另一方面也因為數(shù)組與指針的關(guān)系的確非常密切。

              通常,對于int a[8][9]這個二維數(shù)組,我們可以這樣定義一個指向它的指針:

      int (*p)[9];

      這個聲明的形式跟人們所熟悉的int *p的形式大相庭徑,初學(xué)者通常會感到迷惑,不理解的地方大致有四個:

      1。為什么會以這種形式聲明?

      2。(*p)應(yīng)該如何理解?

      3。為什么必須把第二維顯式地聲明?

      4。為什么忽略第一維?

      下面我們就一起逐個討論這四個問題:

      1。這種形式是C標(biāo)準(zhǔn)的聲明語法規(guī)定的,由于本章不是對標(biāo)準(zhǔn)的解釋,只是對標(biāo)準(zhǔn)的應(yīng)用,因此筆者盡量以簡潔的方式解釋這個聲明,詳細的討論將在第七章進行。C標(biāo)準(zhǔn)的聲明包含了兩部分:

      聲明:

      聲明說明符  初始化聲明符表opt      (opt的意思是可選)

      在聲明說明符里面有一項類型說明符,int就是這種類型說明符。而初始化聲明符表里面的其中一種形式,就是:

      直接聲明符 [常量表達式opt]

      (*p)[9]就是這種直接聲明符加[]的形式。

      2。p左邊的*在這里不是取值運算符,而是一個聲明符,它指出p是一個指針。而()括號是不能去掉的,如果去掉了,由于[]運算符優(yōu)先級比*高,p就會先跟[]結(jié)合,這樣p就變成了一個指針數(shù)組,而不是指向數(shù)組的指針。

      題外話:

      *p還有一種用法,就是當(dāng)*是取值運算符的時候,*p是一個左值,表示一個變量,為什么*p是一個變量呢?也許有人會說,因為int i, *p=&i嘛,其實這是結(jié)果不是原因。嚴(yán)格來說,i只是一個變量名,不是變量,在編譯器的符號表里面,變量名是一個符號地址,它所代表的地址值是它指向的那段內(nèi)存單元的地址,真正叫變量的是那段內(nèi)存單元,懂匯編的朋友能很容易地區(qū)分出來,在匯編里面,可以這樣定義一個變量名:

      VARW  DW  10,20

      VARW就是一個變量名,它在匯編里面是一個地址,代表了10所在的內(nèi)存單元這個變量。由于p被初始化為&i,*p指向i所代表的那段內(nèi)存單元,因此說*p是一個變量。把i稱為變量是一種習(xí)慣上的統(tǒng)稱。

      3。定義一個指針的時候,首先必須定出指針的類型,由于這是一個指向數(shù)組的指針,如果數(shù)組的元素的類型定下來了,那么這個指針的類型也就定下來了。前面說過,C語言的多維數(shù)組實質(zhì)上是數(shù)組的嵌套,那么所指向數(shù)組的元素必定具有數(shù)組類型,也就是說,這個數(shù)組的元素是一個具有6個int元素的數(shù)組,因此,p定義的時候,必須指定第二維的上界,這樣才能把p的類型定下來。

      4。有這種疑問的人已經(jīng)犯了一個錯誤,沒有分清楚什么是指針,什么是數(shù)組,以數(shù)組的思維模式來看待這個指針p。定義一個數(shù)組(非static)的時候,需要在棧中靜態(tài)分配一塊內(nèi)存,那么就需要知道這塊內(nèi)存的大小,因此定義數(shù)組時需要確定各維的上界。而這里只是定義一個指針而已,對于一個指針的定義,需要知道的是它所指向?qū)ο蟮念愋?,并不需要知道對象的大小,這是多余的。因此,所有指向數(shù)組的指針的第一維被忽略。

              以上介紹了如何聲明一個指向二維數(shù)組的指針,類似地,對一個指向n維數(shù)組的指針也可以用同樣的方法來聲明,如下:

      int (*p)[x2][x3]......[xn];

      同樣可以忽略第一維,而其它維必須指定上界。

              最后再討論一種很常見的對多維數(shù)組的錯誤理解,有些人常常會以為,二維數(shù)組就是二級指針,這種錯誤的根源,來自于可以把一個二級指針int **p以p[i][j]這種形式使用。首先把數(shù)組稱為指針就是錯誤的,第一章筆者已經(jīng)說明了數(shù)組名是地址,不能理解為指針。第二,并非能以p[i][j]這種形式使用,那么p就是一個二維數(shù)組了,C標(biāo)準(zhǔn)對數(shù)組引用的規(guī)定,并沒有指定數(shù)組引用時[]運算符的左邊必須是數(shù)組名,而可以是一個表達式。第三,這是一種“巧合”,歸根到底是由于C語言的數(shù)組實現(xiàn)是數(shù)組的嵌套同時C標(biāo)準(zhǔn)把[]運算符轉(zhuǎn)換為類似*(*(a+i)+j)這樣的等價表達式造成的,那兩個取值運算符“恰好”可以用于一個二級指針。第四,p與p[i]并不具有數(shù)組類型,sizeof(p)和sizeof(p[i])的結(jié)果只是一個指針的大小4字節(jié)。而對于一個真正的數(shù)組,p與p[i]都是具有數(shù)組類型的地址。

              實際上,int **p只是一個指向一維指針數(shù)組的指針,而不是指向二維數(shù)組的指針。同樣地,對于n級指針,都可以看作一個指向一維指針數(shù)組的指針,這個指針數(shù)組的元素都是n-1級指針。


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多