




已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章,指針,目錄,8.1指針的概念,8.2指針變量的定義和引用,8.3指針與一維數(shù)組,8.4指針與字符串,8.5指針與多維數(shù)組,8.6指針數(shù)組與指向指針的指針,8.7返回指針值的函數(shù),8.8指向函數(shù)的指針,8.9動(dòng)態(tài)內(nèi)存分配,8.10本章程序舉例,本章要點(diǎn)小結(jié),本章結(jié)束,8.1指針的概念,指針是C語(yǔ)言的一個(gè)重要概念,也是C語(yǔ)言的一個(gè)重要特色。深刻理解和正確使用指針是學(xué)習(xí)本章的基本要求。,本章是一個(gè)難點(diǎn),也是一個(gè)重點(diǎn),初學(xué)者不易掌握。在理解和熟悉基本內(nèi)容的前提下,上機(jī)實(shí)驗(yàn)是必不可少的環(huán)節(jié)。,8.1指針的概念,一、地址,在計(jì)算機(jī)中,把內(nèi)存區(qū)劃分為一個(gè)一個(gè)的存儲(chǔ)單元,每個(gè)單元為一個(gè)字節(jié)(位),它們都有一個(gè)編號(hào),這個(gè)編號(hào)就是內(nèi)存地址。如下圖所示:,注意:1、程序中定義的每個(gè)數(shù)據(jù)在編譯后都占有各自的內(nèi)存區(qū)。2、數(shù)據(jù)所占有的存儲(chǔ)單元個(gè)數(shù)是由其類(lèi)型決定的。3、首地址:第1個(gè)單元的地址4、表示地址的數(shù)與整數(shù)的區(qū)別,8.1指針的概念,二、舉例,如有定義:charc=A;inta=3;則所占內(nèi)存情況如下:,注意:c和a的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不用關(guān)心。,8.1指針的概念,三、指針與指針變量,1、指針:簡(jiǎn)單地說(shuō),指針就是地址。二者是同一個(gè)概念的兩種說(shuō)法。只不過(guò)指針更形象一些,就像一個(gè)針一樣,可以指向某個(gè)地方。,2、指針變量:首先指針變量就是一個(gè)變量,和我們以前所講的其它變量沒(méi)有本質(zhì)區(qū)別。不同之處在于這種變量中所存放的內(nèi)容是地址。,什么是指針變量呢?我們回憶一下什么叫整型變量,打個(gè)比方,8.1指針的概念,四、直接訪問(wèn)和間接訪問(wèn),有兩個(gè)上鎖且放著物品的盒子A、B,如果你有A盒子的鑰匙,則可以直接打開(kāi)A盒子將物品取出;如果你有B盒子的鑰匙,而A盒子的鑰匙在B盒子中,要想取出A盒子中的物品,則必須先打開(kāi)B盒子,取出A盒子的鑰匙,再打開(kāi)A盒子將物品取出。上面兩種情況就是直接訪問(wèn)和間接訪問(wèn)的概念。,8.1指針的概念,1、直接訪問(wèn),通過(guò)變量本身對(duì)變量進(jìn)行存取的方式,稱(chēng)為直接訪問(wèn)。如定義:intx;則x=10;x+=5;等等這種訪問(wèn)方式只需要變量本身就得到了該變量的全部信息,不需要其它內(nèi)容,是直接的。,8.1指針的概念,2、間接訪問(wèn),通過(guò)指針變量實(shí)現(xiàn)對(duì)變量的訪問(wèn)方式,稱(chēng)為間接訪問(wèn)。首先要定義一個(gè)指針變量,然后將一個(gè)同類(lèi)型變量的地址賦給該指針變量(這時(shí)我們稱(chēng)指針變量指向該變量),這樣就可以進(jìn)行間接訪問(wèn)了。間接訪問(wèn)的過(guò)程是:由指針變量得到變量的地址,根據(jù)該地址找到變量的存儲(chǔ)區(qū),再對(duì)該存儲(chǔ)區(qū)的內(nèi)容進(jìn)行存取,從而實(shí)現(xiàn)了對(duì)變量的間接訪問(wèn)。,8.2指針變量的定義和引用,一、指針變量的定義和賦值,1、格式:類(lèi)型名*指針變量名;,2、舉例int*p1;char*s1,*s2;float*a1,*a2,f;,3、說(shuō)明a.類(lèi)型名:指針變量所指向的變量類(lèi)型。b.*是定義指針變量的標(biāo)志,不可丟掉。c.指針變量定義后,其值是不確定的。,8.2指針變量的定義和引用,4、賦值:可以進(jìn)行初始化,也可以使用賦值語(yǔ)句,(1)、初始化:inta,*s=,(2)、賦值語(yǔ)句inta,*s;s=,(3)、注意:只能用同類(lèi)型變量的地址進(jìn)行賦值!如定義:int*s;floatf;則s=則,s,a,若有:inta=5,*s=則,不定,5,int*p1,*p2;p1=,舉例,p1,int*p1,*p2,*p;p1=,p1,int*p1,*p2;p1=,p1,main()inta=11,*p=,執(zhí)行,例8.5,8.3指針與一維數(shù)組,在語(yǔ)言中,指針與數(shù)組有著密切的關(guān)系。對(duì)數(shù)組元素,既可以采用數(shù)組下標(biāo)來(lái)引用,也可以通過(guò)指向數(shù)組元素的指針來(lái)引用。采用指針?lè)椒ㄌ幚頂?shù)組,可以產(chǎn)生代碼長(zhǎng)度小、運(yùn)行速度快的程序。,8.3指針與一維數(shù)組,一、通過(guò)指針訪問(wèn)一維數(shù)組,1、數(shù)組結(jié)構(gòu)的分析,設(shè)有數(shù)組定義為:inta5;則有:(1)a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1個(gè)元素的首地址,它是一個(gè)地址常量,其值由系統(tǒng)在編譯時(shí)確定,程序運(yùn)行期間不能改變。(2)數(shù)組中的各元素表示為:a0、a1、a2、a3、a4或者是:*(a+0)(或*a)、*(a+1)、*(a+2)、*(a+3)、*(a+4),8.3指針與一維數(shù)組,(3)數(shù)組中的各元素的地址表示為:并進(jìn)行賦值:s=a;或s=則,指針變量s指向了數(shù)組a的開(kāi)始,二者產(chǎn)生了聯(lián)系,這樣就可以通過(guò)指針變量s訪問(wèn)數(shù)組a了。,a,或s=圖變?yōu)椋?a,s+=2;效果與上述相同。,8.3指針與一維數(shù)組,當(dāng)一個(gè)指針變量指向數(shù)組的首地址后,關(guān)系圖為:,數(shù)組inta5,指向數(shù)組元素的指針,指向數(shù)組元素的訪問(wèn),a,for(i=0;i5;i+)printf(“%d”,ai);for(i=0;i5;i+)printf(“%d”,*(a+i);for(i=0;i5;i+)printf(“%d”,pi);for(i=0;i5;i+)printf(“%d”,*(p+i);for(;pa+5;p+)printf(“%d”,*p);p=a;while(pa+5)printf(“%d”,*p+);,8.3指針與一維數(shù)組,4、幾個(gè)表達(dá)式的分析,設(shè)定義:inta3=1,2,3,*s=a;s,*sa,*as+,*s+,a+,*a+*(s+),(*s)+*(a+),(*a)+初始化時(shí)的*s=a;與語(yǔ)句*s=a;的不同一個(gè)指針變量加/減一個(gè)整數(shù)后,指針變量值的變化情況,8.3指針與一維數(shù)組,二、通過(guò)指針在函數(shù)間傳遞一維數(shù)組,1、函數(shù)的定義形式,例如:intfunc(intarray,intn)函數(shù)體;也可以寫(xiě)為:intfunc(int*pointer,intn)函數(shù)體;,8.3指針與一維數(shù)組,2、函數(shù)的說(shuō)明形式,如有函數(shù)定義:intfunc(intarray,intn)函數(shù)體;則對(duì)該函數(shù)的說(shuō)明形式可以寫(xiě)為:intfunc(intarray,intn);intfunc(int*array,intn);intfunc(int,int);intfunc(int*,int);,注意:作為形參定義的數(shù)組名是一個(gè)指針變量,它在函數(shù)體中可以變化,這一點(diǎn)與變量定義時(shí)不同。,8.3指針與一維數(shù)組,例8.7編寫(xiě)在數(shù)組的最后一個(gè)元素中存放其它元素和的函數(shù)#includevoidsummary(int*p,intn);main()staticinta11=1,2,3,4,5,6,7,8,9,10;summary(a,10);printf(“Sumis%dn”,a10);voidsummary(int*p,intn)ints=0;while(n)s+=*(p+);*p=s;,函數(shù)還可寫(xiě)為:voidsummary(intarr,intn)inti,s=0;for(i=0;in;i+)s+=arri;arrn=s;,8.4指針與字符串,字符串是一種特殊的一維數(shù)組,所以上節(jié)中介紹的方法同樣適用于對(duì)字符串的訪問(wèn)。字符串的特殊性在于:字符串的末尾是結(jié)束標(biāo)志0,所以訪問(wèn)字符串時(shí)常用結(jié)束標(biāo)志進(jìn)行判斷。,8.4指針與字符串,一、通過(guò)指針訪問(wèn)字符串,1、字符串結(jié)構(gòu)的分析,設(shè)有數(shù)組定義為:chars=“abcde”;則s是一個(gè)字符數(shù)組,它里面存放的是一個(gè)字符串。它在內(nèi)存中占用6個(gè)字節(jié),但長(zhǎng)度為5。其結(jié)構(gòu)為:,s,s0s1s2s3s4s5,結(jié)束標(biāo)志,8.4指針與字符串,字符串還可以定義為:char*s=“abcde”;它在內(nèi)存中占用6個(gè)字節(jié),長(zhǎng)度為5。其結(jié)構(gòu)為:,s,s0s1s2s3s4s5,結(jié)束標(biāo)志,8.4指針與字符串,2、用字符數(shù)組與用指針使用字符串的比較,定義及初始化chars=“abcde”;char*p=“abcde”;賦值chars6;char*p;s=“abcde”;/*不對(duì),應(yīng)為*/p=“abcde”;strcpy(s,“abcde”);strcpy(p,“abcde”);使用s不能加/減p可以加/減注意:chars=“abc”;與chars=a,b,c;的區(qū)別,8.4指針與字符串,例8.8將字符數(shù)組a中的字符串拷貝到字符數(shù)組b中(1)下標(biāo)法(2)指針?lè)?include#includemain()main()chara=“Hello,world!”,b20;chara=“Hello,world!”,b20;inti;char*pa,*pb;for(i=0;ai!=0;i+)for(pa=a,pb=b;*pa!=0;pa+,pb+)bi=ai;*pb=*pa;bi=0;*pb=0;printf(“%sn”,b);printf(“%sn”,b);,該功能相當(dāng)于:strcpy(b,a);,8.4指針與字符串,二、通過(guò)指針在函數(shù)間傳遞字符串,1、函數(shù)的定義形式,例如:charfunc(chara,charb)函數(shù)體;也可以寫(xiě)為:charfunc(char*a,char*b)函數(shù)體;,8.4指針與字符串,例8.10設(shè)計(jì)一函數(shù),實(shí)現(xiàn)與標(biāo)準(zhǔn)函數(shù)strcpy類(lèi)似的功能。#includevoidmystrcpy(char*to,char*from);main()charca20,*cp=“Hello,world!”;mystrcpy(ca,cp);printf(“%s”,ca);voidmystrcpy(char*to,char*from)while(*from!=0)*to=*from;to+;from+;*to=0;,while(*to+=*from+);,思考:調(diào)用mystrcpy(ca,cp+2);結(jié)果如何?,8.5指針與多維數(shù)組,數(shù)組是具有相同“數(shù)據(jù)類(lèi)型”的數(shù)據(jù)的順序集合,而數(shù)組本身也是語(yǔ)言的一種數(shù)據(jù)類(lèi)型,同樣可以作為數(shù)組的元素類(lèi)型。當(dāng)一個(gè)一維數(shù)組的元素類(lèi)型為數(shù)組時(shí),便構(gòu)成了多維數(shù)組。熟記下面兩組等價(jià)式:xi*(x+i)則有:a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1個(gè)元素(也是第一行)的首地址,它是一個(gè)地址常量,其值由系統(tǒng)在編譯時(shí)確定,程序運(yùn)行期間不能改變。該二維數(shù)組可以理解為:它是一個(gè)一維數(shù)組,含有3個(gè)元素,每個(gè)元素又是一個(gè)一維數(shù)組,該一維數(shù)組含有4個(gè)元素,每個(gè)元素是int類(lèi)型。,8.5指針與多維數(shù)組,二維數(shù)組的邏輯結(jié)構(gòu)圖如下:,a0,a1,a2,a+0,a+2,a+1,8.5指針與多維數(shù)組,2、指向二維數(shù)組中一行的指針變量,(1)格式:類(lèi)型名(*指針變量名)長(zhǎng)度;(2)例如:int(*pa)4;(3)含義:pa是指針變量,它指向一個(gè)數(shù)組,數(shù)組含有4個(gè)元素,每個(gè)元素的類(lèi)型是int。(4)說(shuō)明:a.與定義int*pa;以及int*pa4;含義不同。b.如果執(zhí)行pa+,則pa實(shí)際增加了多少呢?,pa實(shí)際增加了2*4=8個(gè)字節(jié),8.5指針與多維數(shù)組,c.若定義:inta34,(*pa)4=a;則關(guān)系圖為:,a,pa,(*pa)0(*pa)1(*pa)2(*pa)3,如果執(zhí)行pa+,則變?yōu)槿鐖D所示,pa,pa,第一行各元素還可以表示為,那么(*pa)0、(*pa)1、(*pa)2、(*pa)3也變了,8.5指針與多維數(shù)組,3、幾個(gè)表達(dá)式,由xi*(x+i)和inti,j,*p,(*pa)4;/第一種方法for(pa=aa,i=0;i3;i+)printf(“n”);for(j=0;j4;j+)printf(“%5d”,paij);,8.5指針與多維數(shù)組,/第二種方法for(pa=aa;paaa+3;pa+)printf(“n”);for(j=0;j4;j+)printf(“%5d”,(*pa)j);/第三種方法for(p=,8.5指針與多維數(shù)組,二、通過(guò)指針在函數(shù)間傳遞多維數(shù)組,1、函數(shù)的定義形式,例如:intfunc(intarray4,intn)函數(shù)體;也可以寫(xiě)為:intfunc(int(*pa)4,intn)函數(shù)體;,8.5指針與多維數(shù)組,2、函數(shù)的說(shuō)明形式,如有函數(shù)定義:intfunc(intarray4,intn)函數(shù)體;則對(duì)該函數(shù)的說(shuō)明形式可以寫(xiě)為:intfunc(intarray4,intn);intfunc(int(*pa)4,intn);intfunc(int4,int);intfunc(int(*)4,int);,注意:作為形參定義的數(shù)組名是一個(gè)指針變量,它在函數(shù)體中可以變化,這一點(diǎn)與變量定義時(shí)不同。,8.5指針與多維數(shù)組,例8.12求3行4列二維數(shù)組中的最大元素#includeintmax_value(int(*pa)4,introw);main()staticintaa34=1,3,5,7,2,4,6,8,20,15,32,12;printf(“maxelementis%dn”,max_value(aa,3);intmax_value(int(*pa)4,introw)inti,j,m=pa00;for(i=0;im)m=paij;return(m);,8.5指針與多維數(shù)組,例8.12求3行4列二維數(shù)組中的最大元素(另一種方法)#includeintmax_value(int*p,intn);main()staticintaa34=1,3,5,7,2,4,6,8,20,15,32,12;intmax;max=max_value(,8.6指針數(shù)組與指向指針的指針,一、指針數(shù)組,1、指針數(shù)組的概念,指針數(shù)組是一種特殊的數(shù)組,它每個(gè)元素的類(lèi)型都是指針類(lèi)型(即地址),其它與一般數(shù)組相同。當(dāng)把某個(gè)量的地址放入某元素中后,即可通過(guò)該元素對(duì)相應(yīng)的量進(jìn)行間接訪問(wèn)。,2、指針數(shù)組的定義,類(lèi)型名*指針數(shù)組名常量表達(dá)式;如:int*ap3;char*s10;等等。,8.6指針數(shù)組與指向指針的指針,3、指針數(shù)組的初始化,(1)inta15,a25,a35,*ap3=a1,a2,a3;(2)char*sp=“abc”,“123”,“Hello”;,4、指針數(shù)組的賦值,上面的情況中,可以先定義變量,在進(jìn)行賦值,即(1)inta15,a25,a35,*ap3;ap0=a1;ap1=a2;ap2=a3;(2)char*sp=“abc”,“123”,“Hello”;sp0=“abc”;sp1=“123”;sp2=“Hello”;,例8.13顯示多個(gè)字符串#includemain()staticchar*ap3=“CPU”,“Computer”,“Microprocessor”;inti;for(i=0;imain()staticcharaa315=“CPU”,“Computer”,“Microprocessor”;inti;for(i=0;i=0,8.6指針數(shù)組與指向指針的指針,intgetchoice(char*menu,intn)inti,choice;for(i=0;ib?a:b);intmin(inta,intb)return(ab?a:b);,8.8指向函數(shù)的指針,8.9動(dòng)態(tài)內(nèi)存分配,由變量的作用域和存儲(chǔ)類(lèi)別知道,內(nèi)存變量都有生存期,以前接觸的變量,其內(nèi)存的分配及釋放都是由系統(tǒng)統(tǒng)一管理的。這一節(jié)我們介紹如何實(shí)現(xiàn)自己對(duì)變量空間的申請(qǐng)和釋放。動(dòng)態(tài)內(nèi)存分配可以提高內(nèi)存的使用效率。,1、相關(guān)函數(shù)介紹,1)void*malloc
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 與書(shū)的故事寫(xiě)物作文(15篇)
- 農(nóng)業(yè)生產(chǎn)要素供給合作合同書(shū)
- 醫(yī)療行業(yè)工作表現(xiàn)及職務(wù)證明書(shū)(8篇)
- 音樂(lè)聽(tīng)力考試試題及答案
- 彝語(yǔ)考試試題及答案
- 醫(yī)學(xué)綜合考試試題及答案
- 六一奶茶活動(dòng)方案
- 六一小活動(dòng)策劃方案
- 六一活動(dòng)體驗(yàn)店活動(dòng)方案
- 六一活動(dòng)市內(nèi)活動(dòng)方案
- 自來(lái)水安裝施工合同范例二零二五年
- 安全隱患的課件
- 小區(qū)安全隱患課件
- 國(guó)家安全共同守護(hù)-國(guó)家安全教育日主題班會(huì)課件-2024-2025學(xué)年初中主題班會(huì)課件
- 2025-2030中國(guó)倒裝芯片球柵陣列行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 機(jī)動(dòng)車(chē)環(huán)檢試題及答案
- 羅曼蛋雞飼養(yǎng)管理手冊(cè)
- 學(xué)校德育教育的有效方法研究
- 2025年山西華陽(yáng)新材料科技集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年中考語(yǔ)文文言文古詩(shī)詞默寫(xiě)(含答案)
- 2025年上半年民航醫(yī)學(xué)中心(民航總醫(yī)院)招聘應(yīng)屆畢業(yè)生64人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
評(píng)論
0/150
提交評(píng)論