




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第八章,指針,目錄,8.1指針的概念,8.2指針變量的定義和引用,8.3指針與一維數(shù)組,8.4指針與字符串,8.5指針與多維數(shù)組,8.6指針數(shù)組與指向指針的指針,8.7返回指針值的函數(shù),8.8指向函數(shù)的指針,8.9動態(tài)內(nèi)存分配,8.10本章程序舉例,本章要點(diǎn)小結(jié),本章結(jié)束,8.1指針的概念,指針是C語言的一個重要概念,也是C語言的一個重要特色。深刻理解和正確使用指針是學(xué)習(xí)本章的基本要求。,本章是一個難點(diǎn),也是一個重點(diǎn),初學(xué)者不易掌握。在理解和熟悉基本內(nèi)容的前提下,上機(jī)實(shí)驗(yàn)是必不可少的環(huán)節(jié)。,8.1指針的概念,一、地址,在計算機(jī)中,把內(nèi)存區(qū)劃分為一個一個的存儲單元,每個單元為一個字節(jié)(位),它們都有一個編號,這個編號就是內(nèi)存地址。如下圖所示:,注意:1、程序中定義的每個數(shù)據(jù)在編譯后都占有各自的內(nèi)存區(qū)。2、數(shù)據(jù)所占有的存儲單元個數(shù)是由其類型決定的。3、首地址:第1個單元的地址4、表示地址的數(shù)與整數(shù)的區(qū)別,8.1指針的概念,二、舉例,如有定義:charc=A;inta=3;則所占內(nèi)存情況如下:,注意:c和a的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不用關(guān)心。,8.1指針的概念,三、指針與指針變量,1、指針:簡單地說,指針就是地址。二者是同一個概念的兩種說法。只不過指針更形象一些,就像一個針一樣,可以指向某個地方。,2、指針變量:首先指針變量就是一個變量,和我們以前所講的其它變量沒有本質(zhì)區(qū)別。不同之處在于這種變量中所存放的內(nèi)容是地址。,什么是指針變量呢?我們回憶一下什么叫整型變量,打個比方,8.1指針的概念,四、直接訪問和間接訪問,有兩個上鎖且放著物品的盒子A、B,如果你有A盒子的鑰匙,則可以直接打開A盒子將物品取出;如果你有B盒子的鑰匙,而A盒子的鑰匙在B盒子中,要想取出A盒子中的物品,則必須先打開B盒子,取出A盒子的鑰匙,再打開A盒子將物品取出。上面兩種情況就是直接訪問和間接訪問的概念。,8.1指針的概念,1、直接訪問,通過變量本身對變量進(jìn)行存取的方式,稱為直接訪問。如定義:intx;則x=10;x+=5;等等這種訪問方式只需要變量本身就得到了該變量的全部信息,不需要其它內(nèi)容,是直接的。,8.1指針的概念,2、間接訪問,通過指針變量實(shí)現(xiàn)對變量的訪問方式,稱為間接訪問。首先要定義一個指針變量,然后將一個同類型變量的地址賦給該指針變量(這時我們稱指針變量指向該變量),這樣就可以進(jìn)行間接訪問了。間接訪問的過程是:由指針變量得到變量的地址,根據(jù)該地址找到變量的存儲區(qū),再對該存儲區(qū)的內(nèi)容進(jìn)行存取,從而實(shí)現(xiàn)了對變量的間接訪問。,8.2指針變量的定義和引用,一、指針變量的定義和賦值,1、格式:類型名*指針變量名;,2、舉例int*p1;char*s1,*s2;float*a1,*a2,f;,3、說明a.類型名:指針變量所指向的變量類型。b.*是定義指針變量的標(biāo)志,不可丟掉。c.指針變量定義后,其值是不確定的。,8.2指針變量的定義和引用,4、賦值:可以進(jìn)行初始化,也可以使用賦值語句,(1)、初始化:inta,*s=,(2)、賦值語句inta,*s;s=,(3)、注意:只能用同類型變量的地址進(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ù)組,在語言中,指針與數(shù)組有著密切的關(guān)系。對數(shù)組元素,既可以采用數(shù)組下標(biāo)來引用,也可以通過指向數(shù)組元素的指針來引用。采用指針方法處理數(shù)組,可以產(chǎn)生代碼長度小、運(yùn)行速度快的程序。,8.3指針與一維數(shù)組,一、通過指針訪問一維數(shù)組,1、數(shù)組結(jié)構(gòu)的分析,設(shè)有數(shù)組定義為:inta5;則有:(1)a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1個元素的首地址,它是一個地址常量,其值由系統(tǒng)在編譯時確定,程序運(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的開始,二者產(chǎn)生了聯(lián)系,這樣就可以通過指針變量s訪問數(shù)組a了。,a,或s=圖變?yōu)椋?a,s+=2;效果與上述相同。,8.3指針與一維數(shù)組,當(dāng)一個指針變量指向數(shù)組的首地址后,關(guān)系圖為:,數(shù)組inta5,指向數(shù)組元素的指針,指向數(shù)組元素的訪問,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、幾個表達(dá)式的分析,設(shè)定義:inta3=1,2,3,*s=a;s,*sa,*as+,*s+,a+,*a+*(s+),(*s)+*(a+),(*a)+初始化時的*s=a;與語句*s=a;的不同一個指針變量加/減一個整數(shù)后,指針變量值的變化情況,8.3指針與一維數(shù)組,二、通過指針在函數(shù)間傳遞一維數(shù)組,1、函數(shù)的定義形式,例如:intfunc(intarray,intn)函數(shù)體;也可以寫為:intfunc(int*pointer,intn)函數(shù)體;,8.3指針與一維數(shù)組,2、函數(shù)的說明形式,如有函數(shù)定義:intfunc(intarray,intn)函數(shù)體;則對該函數(shù)的說明形式可以寫為:intfunc(intarray,intn);intfunc(int*array,intn);intfunc(int,int);intfunc(int*,int);,注意:作為形參定義的數(shù)組名是一個指針變量,它在函數(shù)體中可以變化,這一點(diǎn)與變量定義時不同。,8.3指針與一維數(shù)組,例8.7編寫在數(shù)組的最后一個元素中存放其它元素和的函數(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ù)還可寫為:voidsummary(intarr,intn)inti,s=0;for(i=0;in;i+)s+=arri;arrn=s;,8.4指針與字符串,字符串是一種特殊的一維數(shù)組,所以上節(jié)中介紹的方法同樣適用于對字符串的訪問。字符串的特殊性在于:字符串的末尾是結(jié)束標(biāo)志0,所以訪問字符串時常用結(jié)束標(biāo)志進(jìn)行判斷。,8.4指針與字符串,一、通過指針訪問字符串,1、字符串結(jié)構(gòu)的分析,設(shè)有數(shù)組定義為:chars=“abcde”;則s是一個字符數(shù)組,它里面存放的是一個字符串。它在內(nèi)存中占用6個字節(jié),但長度為5。其結(jié)構(gòu)為:,s,s0s1s2s3s4s5,結(jié)束標(biāo)志,8.4指針與字符串,字符串還可以定義為:char*s=“abcde”;它在內(nèi)存中占用6個字節(jié),長度為5。其結(jié)構(gòu)為:,s,s0s1s2s3s4s5,結(jié)束標(biāo)志,8.4指針與字符串,2、用字符數(shù)組與用指針使用字符串的比較,定義及初始化chars=“abcde”;char*p=“abcde”;賦值chars6;char*p;s=“abcde”;/*不對,應(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)指針法#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指針與字符串,二、通過指針在函數(shù)間傳遞字符串,1、函數(shù)的定義形式,例如:charfunc(chara,charb)函數(shù)體;也可以寫為:charfunc(char*a,char*b)函數(shù)體;,8.4指針與字符串,例8.10設(shè)計一函數(shù),實(shí)現(xiàn)與標(biāo)準(zhǔn)函數(shù)strcpy類似的功能。#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ù)類型”的數(shù)據(jù)的順序集合,而數(shù)組本身也是語言的一種數(shù)據(jù)類型,同樣可以作為數(shù)組的元素類型。當(dāng)一個一維數(shù)組的元素類型為數(shù)組時,便構(gòu)成了多維數(shù)組。熟記下面兩組等價式:xi*(x+i)則有:a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1個元素(也是第一行)的首地址,它是一個地址常量,其值由系統(tǒng)在編譯時確定,程序運(yùn)行期間不能改變。該二維數(shù)組可以理解為:它是一個一維數(shù)組,含有3個元素,每個元素又是一個一維數(shù)組,該一維數(shù)組含有4個元素,每個元素是int類型。,8.5指針與多維數(shù)組,二維數(shù)組的邏輯結(jié)構(gòu)圖如下:,a0,a1,a2,a+0,a+2,a+1,8.5指針與多維數(shù)組,2、指向二維數(shù)組中一行的指針變量,(1)格式:類型名(*指針變量名)長度;(2)例如:int(*pa)4;(3)含義:pa是指針變量,它指向一個數(shù)組,數(shù)組含有4個元素,每個元素的類型是int。(4)說明:a.與定義int*pa;以及int*pa4;含義不同。b.如果執(zhí)行pa+,則pa實(shí)際增加了多少呢?,pa實(shí)際增加了2*4=8個字節(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、幾個表達(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ù)組,二、通過指針在函數(shù)間傳遞多維數(shù)組,1、函數(shù)的定義形式,例如:intfunc(intarray4,intn)函數(shù)體;也可以寫為:intfunc(int(*pa)4,intn)函數(shù)體;,8.5指針與多維數(shù)組,2、函數(shù)的說明形式,如有函數(shù)定義:intfunc(intarray4,intn)函數(shù)體;則對該函數(shù)的說明形式可以寫為:intfunc(intarray4,intn);intfunc(int(*pa)4,intn);intfunc(int4,int);intfunc(int(*)4,int);,注意:作為形參定義的數(shù)組名是一個指針變量,它在函數(shù)體中可以變化,這一點(diǎn)與變量定義時不同。,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ù)組,它每個元素的類型都是指針類型(即地址),其它與一般數(shù)組相同。當(dāng)把某個量的地址放入某元素中后,即可通過該元素對相應(yīng)的量進(jìn)行間接訪問。,2、指針數(shù)組的定義,類型名*指針數(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顯示多個字符串#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動態(tài)內(nèi)存分配,由變量的作用域和存儲類別知道,內(nèi)存變量都有生存期,以前接觸的變量,其內(nèi)存的分配及釋放都是由系統(tǒng)統(tǒng)一管理的。這一節(jié)我們介紹如何實(shí)現(xiàn)自己對變量空間的申請和釋放。動態(tài)內(nèi)存分配可以提高內(nèi)存的使用效率。,1、相關(guān)函數(shù)介紹,1)void*malloc
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育場地設(shè)施使用壽命預(yù)測考核試卷
- 云安全第三方監(jiān)管政策考核試卷
- 風(fēng)險管理與企業(yè)創(chuàng)新能力考核試卷
- 線上線下銷售渠道對市場份額的影響考核試卷
- 兒童節(jié)活動總結(jié)
- 書香節(jié)活動總結(jié)(13篇)
- 鄉(xiāng)鎮(zhèn)安全生產(chǎn)年度工作總結(jié)(15篇)
- 會計專業(yè)考試初級會計實(shí)務(wù)試卷及答案指導(dǎo)
- 夢想助學(xué)活動方案
- 水果涂色活動方案
- 直流屏培訓(xùn)課件
- 2024屆江蘇省南京市燕子磯中學(xué)化學(xué)高一第二學(xué)期期末聯(lián)考試題含解析
- 醫(yī)養(yǎng)結(jié)合康復(fù)中心項目可行性研究報告
- 員工身心健康情況排查表
- 金融科技相關(guān)項目實(shí)施方案
- 基于STC89C52的智能煙霧檢測報警系統(tǒng)論文
- 危險化學(xué)品安全管理課件
- 23秋國家開放大學(xué)《液壓氣動技術(shù)》形考任務(wù)1-3參考答案
- 機(jī)械制造工藝學(xué)課程設(shè)計-張緊輪支架
- 21ZJ111 變形縫建筑構(gòu)造
- 暨南大學(xué)視聽說聽力材料part 2 A文章
評論
0/150
提交評論