




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、內容提要指針概述指針的概念為什么引入指針的概念指針變量作為函數參數字符指針作為函數參數指針和數組間的關系一維數組的地址和指針二維數組的地址和指針第1頁,共49頁。為什么引入指針的概念鐵桿C/C+程序員最摯愛的武器:指針C/C+的高效、高能主要來自于指針很多不可能的任務由指針完成 第2頁,共49頁。為什么引入指針的概念 指針為函數提供修改變量值的手段 為C的動態(tài)內存分配系統(tǒng)提供支持 為動態(tài)數據結構(如例鏈表、隊列、二叉樹等)提供支持 可以改善某些子程序的效率 第3頁,共49頁。內存的尋址方式如何讀寫內存中的數據?通過變量的地址訪問變量所在的存儲單元兩種尋址方式直接(尋址)訪問通過變量地址直接存取
2、變量內容間接(尋址)訪問通過指針變量來間接存取它所指向的變量i_pointer=&i;第4頁,共49頁。指針(Pointer)的概念指針也是一種數據類型指針變量 聲明為指針類型的變量,專門存放地址數據的變量 第5頁,共49頁。如何定義指針變量?定義指針變量int *p;定義了一個指針變量p,簡稱指針pp是變量,int*是類型指針變量初始化int *p,a;p = &a;*p 與 a 完全等價第6頁,共49頁。int i,*p;p=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=100;判斷是真?是假?指針變量只存放地址!一個指針變量不能
3、指向與其類型不同的變量!我是真的,你猜對了嗎?應在類型相同的指針變量之間賦值第7頁,共49頁。&與*操作符&用來取變量的地址*用來取指針指向的內存中的內容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; 等價于a0=20;第8頁,共49頁。指針變量與其它類型變量的對比共性在內存中占據一定大小的存儲單元先定義,后使用特殊性 它的內容只能是地址,而不能是數據必須初始化后才能使用,否則指向不確定的存儲單元,對該空間進行訪問
4、,將可能造成危險可參與的運算:加、減一個整數,自增、自減、關系、賦值只能指向同一基類型的變量第9頁,共49頁。指針的指向只能指向同一基類型的變量,否則將引起warningfloat x; int *p = &x;TC編譯warning: Suspicious pointer conversion in function mainVC編譯warning C4133: = : incompatible types - from float * to int *第10頁,共49頁。指針運算算術運算short *p, a10; p = a; p+; /*p的值增加多少?*/指針的加減運算是以其指向的類
5、型的字節(jié)長度為單位的6000600160026003600460056006p-1pp+1第11頁,共49頁。指針運算int *p, *q, a10;p = a;q = &a5;q - p q = p + 5;指針運算不能亂算一般只進行指針和整數的加減運算,同類型指針之間的減法運算其它運算,比如乘法、除法、浮點運算、指針之間的加法等,并無意義,所以也不支持第12頁,共49頁。指針運算關系運算指向同一種數據類型的兩個指針才能進行關系運算值為1或0p q p q p = q不能與非指針類型變量進行比較,但可與NULL(即0值)進行等或不等的關系運算判斷p是否為空指針P = NULLp != NUL
6、L第13頁,共49頁。指針運算賦值運算指針在使用前一定要賦值為指針變量賦的值必須是一個地址main() int *p; scanf(%d,p); main() int a,*p=&a; scanf(%d,p); 錯!但TC下不報錯VC下報錯第14頁,共49頁。指針與函數指針既然是數據類型,自然可以做函數參數和返回值的類型指針做函數參數的經典例子:兩數的互換第15頁,共49頁。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:編寫函數實現兩數的互換主調函數被調函數實 參形 參結果有何不同?Not Work!Why?第16頁,共49頁。主調函數被調函數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實 參形 參99xyab程序 1xy55temp9第17頁,共49頁。主調函數被調函數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實 參形 參&b&bxyab程序 2xy5temp5ab995第18頁,共49頁。簡單變量作函數參數與指針變量作函數參數
9、的比較15 815 815 81515 8815 81515a) 調用Swap函數(b)執(zhí)行Swap函數c) 從Swap函數返回temp xy bmain函數Swap函數aaatemptempxxy y bb1588 15&a&b&a&b15(a) 調用Swap函數 (b) 執(zhí)行Swap函數 a a b b *x *x *y *y y y x x &a &b main函數 Swap函數 temptemp第19頁,共49頁。swap函數的幾種錯誤形式(1/3)參數單向傳遞void Swap(int x, int y) int temp; temp = x; /*x,y為內部變量*/ x = y;
10、 y = temp;第20頁,共49頁。swap函數的幾種錯誤形式(2/3)參數單向傳遞void Swap(int *p1, int *p2) int *p; p = p1; /*p1,p2為內部變量*/ p1 = p2; p2 = p; 第21頁,共49頁。swap函數的幾種錯誤形式(3/3)指針p沒有確切地址void Swap(int *p1, int *p2) int *p; /*指針p未初始化*/ *p = *p1; *p1 = *p2; *p2 = *p; 第22頁,共49頁。字符串與字符數組、字符指針C語言并沒有為字符串提供任何專門的表示法,完全使用字符數組和字符指針來處理字符串一
11、串以0結尾的字符字符數組每個元素都是字符類型的數組char string100;字符指針指向字符類型的指針char *p;數組和指針可以等同看待,上面三者本質上是一回事第23頁,共49頁。字符指針變量與字符數組的區(qū)別定義方法不同 char str10; char *ptr;賦值方法不同 char str10; str = ”china”; /*錯誤*/ strcpy(str,”china”); /*正確*/ char *ptr; ptr = ”china”;字符指針是變量,而數組名是地址常量第24頁,共49頁。使用字符指針的注意事項字符指針變量必須有明確的指向,否則使用是危險的例如,輸入字符串
12、時 char *a; scanf(%s, a); /*錯誤*/ 應為: char *a; char str10; a = str; scanf(%s, a); /*正確*/第25頁,共49頁。例7.5 :字符串拷貝用字符數組編程void MyStrcpy(char dstStr, char srcStr)int i = 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0;下標: 0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0srcStridstStri下標移動方向dstStri=
13、0srcStrdstStr結束拷貝ii+ i 第26頁,共49頁。void MyStrcpy(char *dstStr, const char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; 當只允許函數訪問地址內容,不允許修改時,可以把函數的指針參數定義為constHelloChina0HelloChina0*srcStr*dstStr指針移動方向指針移動方向*to=0dstStrsrcStr+srcStrsrcStrdstStr+dstStr例7.5 :字符串拷貝用字符指針編程第2
14、7頁,共49頁。例7.5 :字符串拷貝主函數程序#include main()char a80, b80;printf(“Please enter a string:”);gets(a);MyStrcpy(b,a);printf(“The copy is:”); puts(b);第28頁,共49頁。例7.6 :計算實際字符個數 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:用字符指針實現方法1:用字符數組實現第29頁,共49頁。指針與數組數組名就是一個指針只是不能修改這個指針的指向可以定義函數的參數為數組指針也可當作數組名使用short *p, a10;p = a;數組元素的幾種等價引用形式ai*(a+i)pi*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+第30頁,共49
16、頁。輸入輸出數組的全部元素main() int a10; int i; for (i=0; i10; i+) scanf(%d, &ai); for (i=0; i10; i+) printf(%d , ai); 方法1:下標法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:指針法第31頁,共49頁。例7.7 :插入排序 關鍵是:找到該插入的位置,然后依次移動插入位置及其后的所有元素騰出這一位置放入待插入的元素 1 3 5 7
17、9a0a1a2a3a4a5插入位置pos x=4x插入前: 1 3 4 5 7 9 x插入后:插入元素xa0a1a2a3a4a5第32頁,共49頁。例7.7 :插入排序主函數#include #define ARR_SIZE 10void Inseart(int a,int n, int x)main() /*教材268頁*/int aARR_SIZE+1, x, i, n; Inseart(a, n, x); /*調用函數 實參a為數組名*/第33頁,共49頁。例7.7 :插入排序數組作形參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; /*向后移動*/apos = x; /*插入元素x到位置pos*/第34頁,共49頁。main() /*教材270頁*/int aARR_SIZE+1, x, i, n; Inseart(a, n, x); /*調用函數 實參a為數組名*/void Inseart(int *a, int n, int x) /*定義函數,形參a為指針變量*/插入排序方式二第35頁,共49頁。main() /*教材270頁*/int aARR_SIZE+1, x, i, n;int *
19、p = NULL; Inseart(p, n, x); /*調用函數 實參p指針變量*/void Inseart(int a, int n, int x) /*定義函數,形參a為數組*/插入排序方式三第36頁,共49頁。main() /*教材270頁*/int aARR_SIZE+1, x, i, n;int *p = NULL; Inseart(p, n, x); /*調用函數 實參p為指針變量*/void Inseart(int *a, int n, int x) /*定義函數,形參a為指針變量*/插入排序方式4第37頁,共49頁。例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); /*向后移動*/*(a + pos) = x; /*插入元素x到位置pos*/第38頁,共49頁。指針與二維數組C語言將二維數組看作一維數組,其每個數組元素又是一個一維數組按行順序存放所有元素a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1
21、 a11a12 a a1+2int a23;第39頁,共49頁。例7.8 任意輸入英文的星期幾,在查找星期表后輸出其對應的數字。 char weekDay710 = Sunday, Monday, Tuesday,Wednesday, Thursday, Friday, Saturday; 表7-1 星期表的內容0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdayweekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesda
22、y0Thursday0Friday0Saturday0第40頁,共49頁。#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頁,共49頁。指針與二維數組a 代表二維數組的首地址,第0行的地址a+i 代表第i行的地址*(a+i) 即 ai 代表第i行第0列的地址*(a+i)+j 即 ai+j 代表第i行第j列的地址*(*(a+i)+j ) 即
24、aij 代表第i行第j列的元素行地址轉變成列地址第42頁,共49頁。指針與二維數組二維數組的指針列指針int *p;p = *a;/用列地址初始化逐個元素查找元素所在位置相對于數組起始地址的偏移量i*n+jfor (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(p+i*n+j);a00a01a02a10a11a12pp+第43頁,共49頁。指針與二維數組二維數組的指針行指針int (*p)3, a43,*p1;p = a;/用行地址初始化p1=a0 ;/用元素地址初始化先逐行查找元素所在行再在行內逐列查找元素所在位置for (i=0; im; i+)for
25、 (j=0; jn; j+) printf(%d,*(*(p+i)+j);a00a01a02a10a11a12pp+第44頁,共49頁。例7.3:在一個班級中找出最高分及其學號 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; 能返回這兩個值嗎?第45頁,共49頁。例7.3:在一個班級中找出最高分及其學號 void FindMax(float s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農業(yè)建設主要施工設備投入計劃
- 七年級上冊地理課程教學計劃
- 小學五年級班主任家庭教育指導計劃
- 小學美術作品展覽計劃
- 人教版三年級道德與法治家長會計劃
- 部編版七年級上冊語文教學計劃的課外延伸
- 人教版七年級第一學期英語在線學習計劃
- 二年級志愿服務實踐活動課程計劃
- 小學語文復習計劃與考試技巧分享
- 人教部編版三年級上冊《道德與法治》課堂創(chuàng)新計劃
- 常見含麻黃堿類藥物目錄
- Unit 4 Protecting our heritage sites 課文語篇填空-牛津譯林版高中英語選擇性必修第三冊
- GB/T 16955-1997聲學農林拖拉機和機械操作者位置處噪聲的測量簡易法
- GB/T 15593-2020輸血(液)器具用聚氯乙烯塑料
- GB 16410-2007家用燃氣灶具
- 鐵碳合金的相圖解讀
- 2023年復旦大學博士研究生入學考試專家推薦信模板
- 中小學教師資格證面試課件講義
- 全國初中英語優(yōu)質課大賽一等獎《八年級Unit 6An old man》說課課件
- 湖北地區(qū)醫(yī)院詳細名單一覽表
- 麥肯錫入職培訓第一課:讓職場新人一生受用的邏輯思考力新員工培訓教材
評論
0/150
提交評論