(演示)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(c語言)-第7章+指針.ppt_第1頁
(演示)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(c語言)-第7章+指針.ppt_第2頁
(演示)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(c語言)-第7章+指針.ppt_第3頁
(演示)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(c語言)-第7章+指針.ppt_第4頁
(演示)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(c語言)-第7章+指針.ppt_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1,第7章 指針,2,內(nèi)容提要,指針的概念; 用指針做函數(shù)參數(shù); 字符數(shù)組和字符指針 指向數(shù)組的指針與指針數(shù)組 動(dòng)態(tài)內(nèi)存分配函數(shù)及其應(yīng)用;,3,存儲(chǔ)器,存儲(chǔ)器是計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)和程序的記憶單元集合 每個(gè)記憶單元由8位二進(jìn)制位組成。cpu可讀寫其中的數(shù)據(jù)。 分外存和內(nèi)存.,內(nèi)存示意圖,地址0F01,數(shù)據(jù),存儲(chǔ)容量單位:,回顧,4,內(nèi)存中的每個(gè)字節(jié)都有唯一的一個(gè)地址 地址按字節(jié)編號(hào),按類型分配空間 內(nèi)存可以隨機(jī)訪問,只要指明要訪問的內(nèi)存單元的地址,就可以立即訪問到該單元,內(nèi)存,回顧,5,尋址方式,程序中如何讀寫內(nèi)存中的數(shù)據(jù)? 通過變量的地址訪問變量所在的存儲(chǔ)單元(尋址) 兩種尋址方式 直接尋址 通過

2、變量名直接存取變量?jī)?nèi)容的訪問方式. 間接尋址 通過指針變量來間接存取它所指向的變量的訪問方式,6,為什么引入指針的概念,指針 為函數(shù)提供修改變量值的手段 為C的動(dòng)態(tài)內(nèi)存分配系統(tǒng)提供支持 為動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹等)提供支持 可以改善某些子程序的效率,7,指針的概念,指針:另一個(gè)變量的首地址 變量的指針就是變量的地址. 指針變量:一種特殊的變量,存放地址的變量,用于間接訪問其他變量,8,指針變量的定義,一般形式 類型關(guān)鍵字 *標(biāo)識(shí)符 int *p; 定義了一個(gè)指針變量p,簡(jiǎn)稱指針p p是變量,int*是類型 指針變量初始化 p = *p就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)

3、容 p可以動(dòng)態(tài)(任意)地指向不同內(nèi)存,從而使*p代表不同的變量,9,指針變量的定義,例 :int i,*i_pointer=,這個(gè)變量定義的語句都包含了那些內(nèi)容? 變量有兩個(gè),整型變量i和i_pointer “*”:指針類型說明符,在變量定義時(shí)出現(xiàn)在變量名前面的 表示該i_pointer變量為指針變量 該指針變量i_pointer是指向整型變量的指針 可以對(duì)i賦值,是直接尋址 *i_pointer=3; 可以對(duì)i賦值,是間接尋址 *:指針運(yùn)算符 *i_pointer:代表指針變量i_pointer所指向的變量,11,指針變量與其它類型變量的對(duì)比,共性 在內(nèi)存中占據(jù)一定大小的存儲(chǔ)單元 先定義,后

4、使用 特殊性 它的內(nèi)容只能是地址,而不能是數(shù)據(jù) 必須初始化后才能使用,否則指向不確定的存儲(chǔ)單元,對(duì)該空間進(jìn)行訪問,將可能造成危險(xiǎn) 可參與的運(yùn)算:加、減一個(gè)整數(shù),自增、自減、關(guān)系、賦值 只能指向同一基類型的變量,12,指針變量的應(yīng)用,main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1= ,13,指針變量的應(yīng)用對(duì)輸入的兩個(gè)數(shù)按大小順序輸出,main() int *p1,*p2,*p,a,b; scanf(%d%d, ,14,指針變量作為函數(shù)參數(shù),函數(shù)的參數(shù)可以是指針變量,作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中,指針變量

5、做函數(shù)參數(shù)的經(jīng)典例子: 兩數(shù)的互換,15,編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換,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); ,運(yùn)行結(jié)果?,16,編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換(使用指針),void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp; main() int a, b;*p1,*p2 a = 15; b = 8; p1= ,運(yùn)行

6、結(jié)果?,17,編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換(使用指針),void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp; main() int a, b; a = 15; b = 8; Swap( ,運(yùn)行結(jié)果?,18,數(shù)組、指針、指針變量,數(shù)組名代表數(shù)組的首地址,也就是一個(gè)指針,只是不能修改 指針也可當(dāng)作數(shù)組名使用,數(shù)組元素的指針是數(shù)組元素的地址 例: int a4,*pa; pa=,19,指針?biāo)阈g(shù)運(yùn)算,int *p, a10; p = a; p+; /*p的值增加多少?*/ 指針的加減運(yùn)算是以其指向的類型的字節(jié)長(zhǎng)度為單位的,6000

7、 6001 6002 6003 6004 6005 6006,20,指針與一維數(shù)組的關(guān)系的示例 教材264頁,設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素: 1.使用數(shù)組下標(biāo) 2.使用數(shù)組名 3.使用指針變量,21,指針與數(shù)組的關(guān)系示例,使用數(shù)組下標(biāo) main() int a10; int i; for(i=0; i10; i+) scanf(%d, ,22,使用數(shù)組名 main() int a10; int i; for(i=0; i10; i+) scanf(%d, ,指針與數(shù)組的關(guān)系示例,23,使用指針變量 main() int a10,*p; p=a; int i; for(

8、i=0; i10; i+) scanf(%d,p+i); printf(n); for(i=0; i10; i+) printf(%d,*(p+i); ,指針與數(shù)組的關(guān)系示例,24,指針與數(shù)組的關(guān)系示例,使用指針變量 main() int a10, *p; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p); ,去掉p=a可以嗎? 為什么?,25,小結(jié):數(shù)組元素的幾種等價(jià)引用形式,數(shù)組元素的幾種等價(jià)引用形式 1.下標(biāo)法: ai, a3 2.指針法:通過指向數(shù)組元素的指針找到數(shù)組元素 *(a+i)

9、, *(a+3), pi,*(p+i) 說明: 如果指針變量p已經(jīng)指向數(shù)組中的元素,則p+1指向同一數(shù)組中的下一個(gè)元素。(而不是將p的值簡(jiǎn)單的加1) 如果p的初值為 字符指針 指向字符類型的指針 char *p; 數(shù)組和指針可以等同看待,上面三者本質(zhì)上相同,28,字符指針變量與字符數(shù)組的區(qū)別,定義方法不同 char str10; char *ptr; 賦值方法不同 數(shù)組: char str10= ”china”; strcpy(str,”china”); 指針 char *ptr; ptr = ”china”;,字符指針是變量,而數(shù)組名是地址常量。,29,使用字符指針的注意事項(xiàng),字符指針變量必

10、須有明確的指向,否則使用是危險(xiǎn)的 例如,輸入字符串時(shí) char *a; scanf(%s, a); /*錯(cuò)誤*/ 應(yīng)為: char *a; char str10; a = str; scanf(%s, a); /*正確*/,30,例7.5 :字符串拷貝,方法一:用字符數(shù)組編程 方法二:用字符指針編程,教材260頁見 程序示例,31,內(nèi)存空間映像,靜態(tài)(全局)數(shù)據(jù)區(qū):存放全局變量和靜態(tài)變量,變量的生存期是整個(gè)程序執(zhí)行期間. 堆:用動(dòng)態(tài)內(nèi)存分配函數(shù)申請(qǐng)的內(nèi)存在此分配,存放動(dòng)態(tài)數(shù)據(jù)。生存期由程序員決定 棧:由編譯器自動(dòng)分配和釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。,32,動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)教材288頁,動(dòng)態(tài)分配內(nèi)存 申請(qǐng)內(nèi)存的函數(shù)的函數(shù)原型:在 定義 void* malloc(unsigned int size); 向系統(tǒng)申請(qǐng)大小為size的內(nèi)存塊,把首地址返回。如果申請(qǐng)不成功,返回NULL void*:一種指針類型,具有一般性,稱為普通指針,void*類型的指針可以指向任意類型的變量 釋放內(nèi)存的函數(shù)的函數(shù)原型: void free(void* p); 釋

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論