復(fù)習(xí)第5章市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁(yè)
復(fù)習(xí)第5章市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁(yè)
復(fù)習(xí)第5章市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁(yè)
復(fù)習(xí)第5章市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁(yè)
復(fù)習(xí)第5章市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章指針指針是變量在內(nèi)存中地址。計(jì)算機(jī)內(nèi)存是一個(gè)連續(xù)編號(hào)或編址空間。也就是說(shuō),每一個(gè)存放單元(在微型計(jì)算機(jī)中通常是一個(gè)字節(jié))都有一個(gè)固定編號(hào),這個(gè)編號(hào)稱為地址。專門用來(lái)存放地址變量就是指針變量。指針變量和普通變量共同點(diǎn)是:它們都代表內(nèi)存中某個(gè)存放單元,在內(nèi)存中都被映射為地址;不一樣之處于于:普通變量存放單元中存放是數(shù)據(jù),而指針變量存放單元中存放是地址第1頁(yè)相關(guān)地址運(yùn)算&v,v是變量或數(shù)組元素訪問地址運(yùn)算是使用訪問地址運(yùn)算符*和[]來(lái)訪問指定內(nèi)存地址中數(shù)據(jù)(1)*運(yùn)算符是一元運(yùn)算符,它格式以下:*add,add是地址量,如變量或數(shù)組元素地址、數(shù)組名、指針變量等(2)[]運(yùn)算符是二元運(yùn)算符,它格式以下:add[exp],add是地址變量,通常是數(shù)組名或指向數(shù)組指針;exp是整型表示式第2頁(yè)重點(diǎn)C語(yǔ)言要求在程序中對(duì)變量先定義后使用,目標(biāo)是在編譯時(shí)就能為這些變量分配內(nèi)存空間。沒有定義變量是不能訪問不一樣數(shù)據(jù)類型變量或數(shù)組占用存放空間字節(jié)數(shù)是不一樣。比如,整型變量要占兩個(gè)字節(jié)存放單元,而每一字節(jié)都有一個(gè)地址,變量地址是指該變量所占存放空間首字節(jié)地址數(shù)組名代表該數(shù)組占用一片連續(xù)存放空間首地址,它是一個(gè)常數(shù)。因?yàn)楦髟卦趦?nèi)存中是次序存放,所以可依據(jù)某個(gè)數(shù)組元素地址取得其它元素地址。指向數(shù)組指針正是利用這一點(diǎn),經(jīng)過(guò)指針移動(dòng)來(lái)訪問各個(gè)數(shù)組元素第3頁(yè)重點(diǎn)比如,定義了一個(gè)簡(jiǎn)單變量a,它地址為&a,能夠用*&a來(lái)訪問a中數(shù)據(jù),也能夠用(&a)[0]來(lái)訪問a中數(shù)據(jù),但不能用*a或a[0]來(lái)訪問,因?yàn)閍不是地址量若d是整型數(shù)組,則d[1]表示從d起始地址開始向高地址方向移動(dòng)一個(gè)數(shù)據(jù)單元,即兩個(gè)字節(jié)后數(shù)據(jù)單元值C語(yǔ)言對(duì)多維數(shù)組是采取遞歸方式定義。比如,二維數(shù)組a[4][3]能夠看做由a[0],a[1],a[2],a[3]這四個(gè)元素組成一維數(shù)組,而這一維數(shù)組每個(gè)元素又都是包含三個(gè)元素一維數(shù)組。依據(jù)遞歸定義,a[0],a[1],a[2],a[3]都是一維數(shù)組名,它們分別代表數(shù)組a第一行到第四行首地址,稱為行地址,每行中又包含若干個(gè)列地址第4頁(yè)重點(diǎn)*和[]都是訪問地址運(yùn)算符,它們是等價(jià)。指針數(shù)據(jù)類型包含int,float,char,double,void五種基本類型,指針定義中”*”是指針說(shuō)明符,而不是訪問地址運(yùn)算符,也不是乘法運(yùn)算符使指針指向?qū)ο螅菍⒃搶?duì)象地址存入指針變量中。第5頁(yè)重點(diǎn)指針變量是用來(lái)存放地址,而指針本身也有自己地址。所以,指針本身地址與指針中存放地址是不一樣charp=&c;charc;是錯(cuò)誤,所以編譯charp=&c時(shí),變量c還未安排存放單元,它地址不存在。Floata,*p;p=a;是錯(cuò)誤,應(yīng):p=&a;第6頁(yè)難點(diǎn)將int型指針指向char型數(shù)據(jù)對(duì)象是錯(cuò)誤Int*ip;char*cp;ip=cp;是錯(cuò)誤??罩羔?,也叫NULL指針,是指已經(jīng)定義但未指向數(shù)據(jù)對(duì)象指針;void型指針,也叫無(wú)值類型指針,是僅表示指向內(nèi)存某個(gè)地址而未說(shuō)明指向何種類型數(shù)據(jù)指針第7頁(yè)指針運(yùn)算假如兩個(gè)指針之間存放是相同類型數(shù)據(jù)(通常是數(shù)組情況),則這兩個(gè)指針能夠相減,結(jié)果是這兩個(gè)指針之間包含數(shù)據(jù)對(duì)象個(gè)數(shù)。尤其是,當(dāng)一個(gè)指針與NULL進(jìn)行相等或不等比較時(shí),能夠判斷該指針是否為空指針。If(p!=NULL)printf(“%d\n”,*p);表示當(dāng)p不是空指針時(shí),就顯示該指針?biāo)复娣艈卧档?頁(yè)難點(diǎn)指針與整數(shù)相加減能夠移動(dòng)指針,這種移動(dòng)指是內(nèi)存地址改變,而不是真有一個(gè)指針在內(nèi)存中移動(dòng)Inta[5],*p=a;使p指向數(shù)組a第一個(gè)元素a[0],即p中存放是a[0]地址。P+1就是a[1]地址。P+1與++p是不一樣,假如p指向a[0],p+1能夠得到a[1]地址,但p中存放仍是a[0]地址。但經(jīng)過(guò)p++運(yùn)算后,p中存放是a[1]地址,也就是說(shuō),p已經(jīng)指向了a[1],而不再指向a[0]。假如定義了指向變量a指針p,則程序中凡是能正確使用變量名a地方,都能夠用*p或p[0]來(lái)代替第9頁(yè)重點(diǎn)Main(){inta,b,*p=&a;scanf(“%d%d”,p,p+1);printf(“a=%d,b=%d\n”,*p,*(p+1));}程序中p存放是變量a地址,p+1表示變量b地址,直接使用指針p來(lái)輸入和輸出變量a和b值注意,因?yàn)?和++處于同一優(yōu)先級(jí),結(jié)合性均為從右到左,所以(*p)++與*p++是不一樣假如定義了變量a及指向它指針p,則p[0]和(&a)[0]都表示變量a值,初學(xué)者不要一看到出現(xiàn)了[]就誤認(rèn)為p是一個(gè)數(shù)組名第10頁(yè)用指針訪問一維數(shù)組一維數(shù)組存放結(jié)構(gòu)是線性,在內(nèi)存中占用一片連續(xù)存放單元。因?yàn)橐痪S數(shù)組下標(biāo)是從0開始,所以p[0]表示數(shù)組第1個(gè)元素,p[i]表示數(shù)組第i+1個(gè)元素當(dāng)用*&p[i]形式指針訪問一維數(shù)組元素a[i]時(shí),無(wú)須加上圓括號(hào),因?yàn)閇]優(yōu)先級(jí)高于*和&,而*和&處于同一優(yōu)先級(jí),它們結(jié)合性都是從右到左,所以先得到p[i],然后得到&p[i],最終才得到*&p[i]。因?yàn)橛弥羔樤L問數(shù)組時(shí),主要是經(jīng)過(guò)指針移動(dòng)來(lái)實(shí)施數(shù)據(jù)訪問,所以需要十分警覺,預(yù)防越界第11頁(yè)用指針訪問二維數(shù)組定義一個(gè)指向二維數(shù)組指針能夠從兩個(gè)方面考慮:一是按二維數(shù)組存放結(jié)構(gòu)考慮,二是從二維數(shù)組邏輯結(jié)構(gòu)考慮二維數(shù)組在邏輯上是二維空間,不過(guò)在內(nèi)存中則是以行為主序占用一片連續(xù)存放空間,其存放結(jié)構(gòu)是一維線性二維數(shù)組邏輯結(jié)構(gòu)是一個(gè)二維表,橫向?yàn)橐恍?,縱向?yàn)橐涣?。假如定義一個(gè)指針指向二維數(shù)組一行,則能夠移動(dòng)到下一行,這就是行指針第12頁(yè)按二維數(shù)組邏輯結(jié)構(gòu)定義行指針[存放類型]數(shù)據(jù)類型(*指針)[n]方括號(hào)中n是一個(gè)整數(shù),表示所指向二維數(shù)組列數(shù)假如定義幾個(gè)指針,使每個(gè)指針分別指向二維數(shù)組對(duì)應(yīng)行,這就是指針數(shù)組。指針數(shù)組每一個(gè)元素都是指針,實(shí)際上是由若干個(gè)行指針組成數(shù)組,其中每一個(gè)元素分別指向二維數(shù)組對(duì)應(yīng)行[存放類型]數(shù)據(jù)類型(*指針數(shù)組名)[n]方括號(hào)中n是一個(gè)整數(shù),表示指針?biāo)赶蚨S數(shù)組行數(shù)第13頁(yè)行指針和指針數(shù)組共同點(diǎn)行指針和指針數(shù)組都是按二維數(shù)組邏輯結(jié)構(gòu)定義用行指針和指針數(shù)組訪問數(shù)組元素時(shí)地址表示形式和數(shù)據(jù)訪問形式是完全相同,所以掌握其中一個(gè),能夠套用到另一個(gè)對(duì)二維數(shù)組而言,數(shù)組名、行指針或指針數(shù)組都是針對(duì)數(shù)組邏輯結(jié)構(gòu)。第一次訪問地址運(yùn)算訪問是行地址,第二次訪問地址運(yùn)算才能訪問到數(shù)據(jù)第14頁(yè)難點(diǎn)Inta[3][5],(*p)[5],*p1[3];P=a;P1[0]=a[0],p1[1]=a[1],p1[2]=a[2];用a,p或p1都能訪問數(shù)組a各個(gè)元素,都要進(jìn)行兩次訪問地址運(yùn)算。第一次訪問地址運(yùn)算可得到*(a+i),*(p+i),*(p1+i),a[i],p[i],p1[i]等,它們都表示數(shù)組a第i行第0列地址;第二次訪問地址運(yùn)算可得到*(*(a+i)+j),*(*(p+i)+j),*(*(p1+i)+j),*(*(a[i]+j),*(*p[i]+j),*(*p1[i]+j),a[i][j],p[i][j],p1[i][j]等,它們才是真正訪問到了數(shù)組元素a[i][j]值,其中*(a+i)+j,*(p+i)+j,*(p1+i)+j,a[i]+j,p[i]+j和p1[i]+j都表示數(shù)組a第i行第j列地址第15頁(yè)難點(diǎn)對(duì)二維數(shù)組a[M][N]而言,a+i,*(a+i),a[i],&a[i]及&a[i][0]都表示該數(shù)組第i行首地址,這幾個(gè)表示形式從數(shù)值上是相等,但其含義是不一樣。其中,a+i和&a[i]是指向行,它們和數(shù)組名一樣并不指向詳細(xì)存放單元,所以不能試圖經(jīng)過(guò)對(duì)它們?cè)龠M(jìn)行一次訪問地址運(yùn)算就能訪問它們內(nèi)容,因?yàn)樗鼈儧]有內(nèi)容;,*(a+i),a[i],及&a[i][0]是指向列,即指向第i行第0列存放單元,若對(duì)它們?cè)龠M(jìn)行一次訪問地址運(yùn)算,就能訪問a[i][0]值。第16頁(yè)用指針處理字符串Chars[80],*st=s;st=“Goodmorning”;字符型指針st中存放是字符型數(shù)組s首地址。字符串”Goodmorning”被存放在字符型數(shù)組s中,于是能夠用st代替數(shù)組s來(lái)處理字符串Char*str;str=“abcd”;printf(“%s\n”,str);str=“efgh”;“abcd”并沒有被“efgh”替換,而是”abcd”和”efgh”各自占用自己存放單元,含有不一樣起始地址。也就是說(shuō),”abcd”所在存放單元已變成不可訪問第17頁(yè)用指針處理字符串Char*st;scanf(“%s”,st);是不正確。因?yàn)閟t并沒有指向任何可存放字符串存放單元,st中地址值是隨機(jī),使用由它指示起始地址來(lái)存放字符串,可能引發(fā)意料不到錯(cuò)誤因?yàn)闊o(wú)名數(shù)組元素都沒有名字,所以只能經(jīng)過(guò)指針訪問;無(wú)名數(shù)組所占存放空間是由編譯系統(tǒng)指定,用戶無(wú)法控制或改變;一旦指針被重新賦值,它就指向另一個(gè)無(wú)名數(shù)組,原先數(shù)組就不能再訪問依據(jù)字符型指針獨(dú)立使用上述特點(diǎn),能夠?qū)⒆址椭羔樣米鲋虚g變量,起字符串變量作用,這在進(jìn)行字符串排序時(shí)是很有用第18頁(yè)難點(diǎn)每個(gè)字符串常量都各有自己起始地址,即使兩個(gè)完全相同字符串,它們起始地址也是不一樣用字符串常量對(duì)字符型指針進(jìn)行初始化或賦值時(shí),指針中存放是無(wú)名字符型數(shù)組起始地址,對(duì)每個(gè)數(shù)組元素只能用指針訪問第19頁(yè)用指針進(jìn)行內(nèi)存動(dòng)態(tài)分配方法和內(nèi)存動(dòng)態(tài)分配函數(shù)第一個(gè)使用內(nèi)存靜態(tài)存放區(qū)和堆棧區(qū),分別存放全局變量和局部變量;第二種使用內(nèi)存堆或堆棧區(qū),進(jìn)行內(nèi)存動(dòng)態(tài)分配,即由用戶在程序中經(jīng)過(guò)動(dòng)態(tài)分配獲取內(nèi)存。使用內(nèi)存動(dòng)態(tài)分配最少有三個(gè)優(yōu)點(diǎn):一是能夠更有效地使用內(nèi)存,二是同一段內(nèi)存可作為不一樣用途,三是能夠用來(lái)處理鏈表等動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)第20頁(yè)重點(diǎn)Malloc(),calloc()和realloc()函數(shù)返回值都是void型指針,也就是說(shuō),這三個(gè)函數(shù)得到是內(nèi)存單元地址,該地址并未指明存放何種類型數(shù)據(jù)Int*pi;pi=calloc(100,sizeof(int));是錯(cuò)誤因?yàn)樘峁﹦?dòng)態(tài)分配內(nèi)存空間并不是無(wú)限大,假如在程序中頻繁開辟動(dòng)態(tài)內(nèi)存,提議使用下面程序段,方便在p得到NULL值時(shí)能及時(shí)處理If((p1=(char*)malloc(80))==NULL)exit(1);Exit函數(shù)是C編譯系統(tǒng)提供函數(shù),用來(lái)在分配不成功時(shí)中止程序執(zhí)行,并返回到操作系統(tǒng)第21頁(yè)多級(jí)指針?biāo)^一級(jí)指針,是直接指向數(shù)據(jù)對(duì)象指針,即其中存放是數(shù)據(jù)地址。所謂二級(jí)指針,是指向指針指針,它并不直接指向數(shù)據(jù)對(duì)象,而是指向一級(jí)指針,也就是說(shuō),二級(jí)指針中存放是一級(jí)指針地址。類似地,三級(jí)指針式指向指針指針指針,三級(jí)指針存放是二級(jí)指針地址[存放類型]數(shù)據(jù)類型**指針名,***指針名指針名前面有兩個(gè)*表示它是一個(gè)二級(jí)指針,指針名前有三個(gè)*表示它是一個(gè)三級(jí)指針第22頁(yè)多級(jí)指針I(yè)nta,*p1a,**p2a;P1a=&a;p2a=&p1a;其中一級(jí)指針p1a存放變量a地址,二級(jí)指針p2a存放一級(jí)指針p1a地址,那么既能夠用一級(jí)指針p1a訪問變量a,也能夠用二級(jí)指針p2a訪問變量a,即a,*p1a或**p2a都表示訪問變量a值,三者是等價(jià)第23頁(yè)多級(jí)指針charc,*p1c,**p2c,***p3

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論