版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
西安電子科技大學(xué)計(jì)算機(jī)學(xué)院1目前的知識(shí)不能解決的問題動(dòng)態(tài)存儲(chǔ)管理函數(shù)通過return語句返回多個(gè)數(shù)據(jù)一些復(fù)雜數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)鏈表樹圖西安電子科技大學(xué)計(jì)算機(jī)學(xué)院2地址與指針程序執(zhí)行原理圖...加載器外存CPU操作系統(tǒng)內(nèi)存程序數(shù)據(jù)數(shù)據(jù)對(duì)象在生存期間都有存儲(chǔ)位置,占據(jù)一定數(shù)量的存儲(chǔ)單元存儲(chǔ)位置就是內(nèi)存地址存儲(chǔ)單元的內(nèi)容就是數(shù)據(jù)對(duì)象的值西安電子科技大學(xué)計(jì)算機(jī)學(xué)院3地址與指針如果把地址值也當(dāng)作一種數(shù)據(jù),存儲(chǔ)地址值的變量就是指針變量,簡(jiǎn)稱指針變量p的值(0x2000)變量x的值(5)指針變量p(地址0x1000)整數(shù)變量x(地址0x2000)內(nèi)存...intx=5;int*p=&x;西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4指針就是內(nèi)存地址指針沒有類型,但指針指向的對(duì)象具有類型[注]無論指針變量指向什么類型的變量,指針自身只占據(jù)4個(gè)字節(jié)(32位系統(tǒng))的內(nèi)存單元地址與指針注:通常會(huì)把指針指向的對(duì)象的類型稱為指針的類型西安電子科技大學(xué)計(jì)算機(jī)學(xué)院5地址與指針指針的相關(guān)操作指針賦值:將程序?qū)ο蟮牡刂反嫒胫羔樧兞块g接訪問:通過指針變量存儲(chǔ)的地址訪問該地址對(duì)應(yīng)的對(duì)象西安電子科技大學(xué)計(jì)算機(jī)學(xué)院6主要內(nèi)容10.1指針變量的定義和使用10.2指針的相關(guān)問題10.3指針作為函數(shù)參數(shù)10.4指針與數(shù)組10.5指針數(shù)組西安電子科技大學(xué)計(jì)算機(jī)學(xué)院710.1指針變量的定義和使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院8定義指針變量語法:目標(biāo)數(shù)據(jù)對(duì)象類型:指針指向的數(shù)據(jù)對(duì)象的類型,用于確定指針指向的對(duì)象占據(jù)多少存儲(chǔ)單元指針變量名稱:任何合法標(biāo)識(shí)符表示定義的是指針變量int*p,*q,n;//p和q是指針變量,n是普通整型變量char*s,ch;//s是指針變量,ch是普通字符變量目標(biāo)數(shù)據(jù)對(duì)象類型*
指針變量名稱;西安電子科技大學(xué)計(jì)算機(jī)學(xué)院9指針變量賦值將程序?qū)ο蟮牡刂反嫒胫羔樧兞?,通過取地址運(yùn)算符(&)可取得程序?qū)ο蟮牡刂穒nt*p,*q,n=10;p=&n;q=p;???p10n(&n為0x12F0)???q0x12F0p10n???qp0x12F010n0x12F0q西安電子科技大學(xué)計(jì)算機(jī)學(xué)院10指針變量賦值int*p,a[10];p=&a[1];???pa[0]a[1]a[9]…&優(yōu)先級(jí)和其他一元運(yùn)算符相同,從右向左結(jié)合pa[0]a[1]a[9]…間接訪問(pointer1.c)訪問指針指向的對(duì)象獲取指針?biāo)赶驅(qū)ο蟮闹翟L問方法:*指針變量?jī)?yōu)先級(jí)和其他一元運(yùn)算符相同,從右向左結(jié)合間接訪問(pointer1.c)int*p,*q,n=10,m,a[10];p=&n;q=p;m=*p+*q*n;++*p;(*p)++;*p+=*q+n;q=&a[0];*q=*p/12;p10nqm=n+n*n=110;//m=110++n;
//n=11n++;
//n=12n+=n+n;
//n=36a[0]=n/12;
//a[0]=3a[0]a[1]a[9]…m西安電子科技大學(xué)計(jì)算機(jī)學(xué)院13間接訪問間接訪問的過程(pointer2.c)step1.通過指針的值(地址)找到對(duì)應(yīng)的內(nèi)存單元step2.通過指針的類型確定數(shù)據(jù)占據(jù)多少內(nèi)存單元step3.將找到的內(nèi)存單元內(nèi)存儲(chǔ)的數(shù)據(jù)按照指針的類型轉(zhuǎn)換為相應(yīng)數(shù)據(jù)int*p,n=0x00000130;char*q;p=&n;q=p;printf("%d%c",*p,*q);//???30010000npq西安電子科技大學(xué)計(jì)算機(jī)學(xué)院1410.2指針的相關(guān)問題西安電子科技大學(xué)計(jì)算機(jī)學(xué)院15野指針指針在未初始化時(shí)指向哪里不確定,不能用*間接引用指針指向的對(duì)象,這樣的指針稱為野指針int*p;*p=2;printf("%d",*p);編譯時(shí)警告p未初始化,執(zhí)行時(shí)出錯(cuò)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院16另一種類型的野指針intn=10,*p=&n;假設(shè)n存儲(chǔ)在地址為0x1000的內(nèi)存單元p0x100010np0x100017n*p=17;p=17;p1717n地址為17的存儲(chǔ)單元???西安電子科技大學(xué)計(jì)算機(jī)學(xué)院17空指針(NULL)定義指針變量時(shí)如果暫時(shí)不知道要指向哪里,應(yīng)該先給指針變量賦予空指針NULL(數(shù)值0),表示哪里也不指向當(dāng)指針變量被賦予空指針,不能用*間接引用指針指向的對(duì)象int*q=NULL;*q=2;printf(“%d”,*q);編譯器不會(huì)警告,執(zhí)行時(shí)出錯(cuò)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院18通用指針與指針類型轉(zhuǎn)換(pointer3.c)通用指針指向的對(duì)象類型不確定,此時(shí)用void作為指針的類型可以把任何類型的指針賦值給通用類型指針通用類型指針不能夠用*運(yùn)算符間接引用被指對(duì)象。void*gp;intn=10,*p=&n;floatf=2.5;void*gp1=p,*gp2=&f;intn=10;floatf=2.5;void*gp1=&n,*gp2=&f;printf("%d%f",*gp1,*gp2);//編譯錯(cuò)誤西安電子科技大學(xué)計(jì)算機(jī)學(xué)院19通用指針與指針類型轉(zhuǎn)換為了訪問通用指針指向的對(duì)象需要進(jìn)行指針類型轉(zhuǎn)換轉(zhuǎn)換方法:(類型*)通用指針intn=10,*p1;floatf=2.5,*p2;void*gp1=&n,*gp2=&f;p1=(int*)gp1;p2=(float*)gp2;printf("%d%f",*p1,*p2);//正確西安電子科技大學(xué)計(jì)算機(jī)學(xué)院20通用指針與指針類型轉(zhuǎn)換為了訪問通用指針指向的對(duì)象需要進(jìn)行指針類型轉(zhuǎn)換轉(zhuǎn)換方法:(類型*)通用指針intn=10,*p1;floatf=2.5,*p2;void*gp1=&n,*gp2=&f;p1=(int*)gp2;p2=(float*)gp1;printf("%d%f",*p1,*p2);//運(yùn)行結(jié)果不正確一個(gè)通用指針可以轉(zhuǎn)換為任何類型的指針,但是否具有正確的意義,取決于該指針實(shí)際指向的數(shù)據(jù)類型西安電子科技大學(xué)計(jì)算機(jī)學(xué)院2110.3指針作為函數(shù)參數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院22函數(shù)調(diào)用時(shí)實(shí)參按值傳遞voidswap(intx,inty){intt;
}intmain(){inta=5,b=3;
printf("a=%d;b=%d\n",a,b);swap(a,b);printf("a=%d;b=%d\n",a,b);return0;}swap函數(shù)數(shù)據(jù)區(qū)53xymain函數(shù)數(shù)據(jù)區(qū)53abswap函數(shù)數(shù)據(jù)區(qū)main函數(shù)數(shù)據(jù)區(qū)53ab35xy
t=x;x=y;y=t;執(zhí)行前執(zhí)行后西安電子科技大學(xué)計(jì)算機(jī)學(xué)院23如果參數(shù)傳遞的值是變量地址voidswap(int*x,int*y){intt;
}intmain(){inta=5,b=3;
printf("a=%d;b=%d\n",a,b);
swap(&a,&b);printf("a=%d;b=%d\n",a,b);return0;}
t=*x;*x=*y;*y=t;執(zhí)行前執(zhí)行后swap函數(shù)數(shù)據(jù)區(qū)xymain函數(shù)數(shù)據(jù)區(qū)53abswap函數(shù)數(shù)據(jù)區(qū)main函數(shù)數(shù)據(jù)區(qū)35abxy西安電子科技大學(xué)計(jì)算機(jī)學(xué)院24指針作為函數(shù)參數(shù)示例用一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)除法,要求返回整除的商和余數(shù)用return語句不能返回兩個(gè)值用參數(shù)返回值,參數(shù)必須是指針形式voiddivision(intx,inty,
int*qp,int*rp){
*qp=x/y;*rp=x%y;}intmain(){intq,r;
division(40,3,&q,&r);
printf(“40/3yield");printf("quotient=%d",q);printf("remainder=%d\n",r);return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院25指針作為函數(shù)參數(shù)的常見錯(cuò)誤voidswap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}intmain(){intp,n;scanf(“%d”,n);scanf(“%d”,p);swap(p,&n);return0;}n和p的值會(huì)被當(dāng)作地址傳入函數(shù),但由于n和p的值不確定,因此函數(shù)調(diào)用可能出錯(cuò),即使不出錯(cuò),輸入的值也不會(huì)保存在n和p中西安電子科技大學(xué)計(jì)算機(jī)學(xué)院2610.4指針與數(shù)組西安電子科技大學(xué)計(jì)算機(jī)學(xué)院27數(shù)組在內(nèi)存中的實(shí)現(xiàn)數(shù)組名是一個(gè)內(nèi)存地址,稱為數(shù)組首地址數(shù)組元素從首地址開始連續(xù)存放訪問數(shù)組元素的方法:數(shù)組名[下標(biāo)]inta[4];????0x10000x10040x10080x100C地址數(shù)組元素通過數(shù)組名和下標(biāo)引用數(shù)組元素的本質(zhì)是:&a[i]=a
+i×sizeof(a[0])既然數(shù)組名是內(nèi)存地址,就可以用一個(gè)指針變量來表示28指向數(shù)組元素的指針數(shù)組元素是一個(gè)普通變量,具有唯一地址與數(shù)組同類型的指針變量可以指向數(shù)組的任一元素int*p1,*p2,*p3,*p4;inta[10]={0,1,2,3,4,5,6,7,8,9};p1=&a[0];p2=p1;p3=&a[5];p4=&a[10];0a[0]159……?a[1]a[5]a[9]a[10]p1p2p3p4等價(jià)于p1=a;29指針運(yùn)算1.指針和數(shù)值n(變量、常量)的加減法前提:指針變量指向數(shù)組中的某個(gè)元素意義:表示將指針向前或向后移動(dòng)n個(gè)元素inta[10]={0,1,2,3,4,5,6,7,8,9};int*p1=a,*p2;p1+=2;*p1=5;*(p1+6)=0;p2=p1+3;p2--;p1指向a[2]給a[2]賦值給a[8]賦值p2指向a[5]p2指向a[4]p1指向a[0]指針不指向數(shù)組時(shí)沒有任何意義30指針運(yùn)算2.兩個(gè)指針變量相減前提:兩個(gè)指針變量指向同一個(gè)數(shù)組意義:得到兩個(gè)指針之間的元素個(gè)數(shù)inta[10]={0,1,2,3,4,5,6,7,8,9};int*p1=a,*p2;intn;p2=&a[5];n=p2-p1;p1++;n=p1-p2;p2指向a[5]n=5兩個(gè)指針變量相加沒有任何意義n=-4p1指向a[1]p1指向a[0]31指針運(yùn)算3.兩個(gè)指針變量比較大小前提:兩個(gè)指針變量指向同一個(gè)數(shù)組意義:得到兩個(gè)指針之間的位置關(guān)系inta[10];int*p1=a,*p2=&a[10];inti=0;while(p1<p2
){
*p1=i;p1++;i++;}兩個(gè)指針變量不在同一數(shù)組,比較沒有任何意義p1指向a[0],p2指向a[10]通過指針p1依次給a的每個(gè)元素賦值i,循環(huán)結(jié)束條件是p1指向最后一個(gè)元素之后32指針運(yùn)算4.對(duì)指針變量使用下標(biāo)前提:指針變量指向數(shù)組意義:得到對(duì)應(yīng)數(shù)組元素inta[10];int*p1=a;inti=0;for(i=0;i<10;i++){
p1[i]=i;}指針變量不指向數(shù)組時(shí)沒有任何意義p1指向a[0]通過指針p1依次給a的每個(gè)元素賦值i,循環(huán)結(jié)束條件是i不超出數(shù)組元素個(gè)數(shù)p1[i]=p1
+i×sizeof(a[0])西安電子科技大學(xué)計(jì)算機(jī)學(xué)院33訪問數(shù)組元素的幾種模式inta[10];inti;for(i=0;i<10;i++){
a[i]=i;}inta[10];int*p1,*p2;for(p1=a,p2=a+10;p1<p2;p1++){
*p1=i;}inta[10];int*p1,*p2;for(p1=a,p2=a;p1-p2<10;p1++){
*p1=i;}inta[10];int*p1;for(p1=a;p1<a+10;p1++){
*p1=i;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院34取值運(yùn)算符(*)和遞增運(yùn)算符(++)混合使用*和++優(yōu)先級(jí)相同*和++都是右結(jié)合++有前綴和后綴兩種形式前綴方式先自增再取值參與運(yùn)算后綴方式先取值參與運(yùn)算再自增取值運(yùn)算符(*)和遞增運(yùn)算符(++)混合使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院35inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a,n;n=*p++;n=*++p;++*p;n=*p;p++;++p;n=*p;a[2]++;n=a[0]p指向a[1]p指向a[2]n=a[2]36數(shù)組參數(shù)與指針數(shù)組作為函數(shù)形式參數(shù)時(shí),實(shí)際是以指針的形式實(shí)現(xiàn)doubleaverage(
doublea[],intn){doublesum=0.0;inti;for(i=0;i<n;i++)sum+=a[i];returnsum/n;}doubleaverage(
double*a,intn){doublesum=0.0;inti;for(i=0;i<n;i++)sum+=a[i];returnsum/n;}intmain(){intb[20]={…}
average(b,20);return0;}傳遞的是數(shù)組首地址只對(duì)b[5]-b[10]求平均值如何處理??西安電子科技大學(xué)計(jì)算機(jī)學(xué)院37數(shù)組參數(shù)與指針doubleaverage(
doublea[],intn){doublesum=0.0;inti;for(i=0;i<n;i++)sum+=a[i];returnsum/n;}doubleaverage(
double*a,intn){doublesum=0.0;inti;for(i=0;i<n;i++)sum+=a[i];returnsum/n;}intmain(){intb[20]={…}
average(b+5,5);return0;}傳遞的是元素b[5]的地址西安電子科技大學(xué)計(jì)算機(jī)學(xué)院38示例1:用指針實(shí)現(xiàn)求字符串長(zhǎng)度的函數(shù)intstrlen(char*s
){intn=0;while(*s!='\0'){++s;++n;}returnn;}intstrlen(char*s){char*p=s;while(*p!='\0')++p;returnp-s;}intmain(){chars1[]="hello,world!",*ps=s1;intlen;len=strlen(s1);len=strlen(ps);len=strlen("clanguage");return0;}調(diào)用以字符指針為形式參數(shù)的函數(shù),實(shí)參可以是字符串常量字符數(shù)組(其中應(yīng)存著字符串)指向字符串的指針西安電子科技大學(xué)計(jì)算機(jī)學(xué)院39示例2:用指針實(shí)現(xiàn)復(fù)制字符串的函數(shù)voidstrcpy(char*s,constchar*t){while((*s=*t)!='\0'
){s++;t++;}}voidstrcpy(char*s,constchar*t){while(*s=*t){s++;t++;}}voidstrcpy(char*s,constchar*t){while(*s++=*t++);}注意:運(yùn)算符的優(yōu)先級(jí)與結(jié)合順序增量運(yùn)算的作用與計(jì)算出的值賦值表達(dá)式的值西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4010.5指針數(shù)組假設(shè)一個(gè)班有100人,每個(gè)人的姓名不超過20個(gè)字符,如何表示所有人的姓名?方法1:二維數(shù)組charnames[100][20];每個(gè)人的名字長(zhǎng)度限定為不超過20個(gè)字符方法2:一維指針數(shù)組char*names[100]每個(gè)人的名字長(zhǎng)度不固定…………names[0]names[1]names[99]20個(gè)連續(xù)字符names[0]names[1]names[99]…LimingLiuxiaodongWangpeng西安電子科技大學(xué)計(jì)算機(jī)學(xué)院42二維數(shù)組與一維指針數(shù)組的區(qū)別二維數(shù)組的所有元素在內(nèi)存中連續(xù)存放,要求一塊較大的連續(xù)內(nèi)存(行數(shù)×列數(shù))一維指針數(shù)組各個(gè)元素(指針)連續(xù)存放,但元素(指針)指向的內(nèi)存區(qū)地址并不連續(xù),只需要一塊能連續(xù)存放元素(指針)的內(nèi)存(行數(shù))西安電子科技大學(xué)計(jì)算機(jī)學(xué)院43二維數(shù)組與一維指針數(shù)組的區(qū)別//以下為程序片段charnames1[100][20]={"Liming","Liuxiaodong",…};char*names2[100]={"Liming","Zhangxitong",…};inti=0;for(i=0;i<5;i++)printf("addressofnames1[
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《聲和超聲》課件
- 杭州市住宅小區(qū)前期物業(yè)服務(wù)合同模板
- 工程造價(jià)專用合同條款
- 《氨基丁酸養(yǎng)生的》課件
- 2025年陜西貨運(yùn)從業(yè)資格證考試模擬試題
- 2025年博爾塔拉貨運(yùn)從業(yè)資格證考試技巧
- 2025年拉薩貨運(yùn)從業(yè)資格證模擬考試題下載
- 2025年東莞貨運(yùn)從業(yè)資格考試
- 《民事案例實(shí)例分析》課件
- 文化產(chǎn)業(yè)招投標(biāo)合同管理要點(diǎn)
- 高等數(shù)學(xué)教程 上冊(cè) 第4版 測(cè)試題及答案 共4套
- 太陽能路燈維護(hù)與保養(yǎng)方案
- 華南理工大學(xué)《自然語言處理》2023-2024學(xué)年期末試卷
- 照明設(shè)備課件教學(xué)課件
- 人生苦與樂課件
- 中國(guó)高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 堆載預(yù)壓施工方案
- 2024巡察整改方案和整改措施
- 醫(yī)院冬季防雪防凍工作應(yīng)急預(yù)案
- 2024年公共管理學(xué)考試題庫(kù)及答案
- 借用資質(zhì)簽合同模板
評(píng)論
0/150
提交評(píng)論