C語(yǔ)言指針第講課件_第1頁(yè)
C語(yǔ)言指針第講課件_第2頁(yè)
C語(yǔ)言指針第講課件_第3頁(yè)
C語(yǔ)言指針第講課件_第4頁(yè)
C語(yǔ)言指針第講課件_第5頁(yè)
已閱讀5頁(yè),還剩44頁(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)介

1、內(nèi)容提要指針概述指針的概念為什么引入指針的概念指針變量作為函數(shù)參數(shù)字符指針作為函數(shù)參數(shù)指針和數(shù)組間的關(guān)系一維數(shù)組的地址和指針二維數(shù)組的地址和指針第1頁(yè),共49頁(yè)。為什么引入指針的概念鐵桿C/C+程序員最摯愛(ài)的武器:指針C/C+的高效、高能主要來(lái)自于指針很多不可能的任務(wù)由指針完成 第2頁(yè),共49頁(yè)。為什么引入指針的概念 指針為函數(shù)提供修改變量值的手段 為C的動(dòng)態(tài)內(nèi)存分配系統(tǒng)提供支持 為動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹(shù)等)提供支持 可以改善某些子程序的效率 第3頁(yè),共49頁(yè)。內(nèi)存的尋址方式如何讀寫(xiě)內(nèi)存中的數(shù)據(jù)?通過(guò)變量的地址訪(fǎng)問(wèn)變量所在的存儲(chǔ)單元兩種尋址方式直接(尋址)訪(fǎng)問(wèn)通過(guò)變量地址直接存取

2、變量?jī)?nèi)容間接(尋址)訪(fǎng)問(wèn)通過(guò)指針變量來(lái)間接存取它所指向的變量i_pointer=&i;第4頁(yè),共49頁(yè)。指針(Pointer)的概念指針也是一種數(shù)據(jù)類(lèi)型指針變量 聲明為指針類(lèi)型的變量,專(zhuān)門(mén)存放地址數(shù)據(jù)的變量 第5頁(yè),共49頁(yè)。如何定義指針變量?定義指針變量int *p;定義了一個(gè)指針變量p,簡(jiǎn)稱(chēng)指針pp是變量,int*是類(lèi)型指針變量初始化int *p,a;p = &a;*p 與 a 完全等價(jià)第6頁(yè),共49頁(yè)。int i,*p;p=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=100;判斷是真?是假?指針變量只存放地址!一個(gè)指針變量不能

3、指向與其類(lèi)型不同的變量!我是真的,你猜對(duì)了嗎?應(yīng)在類(lèi)型相同的指針變量之間賦值第7頁(yè),共49頁(yè)。&與*操作符&用來(lái)取變量的地址*用來(lái)取指針指向的內(nèi)存中的內(nèi)容int *p, a10;p = &a0;*p=20;int *p, a10;p = &a5;*p=20;int i=3, *p;p = &i;printf(“*p=%d”,*p);int *p, a10;p = a;*p=20; 等價(jià)于a0=20;第8頁(yè),共49頁(yè)。指針變量與其它類(lèi)型變量的對(duì)比共性在內(nèi)存中占據(jù)一定大小的存儲(chǔ)單元先定義,后使用特殊性 它的內(nèi)容只能是地址,而不能是數(shù)據(jù)必須初始化后才能使用,否則指向不確定的存儲(chǔ)單元,對(duì)該空間進(jìn)行訪(fǎng)問(wèn)

4、,將可能造成危險(xiǎn)可參與的運(yùn)算:加、減一個(gè)整數(shù),自增、自減、關(guān)系、賦值只能指向同一基類(lèi)型的變量第9頁(yè),共49頁(yè)。指針的指向只能指向同一基類(lèi)型的變量,否則將引起warningfloat x; int *p = &x;TC編譯warning: Suspicious pointer conversion in function mainVC編譯warning C4133: = : incompatible types - from float * to int *第10頁(yè),共49頁(yè)。指針運(yùn)算算術(shù)運(yùn)算short *p, a10; p = a; p+; /*p的值增加多少?*/指針的加減運(yùn)算是以其指向的類(lèi)

5、型的字節(jié)長(zhǎng)度為單位的6000600160026003600460056006p-1pp+1第11頁(yè),共49頁(yè)。指針運(yùn)算int *p, *q, a10;p = a;q = &a5;q - p q = p + 5;指針運(yùn)算不能亂算一般只進(jìn)行指針和整數(shù)的加減運(yùn)算,同類(lèi)型指針之間的減法運(yùn)算其它運(yùn)算,比如乘法、除法、浮點(diǎn)運(yùn)算、指針之間的加法等,并無(wú)意義,所以也不支持第12頁(yè),共49頁(yè)。指針運(yùn)算關(guān)系運(yùn)算指向同一種數(shù)據(jù)類(lèi)型的兩個(gè)指針才能進(jìn)行關(guān)系運(yùn)算值為1或0p q p q p = q不能與非指針類(lèi)型變量進(jìn)行比較,但可與NULL(即0值)進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針P = NULLp != NUL

6、L第13頁(yè),共49頁(yè)。指針運(yùn)算賦值運(yùn)算指針在使用前一定要賦值為指針變量賦的值必須是一個(gè)地址main() int *p; scanf(%d,p); main() int a,*p=&a; scanf(%d,p); 錯(cuò)!但TC下不報(bào)錯(cuò)VC下報(bào)錯(cuò)第14頁(yè),共49頁(yè)。指針與函數(shù)指針既然是數(shù)據(jù)類(lèi)型,自然可以做函數(shù)參數(shù)和返回值的類(lèi)型指針做函數(shù)參數(shù)的經(jīng)典例子:兩數(shù)的互換第15頁(yè),共49頁(yè)。void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp;main() int a, b; a = 15; b = 8; Swap( &a, &b )

7、; printf(a=%d,b=%d,a,b);void Swap(int x,int y) int temp; temp = x; x = y; y = temp;main() int a, b; a = 15; b = 8; Swap(a, b); printf(a=%d,b=%d,a,b);程序 1程序 2 例7.17.2:編寫(xiě)函數(shù)實(shí)現(xiàn)兩數(shù)的互換主調(diào)函數(shù)被調(diào)函數(shù)實(shí) 參形 參結(jié)果有何不同?Not Work!Why?第16頁(yè),共49頁(yè)。主調(diào)函數(shù)被調(diào)函數(shù)main() int a, b; a = 15; b = 8; Swap(a, b); printf(a=%d,b=%d,a,b);void

8、Swap(int x, int y) int temp; temp = x; x = y; y = temp;55ab實(shí) 參形 參99xyab程序 1xy55temp9第17頁(yè),共49頁(yè)。主調(diào)函數(shù)被調(diào)函數(shù)main() int a, b; a = 15; b = 8; Swap(&a, &b); printf(a=%d,b=%d,a,b);void Swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp;&a&a實(shí) 參形 參&b&bxyab程序 2xy5temp5ab995第18頁(yè),共49頁(yè)。簡(jiǎn)單變量作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)

9、的比較15 815 815 81515 8815 81515a) 調(diào)用Swap函數(shù)(b)執(zhí)行Swap函數(shù)c) 從Swap函數(shù)返回temp xy bmain函數(shù)Swap函數(shù)aaatemptempxxy y bb1588 15&a&b&a&b15(a) 調(diào)用Swap函數(shù) (b) 執(zhí)行Swap函數(shù) a a b b *x *x *y *y y y x x &a &b main函數(shù) Swap函數(shù) temptemp第19頁(yè),共49頁(yè)。swap函數(shù)的幾種錯(cuò)誤形式(1/3)參數(shù)單向傳遞void Swap(int x, int y) int temp; temp = x; /*x,y為內(nèi)部變量*/ x = y;

10、 y = temp;第20頁(yè),共49頁(yè)。swap函數(shù)的幾種錯(cuò)誤形式(2/3)參數(shù)單向傳遞void Swap(int *p1, int *p2) int *p; p = p1; /*p1,p2為內(nèi)部變量*/ p1 = p2; p2 = p; 第21頁(yè),共49頁(yè)。swap函數(shù)的幾種錯(cuò)誤形式(3/3)指針p沒(méi)有確切地址void Swap(int *p1, int *p2) int *p; /*指針p未初始化*/ *p = *p1; *p1 = *p2; *p2 = *p; 第22頁(yè),共49頁(yè)。字符串與字符數(shù)組、字符指針C語(yǔ)言并沒(méi)有為字符串提供任何專(zhuān)門(mén)的表示法,完全使用字符數(shù)組和字符指針來(lái)處理字符串一

11、串以0結(jié)尾的字符字符數(shù)組每個(gè)元素都是字符類(lèi)型的數(shù)組char string100;字符指針指向字符類(lèi)型的指針char *p;數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事第23頁(yè),共49頁(yè)。字符指針變量與字符數(shù)組的區(qū)別定義方法不同 char str10; char *ptr;賦值方法不同 char str10; str = ”china”; /*錯(cuò)誤*/ strcpy(str,”china”); /*正確*/ char *ptr; ptr = ”china”;字符指針是變量,而數(shù)組名是地址常量第24頁(yè),共49頁(yè)。使用字符指針的注意事項(xiàng)字符指針變量必須有明確的指向,否則使用是危險(xiǎn)的例如,輸入字符串

12、時(shí) char *a; scanf(%s, a); /*錯(cuò)誤*/ 應(yīng)為: char *a; char str10; a = str; scanf(%s, a); /*正確*/第25頁(yè),共49頁(yè)。例7.5 :字符串拷貝用字符數(shù)組編程void MyStrcpy(char dstStr, char srcStr)int i = 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0;下標(biāo): 0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0srcStridstStri下標(biāo)移動(dòng)方向dstStri=

13、0srcStrdstStr結(jié)束拷貝ii+ i 第26頁(yè),共49頁(yè)。void MyStrcpy(char *dstStr, const char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; 當(dāng)只允許函數(shù)訪(fǎng)問(wèn)地址內(nèi)容,不允許修改時(shí),可以把函數(shù)的指針參數(shù)定義為constHelloChina0HelloChina0*srcStr*dstStr指針移動(dòng)方向指針移動(dòng)方向*to=0dstStrsrcStr+srcStrsrcStrdstStr+dstStr例7.5 :字符串拷貝用字符指針編程第2

14、7頁(yè),共49頁(yè)。例7.5 :字符串拷貝主函數(shù)程序#include main()char a80, b80;printf(“Please enter a string:”);gets(a);MyStrcpy(b,a);printf(“The copy is:”); puts(b);第28頁(yè),共49頁(yè)。例7.6 :計(jì)算實(shí)際字符個(gè)數(shù) unsigned int MyStrlen(char str) int i;unsigned int len = 0; for (i=0; stri!=0; i+) len+; return (len); unsigned int MyStrlen(char *pStr

15、) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return (len); 方法2:用字符指針實(shí)現(xiàn)方法1:用字符數(shù)組實(shí)現(xiàn)第29頁(yè),共49頁(yè)。指針與數(shù)組數(shù)組名就是一個(gè)指針只是不能修改這個(gè)指針的指向可以定義函數(shù)的參數(shù)為數(shù)組指針也可當(dāng)作數(shù)組名使用short *p, a10;p = a;數(shù)組元素的幾種等價(jià)引用形式ai*(a+i)pi*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+第30頁(yè),共49

16、頁(yè)。輸入輸出數(shù)組的全部元素main() int a10; int i; for (i=0; i10; i+) scanf(%d, &ai); for (i=0; i10; i+) printf(%d , ai); 方法1:下標(biāo)法main() int a10; int *p, i; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p); 方法2:指針?lè)ǖ?1頁(yè),共49頁(yè)。例7.7 :插入排序 關(guān)鍵是:找到該插入的位置,然后依次移動(dòng)插入位置及其后的所有元素騰出這一位置放入待插入的元素 1 3 5 7

17、9a0a1a2a3a4a5插入位置pos x=4x插入前: 1 3 4 5 7 9 x插入后:插入元素xa0a1a2a3a4a5第32頁(yè),共49頁(yè)。例7.7 :插入排序主函數(shù)#include #define ARR_SIZE 10void Inseart(int a,int n, int x)main() /*教材268頁(yè)*/int aARR_SIZE+1, x, i, n; Inseart(a, n, x); /*調(diào)用函數(shù) 實(shí)參a為數(shù)組名*/第33頁(yè),共49頁(yè)。例7.7 :插入排序數(shù)組作形參void Inseart(int a, int n, int x) int i, pos; for (

18、i=0; (i ai); i+) pos = i; for (i = n-1; i = pos; i-) ai+1 = ai; /*向后移動(dòng)*/apos = x; /*插入元素x到位置pos*/第34頁(yè),共49頁(yè)。main() /*教材270頁(yè)*/int aARR_SIZE+1, x, i, n; Inseart(a, n, x); /*調(diào)用函數(shù) 實(shí)參a為數(shù)組名*/void Inseart(int *a, int n, int x) /*定義函數(shù),形參a為指針變量*/插入排序方式二第35頁(yè),共49頁(yè)。main() /*教材270頁(yè)*/int aARR_SIZE+1, x, i, n;int *

19、p = NULL; Inseart(p, n, x); /*調(diào)用函數(shù) 實(shí)參p指針變量*/void Inseart(int a, int n, int x) /*定義函數(shù),形參a為數(shù)組*/插入排序方式三第36頁(yè),共49頁(yè)。main() /*教材270頁(yè)*/int aARR_SIZE+1, x, i, n;int *p = NULL; Inseart(p, n, x); /*調(diào)用函數(shù) 實(shí)參p為指針變量*/void Inseart(int *a, int n, int x) /*定義函數(shù),形參a為指針變量*/插入排序方式4第37頁(yè),共49頁(yè)。例7.7 :插入排序指針作形參void Inseart(i

20、nt *a, int n, int x) int i, pos; for (i=0; (i *(a+i); i+) pos = i; for (i = n-1; i = pos; i-) *(a + i + 1) = *(a + i); /*向后移動(dòng)*/*(a + pos) = x; /*插入元素x到位置pos*/第38頁(yè),共49頁(yè)。指針與二維數(shù)組C語(yǔ)言將二維數(shù)組看作一維數(shù)組,其每個(gè)數(shù)組元素又是一個(gè)一維數(shù)組按行順序存放所有元素a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1

21、 a11a12 a a1+2int a23;第39頁(yè),共49頁(yè)。例7.8 任意輸入英文的星期幾,在查找星期表后輸出其對(duì)應(yīng)的數(shù)字。 char weekDay710 = Sunday, Monday, Tuesday,Wednesday, Thursday, Friday, Saturday; 表7-1 星期表的內(nèi)容0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdayweekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesda

22、y0Thursday0Friday0Saturday0第40頁(yè),共49頁(yè)。#include main() int i, pos;int findFlag = 0; char x10;char weekDay10 = Sunday,Monday,Tuesday, Wednesday,Thursday,Friday, Saturday; printf(Please enter a string:);scanf(%s, x); for (i=0; i 7 & !findFlag; i+) if (strcmp(x, weekDayi) = 0) pos = i; findFlag = 1; if (

23、findFlag) printf(%s is %dn, x, pos);else printf(Not found!n);例7.8weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0 xSunday0第41頁(yè),共49頁(yè)。指針與二維數(shù)組a 代表二維數(shù)組的首地址,第0行的地址a+i 代表第i行的地址*(a+i) 即 ai 代表第i行第0列的地址*(a+i)+j 即 ai+j 代表第i行第j列的地址*(*(a+i)+j ) 即

24、aij 代表第i行第j列的元素行地址轉(zhuǎn)變成列地址第42頁(yè),共49頁(yè)。指針與二維數(shù)組二維數(shù)組的指針列指針int *p;p = *a;/用列地址初始化逐個(gè)元素查找元素所在位置相對(duì)于數(shù)組起始地址的偏移量i*n+jfor (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(p+i*n+j);a00a01a02a10a11a12pp+第43頁(yè),共49頁(yè)。指針與二維數(shù)組二維數(shù)組的指針行指針int (*p)3, a43,*p1;p = a;/用行地址初始化p1=a0 ;/用元素地址初始化先逐行查找元素所在行再在行內(nèi)逐列查找元素所在位置for (i=0; im; i+)for

25、 (j=0; jn; j+) printf(%d,*(*(p+i)+j);a00a01a02a10a11a12pp+第44頁(yè),共49頁(yè)。例7.3:在一個(gè)班級(jí)中找出最高分及其學(xué)號(hào) void FindMax(float score, long num, int n, float pMaxScore, long pMaxNum) int i;pMaxScore = score0; pMaxNum = num0; for (i=1; i pMaxScore) pMaxScore = scorei; pMaxNum = numi; 能返回這兩個(gè)值嗎?第45頁(yè),共49頁(yè)。例7.3:在一個(gè)班級(jí)中找出最高分及其學(xué)號(hào) void FindMax(float s

溫馨提示

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

評(píng)論

0/150

提交評(píng)論