版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、超強(qiáng)的指針學(xué)習(xí)筆記C語言所有復(fù)雜的指針聲明,都是由各種聲明嵌套構(gòu)成的。如何解讀復(fù)雜指針聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實并不是C標(biāo)準(zhǔn)里面的內(nèi)容,它是從C標(biāo)準(zhǔn)的聲明規(guī)定中歸納出來的方法。C標(biāo)準(zhǔn)的聲明規(guī)則,是用來解決如何創(chuàng)建聲明的,而右左法則是用來解決如何辯識一個聲明的,兩者可以說是相反的。右左法則的英文原文是這樣說的:Therightleftrule:Startreadingthedeclarationfromt
2、heinnermostparenthesesgorightthengoleft.Whenyouencounterparenthesesthedirectionshouldbereversed.Onceeverythingintheparentheseshasbeenparsedjumpoutofit.Continuetillthewholedeclarationhasbeenparsed.這段英文的翻譯如下:右左法則:首先從最里面的圓括
3、號看起,然后往右看,再往左看。每當(dāng)遇到圓括號時,就應(yīng)該掉轉(zhuǎn)閱讀方向。一旦解析完圓括號里面所有的東西,就跳出圓括號。重復(fù)這個過程直到整個聲明解析完畢。筆者要對這個法則進(jìn)行一個小小的修正,應(yīng)該是從未定義的標(biāo)識符開始閱讀,而不是從括號讀起,之所以是未定義的標(biāo)識符,是因為一個聲明里面可能有多個標(biāo)識符,但未定義的標(biāo)識符只會有一個?,F(xiàn)在通過一些例子來討論右左法則的應(yīng)用,先從最簡單的開始,逐步加深:int(func)(intp)首先找到那個未定義的標(biāo)
4、識符,就是func,它的外面有一對圓括號,而且左邊是一個號,這說明func是一個指針,然后跳出這個圓括號,先看右邊,也是一個圓括號,這說明(func)是一個函數(shù),而func是一個指向這類函數(shù)的指針,就是一個函數(shù)指針,這類函數(shù)具有int類型的形參,返回值類型是int。int(func)(intpint(f)(int))func被一對括號包含,且左邊有一個號,說明func是一個指針,跳出括號,右邊也有個括號,那么func是一個指向函數(shù)的指針
5、,這類函數(shù)具有int和int()(int)這樣的形參,返回值為int類型。再來看一看func的形參int(f)(int),類似前面的解釋,f也是一個函數(shù)指針,指向的函數(shù)具有int類型的形參,返回值為int。int(func[5])(intp)func右邊是一個[]運(yùn)算符,說明func是一個具有5個元素的數(shù)組,func的左邊有一個,說明func的元素是指針,要注意這里的不是修飾func的,而是修飾func[5]的,原因是[]運(yùn)算符優(yōu)先級比
6、高,func先跟[]結(jié)合,因此修飾的是func[5]。跳出這個括號,看右邊,也是一對圓括號,說明func數(shù)組的元素是函數(shù)類型的指針,它所指向的函數(shù)具有int類型的形參,返回值類型為int。int((func)[5])(intp)func被一個圓括號包含,左邊又有一個,那么func是一個指針,跳出括號,右邊是一個[]運(yùn)算符號,說明func是一個指向數(shù)組的指針,現(xiàn)在往左看,左邊有一個號,說明這個數(shù)組的元素是指針,再跳出括號,右邊又有一個括號
7、,說明這個數(shù)組的元素是指向函數(shù)的指針??偨Y(jié)一下,就是:func是一個指向數(shù)組的指針,這個數(shù)組的元素是函數(shù)指針,這些指針指向具有int形參,返回值為int類型的函數(shù)。int((func)(intp))[5]func是一個函數(shù)指針,這類函數(shù)具有int類型的形參,返回值是指向數(shù)組的指針,所指向的數(shù)組的元素是具有5個int元素的數(shù)組。要注意有些復(fù)雜指針聲明是非法的,例如:intfunc(void)[5]2。指針?biāo)赶虻念愋彤?dāng)你通過指針來訪問指針
8、所指向的內(nèi)存區(qū)時,指針?biāo)赶虻念愋蜎Q定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來看待。從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符去掉,剩下的就是指針?biāo)赶虻念愋?。例如?1)intptr指針?biāo)赶虻念愋褪莍nt(2)ptr指針?biāo)赶虻牡念愋褪?3)intptr指針?biāo)赶虻牡念愋褪莍nt(4)int(ptr)[3]指針?biāo)赶虻牡念愋褪莍nt()[3](5)int(ptr)[4]指針?biāo)赶虻牡念愋褪莍nt()[4]在指
9、針的算術(shù)運(yùn)算中,指針?biāo)赶虻念愋陀泻艽蟮淖饔?。指針的類?即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚€概念。當(dāng)你對C越來越熟悉時,你會發(fā)現(xiàn),把與指針攪和在一起的“類型”這個概念分成“指針的類型指針的類型”和“指針指針?biāo)赶虻念愋退赶虻念愋汀眱蓚€概念,是精通指針的關(guān)鍵點(diǎn)之一。我看了不少書,發(fā)現(xiàn)有些寫得差的書中,就把指針的這兩個概念攪在一起了,所以看起書來前后矛盾,越看越糊涂。3指針的值指針的值,或者叫指針?biāo)赶虻膬?nèi)存區(qū)或地址。指針的值是指
10、針本身存儲的數(shù)值,這個值將被編譯器當(dāng)作一個地址,而不是一個一般的數(shù)值。在32位程序里,所有類型的指針的值都是一個32位整數(shù),因為32位程序里內(nèi)存地址全都是32位長。指針?biāo)赶虻膬?nèi)存區(qū)就是從指針的值所代表的那個內(nèi)存地址開始,長度為sizeof(指針?biāo)赶虻念愋?的一片內(nèi)存區(qū)。以后,我們說一個指針的值是XX,就相當(dāng)于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊內(nèi)存區(qū)域,就相當(dāng)于說該指針的值是這塊內(nèi)存區(qū)域的首地址。指針
11、所指向的內(nèi)存區(qū)和指針?biāo)赶虻念愋褪莾蓚€完全不同的概念。在例一中,指針?biāo)赶虻念愋鸵呀?jīng)有了,但由于指針還未初始化,所以它所指向的內(nèi)存區(qū)是不存在的,或者說是無意義的。以后,每遇到一個指針,都應(yīng)該問問:這個指針的類型是什么?指針指向的類型是什么?該指針指向了哪里?4。指針本身所占據(jù)的內(nèi)存區(qū)。指針本身占了多大的內(nèi)存?你只要用函數(shù)sizeof(指針的類型)測一下就知道了。在32位平臺里,指針本身占據(jù)了4個字節(jié)的長度。指針本身占據(jù)的內(nèi)存這個概念在判
12、斷一個指針表達(dá)式是否是左值時很有用。指針的算術(shù)運(yùn)算指針可以加上或減去一個整數(shù)。指針的這種運(yùn)算的意義和通常的數(shù)值的加減運(yùn)算的意義是不一樣的。例如:例二:1。a[20]2。intptr=a......3。ptr在上例中,指針ptr的類型是int它指向的類型是int,它被初始化為指向整形變量a。接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論