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