C語言程序設計(第8章)課件_第1頁
C語言程序設計(第8章)課件_第2頁
C語言程序設計(第8章)課件_第3頁
C語言程序設計(第8章)課件_第4頁
C語言程序設計(第8章)課件_第5頁
已閱讀5頁,還剩50頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 8 章 指 針C 語言程序設計 第1頁,共55頁。課前預習檢查 1. 什么是指針? 2. 變量的指針和指針變量。 3. 指向數組的指針和指針數組 4. 指向函數的指針和指針函數第2頁,共55頁。 教學目的與要求: 1. 理解指針的概念和作用 2. 掌握指針變量和變量的指針 3. 掌握通過指針引用數組 4. 掌握指針引用字符串 5. 掌握函數指針和指針函數 6. 掌握指針數組 7. 理解內存的動態分配 8. 熟練運用指針編寫程序第3頁,共55頁。8.1 指針的概念8.2 指針變量8.3 通過指針引用數組8.4 通過指針引用字符串8.5 指向函數的指針8.6 返回指針值的函數8.7 指針數組和

2、多重指針8.8 內存的動態分配第4頁,共55頁。 8.1 指針的概念 地 址第5頁,共55頁。 8.1 指針的概念 (1)直接訪問 (2)間接訪問 (3)變量的指針 (4)指針變量 (5)指針變量的值第6頁,共55頁。 例 82 通過指針變量訪問整型變量。指針變量的定義 int *p; float *p1, *p2; char *p3, *p4; 8.2 指 針 變 量第7頁,共55頁。 注意事項: (1)指針變量前面的“*”表示該變量的類型為指針型變量。 (2)在定義指針變量時必須指定基類型。 (3)指針類型的表示( 例: int *)。 (4)指針變量中只能存放地址,不要將一個數賦給一個指

3、針變量。 8.2 指 針 變 量第8頁,共55頁。 指針變量的引用 (1)給指針變量賦值。 (2)引用指針變量指向的變量。 (3)引用指針變量的值。 運算符 & :取地址運算符 * :指針運算符 8.2 指 針 變 量第9頁,共55頁。 例 83 輸入a和b兩個數,按先大后小的順序輸出a和b。 練習1 分析程序的運行結果。 8.2 指 針 變 量第10頁,共55頁。 指針變量作為函數的參數 作用:將一個變量的地址傳送到另一個函數中。 例 84 例 85 例 86 輸入a和b兩個數,按先大后小的順序輸出a和b,用函數處理,并用指針類型的數據作函數參數。 8.2 指 針 變 量第11頁,共55頁。

4、 例 87 輸入3個數a, b, c,按先大后小的順序輸出,用函數處理,并用指針類型的數據作函數參數。 8.2 指 針 變 量第12頁,共55頁。數組元素的指針 int a5= 2, 4, 8, 6, 7 ; int *p; p=&a0; 或 p=a;引用數組元素時指針的運算 p+1 p-1 p+ + + +p p2 p1 8.3 通過指針引用數組第13頁,共55頁。通過指針引用數組元素引用數組元素的方法: 下標法 ai 指針法 *(a+i) *(p+i) 例 88 用數組名下標法引用數組元素 8.3 通過指針引用數組第14頁,共55頁。 例 89 用指針下標法引用數組元素 例 90 用數組名

5、法引用數組元素 例 91 用指針變量法引用數組元素 8.3 通過指針引用數組第15頁,共55頁。 例 92 用指針變量的自增運算引用數組元素注意:指針變量的當前值 例 93 8.3 通過指針引用數組第16頁,共55頁。練習2分析以下情況各式的返回值: int a5=1,2,3,4,5; int *p=a; (1) p+ *p (2) *p+ (3) *(p+) *(+p) (4) +(*p) (*p)+ 8.3 通過指針引用數組第17頁,共55頁。用數組名作函數參數 例 94 實參形參都是數組名 例 95 實參數組名,形參指針變量 例 96 實參指針變量,形參數組名 例 97 實參形參都是指針

6、變量 8.3 通過指針引用數組第18頁,共55頁。通過指針引用多維數組 多維數組元素的地址 aij *(ai+j) *(*(a+i)+j) 8.3 通過指針引用數組第19頁,共55頁。指向多維數組元素的指針變量(1)指向數組元素的指針變量 例 98 aij在數組中相對位置公式: i*m+j 例 99 8.3 通過指針引用數組第20頁,共55頁。(2)指向由m個元素組成的一維數組的指針變量 例 100 8.3 通過指針引用數組第21頁,共55頁。用指向數組的指針作函數參數 例 101 有一個班3名學生,各學4門課程,輸出第N個學生的成績。 8.3 通過指針引用數組第22頁,共55頁。字符串的引用

7、方式用字符數組處理字符串 例 102 用字符指針變量處理字符串 例 103 8.4 通過指針引用字符串第23頁,共55頁。 例 104 例 105 將字符串a復制為字符串b,然后輸出字符串b。 8.4 通過指針引用字符串第24頁,共55頁。 字符指針作函數參數 例 106 將字符串a復制為字符串b,然后輸出字符串b。 操作函數 8.4 通過指針引用字符串第25頁,共55頁。易引起緩沖區溢出攻擊、不安全的函數: gets()、scanf()、strcpy()等不限制字符串長度,不對數組越界進行檢查和限制,導致有用的堆棧數據被覆蓋,給黑客攻擊以可乘之機。對緩沖區溢出漏洞進行攻擊的后果:程序運行失敗

8、、系統崩潰和重啟;取得非法授權第26頁,共55頁。 字符指針變量和字符數組的比較 (1)char *pstr=hello/等價于 char *pstr; /存儲在常量存儲區 pstr= hello pstr的值(指向)可修改,但所指向的字符串常量不可修改 gets(pstr); *pstr=w;/都是錯誤的 但pstr = china 8.4 通過指針引用字符串第27頁,共55頁。(2)char str = china char *pstr = str; 或者= &str0 *pstr=w/可以的 str0=w,pstr0= w/等價的數組名str的值不可修改,是地址常量str=“hello”

9、/錯誤但數組中存儲的字符可修改 第28頁,共55頁。字符指針要牢記的幾個原則:明確字符串被保存到了哪里?字符指針指向了哪里?char *pstr =“china”;gets(pstr);/不可修改,常量char str = china;char *pstr =str;gets(pstr);第29頁,共55頁。8.6 返回指針值的函數字符串str1 =“hello”字符串str2 = “chian”,連接后str1 = “hellochina”程序第30頁,共55頁。 例 110 有a個學生,每個學生有b門課程的成績。要求在輸入學生序號以后,能輸出該學生的全部成績。用指針函數實現。 8.6 返回

10、指針值的函數第31頁,共55頁。 什么是函數指針 編譯時,編譯系統為函數代碼分配一段存儲空間,這段存儲空間的起始地址(入口地址)稱為這個函數的指針。函數指針的定義和使用: 類型名 ( *指針變量名 ) ( 函數參數表列 ); int (*f)(int a, int b);/正確 8.5 指向函數的指針第32頁,共55頁。int (*f)(int a, int b);/正確常見錯誤:1、忘了寫前一個()int * f(int a,int b);/返回整型指針2、忘了寫后一個()int (*f)/定義整型指針變量3、定義時后一個括號內的參數類型與指向的函數參數類型不匹配 例如:int (*f) (

11、float a,float b); int (*f) ( );/不建議成這樣第33頁,共55頁。 例 107 函數指針變量調用函數 例 108 輸入兩個整數,根據選擇1或2調用max函數或min函數,輸出二者中最大或最小數。 8.5 指向函數的指針第34頁,共55頁。 用指向函數的指針作函數參數 例 109 輸入兩個整數,根據選擇1、2或3,輸出二者中最大、最小數或二者之和。 通用函數排序 8.5 指向函數的指針第35頁,共55頁。函數定義的一般形式 類型名 *函數名(參數表列) 函數體 8.6 返回指針值的函數第36頁,共55頁。 指針數組 一個數組,若其元素均為指針類型數據,稱為指針數組。

12、 類型名 *數組名 數組長度 ; 例 111 將若干字符串按由小到大輸出。 8.7 指針數組和多重指針第37頁,共55頁。 指向指針數據的指針 類型名 * 指針變量; 例 112 輸出多個字符串。 8.7 指針數組和多重指針第38頁,共55頁。 什么是內存的動態分配 棧(stack) 非靜態局部變量分配在內存中的動態存儲區中,這個存儲區稱為棧。 堆(heap) C語言允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,需要時隨時開辟,不需要是隨時釋放。這個自由的存儲區稱為堆。8.8 內存的動態分配第39頁,共55頁。建立內存的動態分配(1)malloc函數 函數

13、原型: void *malloc ( unsigned int size ); 作用: 在內存的動態存儲區中分配一個長度為size的連續空間。8.8 內存的動態分配第40頁,共55頁。指針不能與非指針類型變量進行比較但可與NULL(0值)進行相等或者不等的關系運算 p =(int *)malloc(n*sizeof(int);if(p = NULL) /判斷p是否為空指針printf(分配失敗“); exit(0);例子:學生成績管理第41頁,共55頁。函數的返回值: 是所分配的區域的第一個字節的地址。使用方法: int *p; p=(int *) malloc ( sizeof ( int

14、) );8.8 內存的動態分配第42頁,共55頁。(2)calloc函數 函數原型: void *calloc ( unsigned n, unsigned size ); 作用: 在內存的動態存儲區中分配n個長度為size的連續空間。 p= calloc ( 50, 4 );8.8 內存的動態分配第43頁,共55頁。(3)free函數 函數原型: void *free ( void *p); 作用: 釋放指針變量p所指向的動態空間。8.8 內存的動態分配第44頁,共55頁。(4)realloc函數 函數原型: void *realloc ( void *p, unsigned int siz

15、e); 作用: 改變通過malloc函數和calloc函數獲得的動態空間的大小。 #include 8.8 內存的動態分配第45頁,共55頁。常見的內存錯誤分類1內存分配未成功,卻使用了它2內存分配成功,但尚未初始化就引用它3內存分配成功,且已經初始化,但操作越界4釋放了內存,卻繼續使用它5沒有釋放內存,造成內存泄露第46頁,共55頁。1內存分配未成功,卻使用了它起因:沒有意識到內存分配會不成功對策:在使用內存前檢查指針是否為空指針 if(p = NULL) /判斷p是否為空指針 printf(分配失敗“); exit(0);第47頁,共55頁。2內存分配成功,但尚未初始化就引用它起因:沒有初

16、始化概念,誤認為內存的默認值都是0對策 即使是賦0值也不可省略,不要嫌麻煩 int *p = NULL;第48頁,共55頁。3內存分配成功,且已經初始化,但操作越界例如使用數組時常發生下標”多1“,或者”少1“的操作對策用循環語句遍歷數組元素時,注意下標從0開始。使用strcpy(),gets();mencpy()等函數時要小心char a100, b50;memcpy(b,a,sizeof(b)char a100, b50;memcpy(b,a,sizeof(a)第49頁,共55頁。4釋放了內存,卻繼續使用它起因:指針指向的內存被釋放,并不表示指針會消亡。其地址仍然不變(非NULL),只是該

17、地址對應的內存是垃圾(無效內存塊)指向垃圾內存的指針是野指針(懸空指針)free(pstr);if(pstr != NULL)/不起作用strcpy(pstr,abc);試圖修改已經釋放的內存會引起程序崩潰例子第50頁,共55頁。對策:不要把局部變量的地址作為函數返回值返回,因為該內存在函數體結束時被自動釋放。盡量把free集中在函數的出口處。如不能,則指針free后立即將其置為NULLfree(p);p = NULL;第51頁,共55頁。沒有釋放內存,造成內存泄露void init(void)p1= (char*)malloc(256); if(NULL =p1) return ; p2 =

18、 (char*)malloc(256); if(NULL =p2) return ;p3 = (char*)malloc(256); if(NULL =p3) return ; free(p1); free(p2); free(p3);Exit: if(p1) free(p1); if (p2) free(p2); if (p3) free(p3);void init(void)p1= (char*)malloc(256); if(NULL =p1) goto Exit; p2 = (char*)malloc(256); if(NULL =p2) goto Exit;p3 = (char*)malloc(256); if(NULL =p3) goto Exit;void init(void)p1= (char*)malloc(256); if(NULL =p1) return ; p2 = (char*)malloc(256); if(NULL =p2) free(p1); return ;p3 = (char*)malloc(256); if(NULL =p3) free(p1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論