C語言程序設(shè)計(jì)第四版-8-譚浩強(qiáng)課件_第1頁(yè)
C語言程序設(shè)計(jì)第四版-8-譚浩強(qiáng)課件_第2頁(yè)
C語言程序設(shè)計(jì)第四版-8-譚浩強(qiáng)課件_第3頁(yè)
C語言程序設(shè)計(jì)第四版-8-譚浩強(qiáng)課件_第4頁(yè)
C語言程序設(shè)計(jì)第四版-8-譚浩強(qiáng)課件_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章指針第8章指針1指針是C語言的一個(gè)重要特色;正確而靈活地運(yùn)用指針可以:有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能獲得1個(gè)以上的結(jié)果;能直接處理內(nèi)存單元的地址可以使程序簡(jiǎn)潔、緊湊、高效關(guān)于指針指針是C語言的一個(gè)重要特色;關(guān)于指針2由內(nèi)存單元組成,每個(gè)單元有地址,存放一字節(jié)數(shù)據(jù)內(nèi)存儲(chǔ)器000000011111010013A613A513A7shortinta;變量aa=500;內(nèi)存地址是二進(jìn)制數(shù),通常寫成十六進(jìn)制由內(nèi)存單元組成,每個(gè)單元有地址,存放一字節(jié)數(shù)據(jù)內(nèi)存儲(chǔ)3內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)計(jì)算機(jī)內(nèi)存由大量存儲(chǔ)單元

(memoryunit)組成。每個(gè)存儲(chǔ)單元容量為1字節(jié)(byte)。每個(gè)存儲(chǔ)單元有編號(hào),即存儲(chǔ)單元的“地址”(address)。存儲(chǔ)單元中可存放數(shù)據(jù)(data)。內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)計(jì)算機(jī)內(nèi)存由大量存儲(chǔ)4變量的地址定義變量時(shí),系統(tǒng)分配給變量的內(nèi)存單元的起始地址

變量值的存取通過變量在內(nèi)存中的地址進(jìn)行變量的地址稱為“指針”(pointer)變量的地址定義變量時(shí),系統(tǒng)分配給變量的內(nèi)存單元的起始5(1)直接訪問──直接利用變量的地址進(jìn)行存取

例:shortinta;//分配內(nèi)存地址a=500;

在符號(hào)表中檢索變量名a,找到其起始地址(例如13A6);將數(shù)值500(的二進(jìn)制形式)送到內(nèi)存單元13A6和13A7中變量的訪問方式(1)直接訪問──直接利用變量的地址進(jìn)行存取變量的訪問方式6(2)間接訪問──通過指針變量訪問變量地址定義一種特殊的變量,用來存放其它變量的地址(指針),這種變量稱為指針變量,它指向一個(gè)普通的變量。變量的訪問方式(2)間接訪問──通過指針變量訪問變量地址變量的訪問方式7指針變量的定義和調(diào)用inta;int

*a_pointer;a=500;a_pointer=&a;printf("%d\n",*a_pointer);printf("%x\n",a_pointer);*a_pointer=3;定義一個(gè)指針變量它指向一個(gè)整型變量(基類型)給指針變量賦值指針變量的值是另一個(gè)變量的地址指針變量所指向的變量即a的值指針變量的值,即a的地址對(duì)指向的變量(即a)賦值例:73頁(yè)輸出格式指針變量的定義和調(diào)用inta;定義一個(gè)指針變量它指向一個(gè)整8兩個(gè)指針變量交換了它們的值,也就是交換了指向intmain(){intn1,n2;int*n1_p=&n1,*n2_p=&n2,*pointer;printf("Inputn1:");scanf("%d",n1_p);printf("Inputn2:");scanf("%d",n2_p);printf("n1=%d,n2=%d\n",n1,n2);printf("*n1_p=%d,*n2_p=%d\n",*n1_p,*n2_p);printf("n1_p=%o,n2_p=%o\n",n1_p,n2_p);pointer=n1_p;n1_p=n2_p;n2_p=pointer;printf("n1=%d,n2=%d\n",n1,n2);printf("*n1_p=%d,*n2_p=%d\n",*n1_p,*n2_p);printf("n1_p=%o,n2_p=%o\n",n1_p,n2_p);}例.分析以下程序運(yùn)行結(jié)果兩個(gè)指針變量交換了它們的值,也就是交換了指向intmain9開始時(shí)指針變量n1_p指向n1,指針變量n2_p指向n2。變量n1和n2的值并沒有改變,但n1_p和n2_p的值改變了,也就是指向改變了。指針變量n1_p指向n2,指針變量n2_p指向n1。上頁(yè)代碼要點(diǎn)開始時(shí)指針變量n1_p指向n1,指針變量n2_p指向n2。上10內(nèi)存內(nèi)存單元內(nèi)存單元的地址變量的首地址指針指針變量指針變量的指向直接訪問與間接訪問掌握幾個(gè)重要概念區(qū)別兩個(gè)*pint*p;p=&a;*p=3;內(nèi)存掌握幾個(gè)重要概念區(qū)別兩個(gè)*p11指針變量的重要作用之一

——作為函數(shù)的參數(shù),實(shí)現(xiàn)地址傳遞指針變量的重要作用之一

——作為函數(shù)的參數(shù),實(shí)現(xiàn)地址傳遞12intmain(){voidswap(intp1,intp2);inta,b;scanf("%d,%d",&a,&b);if(a<b)swap(a,b);printf("%d,%d\n",a,b);return0;}例函數(shù)調(diào)用中的值傳遞voidswap(intp1,intp2){intp;p=p1;p1=p2;p2=p;}運(yùn)行結(jié)果:a,b沒有交換。原因:C語言中,實(shí)參向形參傳遞數(shù)據(jù)采用“值傳遞”,形參單獨(dú)占用內(nèi)存單元,交換對(duì)實(shí)參無影響。intmain()例函數(shù)調(diào)用中的值傳遞voidswa13voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}例通過指針變量實(shí)現(xiàn)地址傳遞的效果注意這兩個(gè)*p1的含義不同,前者說明p1為指針變量,后者表示p1所指向的變量。intmain(){voidswap(int*p1,int*p2);inta,b;int*a_p=&a,*b_p=&b;scanf("%d,%d",&a,&b);if(a<b)swap(a_p,b_p);printf("%d,%d\n",a,b);return0;}p是普通的變量voidswap(int*p1,int*p2)例通過14指針變量作為函數(shù)的參數(shù)指針作實(shí)參,對(duì)應(yīng)的形參是指針變量。C語言的參數(shù)傳遞是“值傳遞”。指針變量做參數(shù)時(shí),由于其值為變量的地址,產(chǎn)生“地址傳遞”的效果。數(shù)組做函數(shù)的參數(shù)時(shí),也是“地址傳遞”。被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。指針變量作為函數(shù)的參數(shù)指針作實(shí)參,對(duì)應(yīng)的形參是指針變量。15指針變量閱讀例8.2-例8.5,上機(jī)調(diào)試,觀察結(jié)果,分析掌握。要求能夠熟練地掌握指針變量及其指向的變化過程,能夠在紙上畫圖表達(dá)分析過程。指針變量閱讀例8.2-例8.5,上機(jī)調(diào)試,觀察結(jié)果,分析掌握16訪問數(shù)組——指針的又一重要用途shortinta[3];200020022004a[0]a[1]a[2]元素的地址數(shù)組元素元素的值0000000000000110a[2]=6;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx元素的地址數(shù)組的首地址訪問數(shù)組——指針的又一重要用途shortinta[3];17數(shù)組和指針的相關(guān)概念數(shù)組的指針:數(shù)組在內(nèi)存中的起始地址,即首元素(下標(biāo)為0的元素)的首地址數(shù)組元素的指針:數(shù)組元素在內(nèi)存中的起始地址數(shù)組名:代表數(shù)組首元素的地址(指針)指向數(shù)組的指針變量:存儲(chǔ)數(shù)組某個(gè)元素的地址,即指向某個(gè)元素?cái)?shù)組和指針的相關(guān)概念數(shù)組的指針:數(shù)組在內(nèi)存中的起始地址,即首18定義指向數(shù)組的指針變量intarray[5],*pointer=array;intarray[5],*pointer;pointer=array;intarray[5],*pointer=&array[0];

使用指針訪問數(shù)組元素,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。定義指向數(shù)組的指針變量intarray[5],*po19通過指針引用數(shù)組元素例intmain(){inta[5]={12,6,18,23,9};int*p;p=a;printf("%d,%x\n",*p,p);

printf("%d,%x\n",*(p+2),p+2);p++;printf("%d,%x\n",*p,p);p=p+2;printf("%d,%x\n",*p,p);return0;}通過指針引用數(shù)組元素例intmain()20通過指針引用數(shù)組元素對(duì)于數(shù)組a和指向該數(shù)組首元素的指針變量pp+i和a+i均表示元素a[i]的地址*(p+i),*(a+i),a[i]均表示元素a[i]的值p+1的含義是指向下一個(gè)元素地址可以p++,不能a++——首元素地址不能改變注意區(qū)別*p++(等價(jià)于*(p++)),*(++p)和(*p)++(P.236-237)若定義數(shù)組a[5]和指針變量*p=a,則a[6]等價(jià)于p+6,指針指向數(shù)組之后的地址,故不報(bào)錯(cuò)參見P.378運(yùn)算符的優(yōu)先級(jí)與結(jié)合性通過指針引用數(shù)組元素對(duì)于數(shù)組a和指向該數(shù)組首元素的指針變量p21通過指針引用數(shù)組元素例教材P.233-234例8.6三種表達(dá)方式P.235例8.7——不能達(dá)到目的通過指針引用數(shù)組元素例22數(shù)組名作為函數(shù)的參數(shù)進(jìn)一步分析——用指針訪問數(shù)組

實(shí)參形參數(shù)組名數(shù)組名數(shù)組名指針變量指針變量指針變量指針變量數(shù)組名數(shù)組名指針變量數(shù)組名作為函數(shù)的參數(shù)進(jìn)一步分析——用指針訪問數(shù)組實(shí)參23數(shù)組名作為函數(shù)的參數(shù)—以指針表示P.239例8.8數(shù)組元素逆序排列

——形參:數(shù)組名;實(shí)參:數(shù)組名P.241例8.8程序修改

——形參:指針變量P.242例8.9數(shù)組元素逆序排列

——形參:指針變量;實(shí)參:指針變量P.244例8.10選擇排序

——形參:數(shù)組;實(shí)參:指針變量P.245例8.10函數(shù)修改

——形參:指針變量數(shù)組名作為函數(shù)的參數(shù)—以指針表示P.239例8.8數(shù)組元24多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a<=>&a[0][0]<=>a[0]a+1<=>&a[1][0]<=>a[1]a+2<=>&a[2][0]<=>a[2]二維數(shù)組的行指針:以二維數(shù)組名表示多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[325多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二維數(shù)組的行指針:以二維數(shù)組名表示int*p=a;p=a+1;p=a+2;p=>a[0][0]p=>a[1][0]p=>a[2][0]多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[326多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]<=>&a[0][0]a[0]+1<=>&a[0][1]a[1]+2<=>&a[1][2]a[0]+5<=>&a[1][1]二維數(shù)組的列指針:以一維數(shù)組名表示多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[327多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二維數(shù)組的列指針:以指針變量表示int*p;p=a;p++;p=p+5;p=>a[0][0]p=>a[0][1]p=>a[1][2]多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[328通過指針引用字符串字符串是在內(nèi)存中連續(xù)存放的一組字符以變量形式保存字符串需要聲明字符數(shù)組或聲明一個(gè)指針變量訪問字符串或字符數(shù)組(P.257圖8.28)——不是字符串變量char*string;string="Workhard!";printf("%s\n",string);printf("%c\n",*string++);printf("%c\n",*(string+5));printf("%s\n",string);++在后,先取p值,再++,p用于*p請(qǐng)對(duì)照*(++p)通過指針引用字符串字符串是在內(nèi)存中連續(xù)存放的一組字符char29通過指針引用字符串P.255例8.16使用字符數(shù)組存放字符串

使用字符數(shù)組名輸出字符串使用字符數(shù)組下標(biāo)訪問數(shù)組元素通過指針引用字符串P.255例8.1630通過指針引用字符串P.256例8.17使用基類型為字符的指針變量保存字符串首元素地址,從而訪問字符串

char*p="China";printf("%s",p);P.256例8.18數(shù)組名指針的應(yīng)用(字符型)P.256例8.19指針變量訪問字符型數(shù)組相當(dāng)于char*p;p="China";而不是char*p;*p="China";通過指針引用字符串P.256例8.17使用基類型為字符31通過指針引用字符串字符指針作函數(shù)參數(shù)

實(shí)參形參數(shù)組名數(shù)組名數(shù)組名指針變量指針變量指針變量指針變量數(shù)組名P.259-263例8.20各種不同的表達(dá)方式8.4.3節(jié)分析一些容易發(fā)生的錯(cuò)誤通過指針引用字符串字符指針作函數(shù)參數(shù)實(shí)參32指向函數(shù)的指針——指向函數(shù)代碼的起始地址。若聲明一個(gè)指針變量存放該地址,則可通過此指針變量來調(diào)用該函數(shù)。例:P.267改寫的代碼作用:可用同樣的語句調(diào)用不同函數(shù)定義一個(gè)以指向函數(shù)的指針變量作為形參的函數(shù),可寫出復(fù)雜程序(P.271例8.24和P.273分析)指向函數(shù)的指針——指向函數(shù)代碼的起始地址。33返回指針值的函數(shù)一個(gè)函數(shù),其運(yùn)算結(jié)果和返回值是指針值P.274例8.25P.275例8.26返回指針值的函數(shù)一個(gè)函數(shù),其運(yùn)算結(jié)果和返回值是指針值34指針數(shù)組和多重指針指針數(shù)組是存放指針數(shù)據(jù)的數(shù)組指向上述數(shù)組的指針——指向指針數(shù)據(jù)的指針在操作系統(tǒng)下調(diào)用C語言程序時(shí),如果要向C程序傳遞數(shù)據(jù),可使用帶參數(shù)的main函數(shù),其形參是指針數(shù)組指針數(shù)組和多重指針指針數(shù)組是存放指針數(shù)據(jù)的數(shù)組35動(dòng)態(tài)內(nèi)存分配與指向它的指針變量

關(guān)于內(nèi)存地址分配,參見7.9節(jié)。全局變量/靜態(tài)變量:保存在靜態(tài)存儲(chǔ)區(qū)。聲明時(shí)分配存儲(chǔ)空間,文件運(yùn)行結(jié)束時(shí)釋放。自動(dòng)變量:聲明時(shí)動(dòng)態(tài)地分配存儲(chǔ)空間,函數(shù)運(yùn)行結(jié)束時(shí)釋放。——棧存儲(chǔ)區(qū)一些臨時(shí)數(shù)據(jù)可在使用時(shí)動(dòng)態(tài)地分配存儲(chǔ)單元,使用結(jié)束立即釋放?!汛鎯?chǔ)區(qū),只能用指針訪問。動(dòng)態(tài)內(nèi)存分配與指向它的指針變量關(guān)于內(nèi)存地址分配,參見7.936動(dòng)態(tài)內(nèi)存分配與指向它的指針變量

內(nèi)存動(dòng)態(tài)分配庫(kù)函數(shù)(stdlib.h)(1)malloc(size)分配size字節(jié)的存儲(chǔ)空間(2)calloc(n,size)分配n個(gè)size字節(jié)的連續(xù)空間(3)free(p)釋放指針變量p占用的動(dòng)態(tài)空間(4)realloc(p,size)改變指針變量p指向的空間大小函數(shù)(1)(2)(4)返回void基類型的指針;(3)無返回值使用void基類型的指針變量訪問動(dòng)態(tài)內(nèi)存分配區(qū)例8.30動(dòng)態(tài)內(nèi)存分配與指向它的指針變量?jī)?nèi)存動(dòng)態(tài)分配庫(kù)函數(shù)(37小結(jié)

理解指針,能深入計(jì)算機(jī)的內(nèi)存,寫出面向底層的程序,使程序簡(jiǎn)潔明快。初學(xué)者首先做到理解概念,讀懂例子,將一些做過的題改用指針完成,初步了解指針的概念與用法。小結(jié)理解指針,能深入計(jì)算機(jī)的內(nèi)存,寫出面向38第8章指針第8章指針39指針是C語言的一個(gè)重要特色;正確而靈活地運(yùn)用指針可以:有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能獲得1個(gè)以上的結(jié)果;能直接處理內(nèi)存單元的地址可以使程序簡(jiǎn)潔、緊湊、高效關(guān)于指針指針是C語言的一個(gè)重要特色;關(guān)于指針40由內(nèi)存單元組成,每個(gè)單元有地址,存放一字節(jié)數(shù)據(jù)內(nèi)存儲(chǔ)器000000011111010013A613A513A7shortinta;變量aa=500;內(nèi)存地址是二進(jìn)制數(shù),通常寫成十六進(jìn)制由內(nèi)存單元組成,每個(gè)單元有地址,存放一字節(jié)數(shù)據(jù)內(nèi)存儲(chǔ)41內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)計(jì)算機(jī)內(nèi)存由大量存儲(chǔ)單元

(memoryunit)組成。每個(gè)存儲(chǔ)單元容量為1字節(jié)(byte)。每個(gè)存儲(chǔ)單元有編號(hào),即存儲(chǔ)單元的“地址”(address)。存儲(chǔ)單元中可存放數(shù)據(jù)(data)。內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)計(jì)算機(jī)內(nèi)存由大量存儲(chǔ)42變量的地址定義變量時(shí),系統(tǒng)分配給變量的內(nèi)存單元的起始地址

變量值的存取通過變量在內(nèi)存中的地址進(jìn)行變量的地址稱為“指針”(pointer)變量的地址定義變量時(shí),系統(tǒng)分配給變量的內(nèi)存單元的起始43(1)直接訪問──直接利用變量的地址進(jìn)行存取

例:shortinta;//分配內(nèi)存地址a=500;

在符號(hào)表中檢索變量名a,找到其起始地址(例如13A6);將數(shù)值500(的二進(jìn)制形式)送到內(nèi)存單元13A6和13A7中變量的訪問方式(1)直接訪問──直接利用變量的地址進(jìn)行存取變量的訪問方式44(2)間接訪問──通過指針變量訪問變量地址定義一種特殊的變量,用來存放其它變量的地址(指針),這種變量稱為指針變量,它指向一個(gè)普通的變量。變量的訪問方式(2)間接訪問──通過指針變量訪問變量地址變量的訪問方式45指針變量的定義和調(diào)用inta;int

*a_pointer;a=500;a_pointer=&a;printf("%d\n",*a_pointer);printf("%x\n",a_pointer);*a_pointer=3;定義一個(gè)指針變量它指向一個(gè)整型變量(基類型)給指針變量賦值指針變量的值是另一個(gè)變量的地址指針變量所指向的變量即a的值指針變量的值,即a的地址對(duì)指向的變量(即a)賦值例:73頁(yè)輸出格式指針變量的定義和調(diào)用inta;定義一個(gè)指針變量它指向一個(gè)整46兩個(gè)指針變量交換了它們的值,也就是交換了指向intmain(){intn1,n2;int*n1_p=&n1,*n2_p=&n2,*pointer;printf("Inputn1:");scanf("%d",n1_p);printf("Inputn2:");scanf("%d",n2_p);printf("n1=%d,n2=%d\n",n1,n2);printf("*n1_p=%d,*n2_p=%d\n",*n1_p,*n2_p);printf("n1_p=%o,n2_p=%o\n",n1_p,n2_p);pointer=n1_p;n1_p=n2_p;n2_p=pointer;printf("n1=%d,n2=%d\n",n1,n2);printf("*n1_p=%d,*n2_p=%d\n",*n1_p,*n2_p);printf("n1_p=%o,n2_p=%o\n",n1_p,n2_p);}例.分析以下程序運(yùn)行結(jié)果兩個(gè)指針變量交換了它們的值,也就是交換了指向intmain47開始時(shí)指針變量n1_p指向n1,指針變量n2_p指向n2。變量n1和n2的值并沒有改變,但n1_p和n2_p的值改變了,也就是指向改變了。指針變量n1_p指向n2,指針變量n2_p指向n1。上頁(yè)代碼要點(diǎn)開始時(shí)指針變量n1_p指向n1,指針變量n2_p指向n2。上48內(nèi)存內(nèi)存單元內(nèi)存單元的地址變量的首地址指針指針變量指針變量的指向直接訪問與間接訪問掌握幾個(gè)重要概念區(qū)別兩個(gè)*pint*p;p=&a;*p=3;內(nèi)存掌握幾個(gè)重要概念區(qū)別兩個(gè)*p49指針變量的重要作用之一

——作為函數(shù)的參數(shù),實(shí)現(xiàn)地址傳遞指針變量的重要作用之一

——作為函數(shù)的參數(shù),實(shí)現(xiàn)地址傳遞50intmain(){voidswap(intp1,intp2);inta,b;scanf("%d,%d",&a,&b);if(a<b)swap(a,b);printf("%d,%d\n",a,b);return0;}例函數(shù)調(diào)用中的值傳遞voidswap(intp1,intp2){intp;p=p1;p1=p2;p2=p;}運(yùn)行結(jié)果:a,b沒有交換。原因:C語言中,實(shí)參向形參傳遞數(shù)據(jù)采用“值傳遞”,形參單獨(dú)占用內(nèi)存單元,交換對(duì)實(shí)參無影響。intmain()例函數(shù)調(diào)用中的值傳遞voidswa51voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}例通過指針變量實(shí)現(xiàn)地址傳遞的效果注意這兩個(gè)*p1的含義不同,前者說明p1為指針變量,后者表示p1所指向的變量。intmain(){voidswap(int*p1,int*p2);inta,b;int*a_p=&a,*b_p=&b;scanf("%d,%d",&a,&b);if(a<b)swap(a_p,b_p);printf("%d,%d\n",a,b);return0;}p是普通的變量voidswap(int*p1,int*p2)例通過52指針變量作為函數(shù)的參數(shù)指針作實(shí)參,對(duì)應(yīng)的形參是指針變量。C語言的參數(shù)傳遞是“值傳遞”。指針變量做參數(shù)時(shí),由于其值為變量的地址,產(chǎn)生“地址傳遞”的效果。數(shù)組做函數(shù)的參數(shù)時(shí),也是“地址傳遞”。被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。指針變量作為函數(shù)的參數(shù)指針作實(shí)參,對(duì)應(yīng)的形參是指針變量。53指針變量閱讀例8.2-例8.5,上機(jī)調(diào)試,觀察結(jié)果,分析掌握。要求能夠熟練地掌握指針變量及其指向的變化過程,能夠在紙上畫圖表達(dá)分析過程。指針變量閱讀例8.2-例8.5,上機(jī)調(diào)試,觀察結(jié)果,分析掌握54訪問數(shù)組——指針的又一重要用途shortinta[3];200020022004a[0]a[1]a[2]元素的地址數(shù)組元素元素的值0000000000000110a[2]=6;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx元素的地址數(shù)組的首地址訪問數(shù)組——指針的又一重要用途shortinta[3];55數(shù)組和指針的相關(guān)概念數(shù)組的指針:數(shù)組在內(nèi)存中的起始地址,即首元素(下標(biāo)為0的元素)的首地址數(shù)組元素的指針:數(shù)組元素在內(nèi)存中的起始地址數(shù)組名:代表數(shù)組首元素的地址(指針)指向數(shù)組的指針變量:存儲(chǔ)數(shù)組某個(gè)元素的地址,即指向某個(gè)元素?cái)?shù)組和指針的相關(guān)概念數(shù)組的指針:數(shù)組在內(nèi)存中的起始地址,即首56定義指向數(shù)組的指針變量intarray[5],*pointer=array;intarray[5],*pointer;pointer=array;intarray[5],*pointer=&array[0];

使用指針訪問數(shù)組元素,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。定義指向數(shù)組的指針變量intarray[5],*po57通過指針引用數(shù)組元素例intmain(){inta[5]={12,6,18,23,9};int*p;p=a;printf("%d,%x\n",*p,p);

printf("%d,%x\n",*(p+2),p+2);p++;printf("%d,%x\n",*p,p);p=p+2;printf("%d,%x\n",*p,p);return0;}通過指針引用數(shù)組元素例intmain()58通過指針引用數(shù)組元素對(duì)于數(shù)組a和指向該數(shù)組首元素的指針變量pp+i和a+i均表示元素a[i]的地址*(p+i),*(a+i),a[i]均表示元素a[i]的值p+1的含義是指向下一個(gè)元素地址可以p++,不能a++——首元素地址不能改變注意區(qū)別*p++(等價(jià)于*(p++)),*(++p)和(*p)++(P.236-237)若定義數(shù)組a[5]和指針變量*p=a,則a[6]等價(jià)于p+6,指針指向數(shù)組之后的地址,故不報(bào)錯(cuò)參見P.378運(yùn)算符的優(yōu)先級(jí)與結(jié)合性通過指針引用數(shù)組元素對(duì)于數(shù)組a和指向該數(shù)組首元素的指針變量p59通過指針引用數(shù)組元素例教材P.233-234例8.6三種表達(dá)方式P.235例8.7——不能達(dá)到目的通過指針引用數(shù)組元素例60數(shù)組名作為函數(shù)的參數(shù)進(jìn)一步分析——用指針訪問數(shù)組

實(shí)參形參數(shù)組名數(shù)組名數(shù)組名指針變量指針變量指針變量指針變量數(shù)組名數(shù)組名指針變量數(shù)組名作為函數(shù)的參數(shù)進(jìn)一步分析——用指針訪問數(shù)組實(shí)參61數(shù)組名作為函數(shù)的參數(shù)—以指針表示P.239例8.8數(shù)組元素逆序排列

——形參:數(shù)組名;實(shí)參:數(shù)組名P.241例8.8程序修改

——形參:指針變量P.242例8.9數(shù)組元素逆序排列

——形參:指針變量;實(shí)參:指針變量P.244例8.10選擇排序

——形參:數(shù)組;實(shí)參:指針變量P.245例8.10函數(shù)修改

——形參:指針變量數(shù)組名作為函數(shù)的參數(shù)—以指針表示P.239例8.8數(shù)組元62多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a<=>&a[0][0]<=>a[0]a+1<=>&a[1][0]<=>a[1]a+2<=>&a[2][0]<=>a[2]二維數(shù)組的行指針:以二維數(shù)組名表示多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[363多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二維數(shù)組的行指針:以二維數(shù)組名表示int*p=a;p=a+1;p=a+2;p=>a[0][0]p=>a[1][0]p=>a[2][0]多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[364多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]<=>&a[0][0]a[0]+1<=>&a[0][1]a[1]+2<=>&a[1][2]a[0]+5<=>&a[1][1]二維數(shù)組的列指針:以一維數(shù)組名表示多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[365多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二維數(shù)組的列指針:以指針變量表示int*p;p=a;p++;p=p+5;p=>a[0][0]p=>a[0][1]p=>a[1][2]多維數(shù)組的指針——以二維數(shù)組為例例:聲明數(shù)組inta[366通過指針引用字符串字符串是在內(nèi)存中連續(xù)存放的一組字符以變量形式保存字符串需要聲明字符數(shù)組或聲明一個(gè)指針變量訪問字符串或字符數(shù)組(P.257圖8.28)——不是字符串變量char*string;string="Workhard!";printf("%s\n",string);printf("%c\n",*string++);printf("%c\n",*(string+5));printf("%s\n",string);++在后,先取p值,再++,p用于*p請(qǐng)對(duì)照*(++p)通過指針引用字符串字符串是在內(nèi)存中連續(xù)存放的一組字符char67通過指針引用字符串P.255例8.16使用字符數(shù)組存放字符串

使用字符數(shù)組名輸出字符

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論