史上最全C語(yǔ)言指針總結(jié)_第1頁(yè)
史上最全C語(yǔ)言指針總結(jié)_第2頁(yè)
史上最全C語(yǔ)言指針總結(jié)_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.C 語(yǔ)言中的精華是什么,答曰指針,這也是C 語(yǔ)言中唯一的難點(diǎn)。C 是對(duì)底層操作非常方便的語(yǔ)言, 而底層操作中用到最多的就是指針, 以后從事嵌入式開(kāi)發(fā)的朋友們,指針將陪伴我們終身。本文將從八個(gè)常見(jiàn)的方面來(lái)透視 C 語(yǔ)言中的指針, 當(dāng)然,還有其他沒(méi)有具體提到的方面, 像指針表達(dá)式、指針安全等問(wèn)題,以后有機(jī)會(huì)我再慢慢補(bǔ)充。還是那句老話(huà),重要的是實(shí)踐,多寫(xiě)代碼,才是學(xué)好C 語(yǔ)言的關(guān)鍵。1. 指針類(lèi)型分析分析指針,可以從變量名處起,根據(jù)運(yùn)算符優(yōu)先級(jí)結(jié)合, 一步一步分析 .int p;/這是一個(gè)普通的整型變量int *p;/ 首先從 P 處開(kāi)始 ,先與 * 結(jié)合 ,所以說(shuō)明 P 是一個(gè)指針 ,然后再與

2、int 結(jié)合 ,說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型為 int 型. 所以 P 是一個(gè)返回整型數(shù)據(jù)的指針int p3;/ 首先從 P 處開(kāi)始 ,先與 結(jié)合 , 說(shuō)明 P 是一個(gè)數(shù)組 , 然后與 int 結(jié)合 ,說(shuō)明數(shù)組里的元素是整型的 , 所以 P 是一個(gè)由整型數(shù)據(jù)組成的數(shù)組int *p3;/ 首先從 P 處開(kāi)始 , 先與 結(jié)合 ,因?yàn)槠鋬?yōu)先級(jí)比 * 高, 所以 P 是一個(gè)數(shù)組 , 然后再與 * 結(jié)合 ,說(shuō)明數(shù)組里的元素是指針類(lèi)型 ,然后再與 int 結(jié)合 , 說(shuō)明指針?biāo)赶虻膬?nèi)容的類(lèi)型是整型的,所以是一個(gè)由返回整型數(shù)據(jù)的指針?biāo)M成的數(shù)組int (*p)3;/ 首先從 P 處開(kāi)始 ,先與 * 結(jié)合 ,說(shuō)

3、明 P 是一個(gè)指針然后再與 結(jié)合 ( 與"()" 這步可以忽略, 只是為了改變優(yōu)先級(jí) ), 說(shuō)明指針?biāo)赶虻膬?nèi)容是一個(gè)數(shù)組 , 然后再與 int 結(jié)合 , 說(shuō)明數(shù)組里的元素是整型的 . 所以 P 是一個(gè)指向由整型數(shù)據(jù)組成的數(shù)組的指針int *p;/ 首先從P 開(kāi)始 ,先與 * 結(jié)合 ,說(shuō)明 P 是一個(gè)指針 ,然后再與 * 結(jié)合 , 說(shuō)明指針?biāo)赶虻脑厥侵羔?, 然后再與 int 結(jié)合 ,說(shuō)明該指針?biāo)赶虻脑厥钦蛿?shù)據(jù) . 所以 P 是一個(gè)返回指向整型數(shù)據(jù)的指針的指針int p(int);/ 從 P 處起 ,先與 () 結(jié)合 ,說(shuō)明 P 是一個(gè)函數(shù) ,然后進(jìn)入 () 里分

4、析 , 說(shuō)明該函數(shù)有一個(gè)整型變量的參數(shù)然后再與外面的 int 結(jié)合 , 說(shuō)明函數(shù)的返回值是一個(gè)整型數(shù)據(jù) . 所以 P 是一個(gè)有整型參數(shù)且返回類(lèi)型為整型的函數(shù)int (*p)(int);/ 從 P 處開(kāi)始 , 先與指針結(jié)合 ,說(shuō)明 P 是一個(gè)指針 , 然后與 () 結(jié)合 ,說(shuō)明指針指向的是一個(gè)函數(shù) , 然后再與 () 里的 int 結(jié)合 , 說(shuō)明函數(shù)有一個(gè) int 型的參數(shù) ,再與最外層的 int 結(jié)合 , 說(shuō)明函數(shù)的返回類(lèi)型是整型 ,所以 P 是一個(gè)指向有一個(gè)整型參數(shù)且返回類(lèi)型為整型的函數(shù)的指針int *(*p(int)3;/ 從 P 開(kāi)始 ,先與 () 結(jié)合 ,說(shuō)明 P 是一個(gè)函數(shù) , 然后

5、進(jìn)入 () 里面 ,與 int 結(jié)合 , 說(shuō)明函數(shù)有一個(gè)整型變量參數(shù),然后再與外面的 * 結(jié)合 ,說(shuō)明函數(shù)返回的是一個(gè)指針, 然后到最外面一層 , 先與 結(jié)合 , 說(shuō)明返回的指針指向的是一個(gè)數(shù)組, 然后再與 * 結(jié)合 ,說(shuō)明數(shù)組里的元素是指針, 然后再與 int結(jié)合 , 說(shuō)明指針指向的內(nèi)容是整型數(shù)據(jù) . 所以 P 是一個(gè)參數(shù)為一個(gè)整數(shù)且返回一個(gè)指向由整型指針變量組成的數(shù)組的指針變量的函數(shù)2. 指針?lè)治鲋羔樖且粋€(gè)特殊的變量,它里面存儲(chǔ)的數(shù)值被解釋成為內(nèi)存里的一個(gè)地址。;.要搞清一個(gè)指針需要搞清指針的四方面的內(nèi)容:指針的類(lèi)型、指針?biāo)赶虻念?lèi)型、指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)、指針本身所占據(jù)的內(nèi)存

6、區(qū)。指針的類(lèi)型:把指針聲明語(yǔ)句里的指針名字去掉,剩下的部分就是這個(gè)指針的類(lèi)型指針?biāo)赶虻念?lèi)型:把指針聲明語(yǔ)句中的指針名字和名字左邊的指針聲明符* 去掉,剩下的就是指針?biāo)赶虻念?lèi)型(在指針的算術(shù)運(yùn)算中,指針?biāo)赶虻念?lèi)型有很大的作用)指針?biāo)赶虻膬?nèi)存區(qū):從指針的值所代表的那個(gè)內(nèi)存地址開(kāi)始,長(zhǎng)度為sizeof( 指針?biāo)赶虻念?lèi)型 )的一片內(nèi)存區(qū)。(一個(gè)指針指向了某塊內(nèi)存區(qū)域,就相當(dāng)于說(shuō)該指針的值是這塊內(nèi)存區(qū)域的首地址)指針本身所占據(jù)的內(nèi)存區(qū): 用函數(shù) sizeof( 指針的類(lèi)型 ) 可以測(cè)出指針本身所占據(jù)的內(nèi)存區(qū) (在 32 位平臺(tái)里,指針本身占據(jù)了 4 個(gè)字節(jié)的長(zhǎng)度)3. 指針的算術(shù)運(yùn)算指針和整數(shù)

7、進(jìn)行加減: 一個(gè)指針ptrold加( 減) 一個(gè)整數(shù)n 后,結(jié)果是一個(gè)新的指針ptrnew,ptrnew的類(lèi)型和ptrold的類(lèi)型相同, ptrnew所指向的類(lèi)型和ptrold所指向的類(lèi)型也相同,ptrnew的值將比ptrold的值增加 ( 減少 ) 了 n 乘 sizeof(ptrold所指向的類(lèi)型 ) 個(gè)字節(jié)。指針和指針進(jìn)行加減:兩個(gè)指針不能進(jìn)行加法運(yùn)算,這是非法操作;兩個(gè)指針可以進(jìn)行減法操作,但必須類(lèi)型相同,一般用在數(shù)組方面。4. 運(yùn)算符 & 和*& 是取地址運(yùn)算符, * 是間接運(yùn)算符。&a 的運(yùn)算結(jié)果是一個(gè)指針,指針的類(lèi)型是 a 的類(lèi)型加個(gè) * ,指針?biāo)赶虻念?lèi)

8、型是 a 的類(lèi)型,指針?biāo)赶虻牡刂仿?,那就?a 的地址。*p 的運(yùn)算結(jié)果就五花八門(mén)了,總之 *p 的結(jié)果是 p 所指向的東西,這個(gè)東西有這些特點(diǎn):它的類(lèi)型是 p 指向的類(lèi)型,它所占用的地址是 p 所指向的地址。5. 數(shù)組和指針的關(guān)系數(shù)組的數(shù)組名其實(shí)可以看作一個(gè)指針。聲明了一個(gè)數(shù)組TYPE arrayn,則數(shù)組名稱(chēng)array就有了兩重含義:第一,它代表整個(gè)數(shù)組,它的類(lèi)型是TYPEn ;第二 ,它是一個(gè)常量指針,該指針的類(lèi)型是TYPE* ,該指針指向的類(lèi)型是TYPE,也就是數(shù)組單元的類(lèi)型,該指針指向的內(nèi)存區(qū)就是數(shù)組第0 號(hào)單元,該指針自己占有單獨(dú)的內(nèi)存區(qū),注意它和數(shù)組第0 號(hào)單元占據(jù)的內(nèi)存區(qū)是不

9、同的。該指針的值是不能修改的,即類(lèi)似array+的表達(dá)式是錯(cuò)誤的。6. 指針和結(jié)構(gòu)類(lèi)型的關(guān)系假設(shè)我們定義了一個(gè)結(jié)構(gòu)體, struct MyStructinta;int b;int c;同時(shí)定義結(jié)構(gòu)體的結(jié)構(gòu)對(duì)象并初始化,struct MyStructss=20,30,40;那么我們?nèi)绾瓮ㄟ^(guò)指針 ptr 來(lái)訪問(wèn) ss的三個(gè)成員變量呢?答案就是,我們先定義一個(gè)指向結(jié)構(gòu)對(duì)象ss 的指針, struct MyStruct *ptr=&ss;然后,使用指向運(yùn)算符 -> 便可實(shí)現(xiàn)對(duì)結(jié)構(gòu)對(duì)象ss 成員的訪問(wèn)。;.ptr->a; /或者可以這們 (*ptr).a,建議使用前者ptr->

10、b;ptr->c;7. 指針和函數(shù)的關(guān)系可以把一個(gè)指針聲明成為一個(gè)指向函數(shù)的指針, 從而通過(guò)函數(shù)指針調(diào)用函數(shù)。 讓我們舉一個(gè)例子來(lái)說(shuō)明以下吧。int fun(char *,int);int (*pfun)(char *,int);pfun=fun;int a=(*pfun)("abcdefg",7);例中,定義了一個(gè)指向函數(shù) fun 的指針 pfun ,把 pfun 作為函數(shù)的形參。把指針表達(dá)式作為實(shí)參,從而實(shí)現(xiàn)了對(duì)函數(shù) fun 的調(diào)用。8. 指針類(lèi)型轉(zhuǎn)換當(dāng)我們初始化一個(gè)指針或給一個(gè)指針賦值時(shí), 賦值號(hào)的左邊是一個(gè)指針, 賦值號(hào)的右邊是一個(gè)指針表達(dá)式,這就要求兩邊的類(lèi)型一致,所指向的類(lèi)型也一致,如果不一致的話(huà),需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。語(yǔ)法格式是:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論