機(jī)設(shè)學(xué)習(xí)課件語(yǔ)言第6章指針_第1頁(yè)
機(jī)設(shè)學(xué)習(xí)課件語(yǔ)言第6章指針_第2頁(yè)
機(jī)設(shè)學(xué)習(xí)課件語(yǔ)言第6章指針_第3頁(yè)
機(jī)設(shè)學(xué)習(xí)課件語(yǔ)言第6章指針_第4頁(yè)
機(jī)設(shè)學(xué)習(xí)課件語(yǔ)言第6章指針_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第六章 指 針1指針 (Pointer)1. 指針概念2. 指針變量和指針運(yùn)算3. 指向數(shù)組的指針4. 指向字符串的指針5. 指針數(shù)組和指向指針的指針6. 指針應(yīng)用程序舉例21. 指針的概念指針表示變量等的存儲(chǔ)地址使用指針可以獲得緊湊、高效的代碼使用指針也可能使程序晦澀難懂指針的使用靈活方便指針操作容易出錯(cuò)且難以調(diào)試指針與數(shù)組關(guān)系密切3指針的故事“該程序執(zhí)行了非法操作,即將關(guān)閉”這種錯(cuò)誤絕大部分都是指針和數(shù)組造成的黑客攻擊服務(wù)器利用的 bug絕大部分都是指針和數(shù)組造成的有些用C的人,盡量避免使用指針4關(guān)于指針的原則學(xué)習(xí)原則復(fù)雜的應(yīng)用也不建議使用Keep it simple and stupid

2、 (KISS)使用原則永遠(yuǎn)要清楚每個(gè)指針指向了哪里永遠(yuǎn)要清楚每個(gè)指針指向的地方存放的是什么5指針與地址地址通過(guò)首地址和數(shù)據(jù)類型可以訪問(wèn)內(nèi)存中某一數(shù)據(jù)數(shù)據(jù)類型決定所占用存儲(chǔ)單元數(shù)指針就是地址和類型有關(guān)61、變量與地址 程序中: short i; float k; 內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-地址.2000200120022005內(nèi)存02003ik 編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象指針與地址72、數(shù)組與地址 地址內(nèi)存單元整型數(shù)組元素a0整型數(shù)組元素a1整型數(shù)組元素a2123300030013002300330043005數(shù)組與地址對(duì)照表 數(shù)組名 數(shù)據(jù)類型 長(zhǎng) 度 首地

3、址 a 整型 3 3000程序中:short a3=1,2,3;82. 指針變量和指針運(yùn)算變量的指針和指針變量指針變量的定義地址運(yùn)算符和指針運(yùn)算符指針變量的引用指針的運(yùn)算9變量的指針和指針變量變量的指針變量的地址,即內(nèi)存中存儲(chǔ)某個(gè)變量的存儲(chǔ)單元的首地址可以通過(guò)變量的地址來(lái)間接的訪問(wèn)變量指針變量具有指針類型的變量,專門存放地址數(shù)據(jù)的變量 通過(guò)指針變量可以間接訪問(wèn)變量或內(nèi)存數(shù)據(jù)10.2000200420062005short型變量i10變量i_pointer200120022003指針:一個(gè)變量的地址指針變量:專門存放變量地址的變量2000指針指針變量 變量的內(nèi)容 變量的地址指針變量變量變量地址(

4、指針)變量值指向地址存入指針變量變量的指針和指針變量11如何定義指針變量?定義指針變量int *p;定義了一個(gè)指針變量p,簡(jiǎn)稱指針pp是變量,int* 是類型p里保存一個(gè)地址。此時(shí)這個(gè)地址是哪呢(p指向哪呢)?指針變量初始化p = &a;*p就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)容(在上例和a等價(jià),但尋址方式不同)p可以動(dòng)態(tài)(任意)地指向不同內(nèi)存,從而使*p代表不同的變量12指針變量的定義一般形式基類型 *指針變量名;說(shuō)明“基類型”表示該指針指向的數(shù)據(jù)的類型可以定義基類型為空類型void的指針變量舉例int *pi;char *pc1, *pc2;void *p;13int i,*p;

5、p=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=1.1;判斷是真?是假?指針變量只存放地址!一個(gè)指針變量不能指向與其類型不同的變量!我是真的,你猜對(duì)了嗎?應(yīng)在類型相同的指針變量之間賦值14地址運(yùn)算符 (Address Operator)地址運(yùn)算符 &獲得操作數(shù)的地址(指針)單目運(yùn)算符,自右向左結(jié)合,優(yōu)先級(jí)較高操作數(shù)應(yīng)為各種類型的內(nèi)存變量、數(shù)組元素、結(jié)構(gòu)體成員等操作數(shù)不能是表達(dá)式、常量、寄存器變量舉例scanf(%f, &score);int i, *p=&i;15指針運(yùn)算符 (Indirection Operator)指針運(yùn)算符 *

6、獲得指針指向的內(nèi)存數(shù)據(jù)又稱“間接訪問(wèn)運(yùn)算符”單目運(yùn)算符,自右向左結(jié)合,優(yōu)先級(jí)較高操作數(shù)為具有指針(地址)意義的值舉例int i, *p=&i;(*p)+; /* i+; */16指針變量的引用指針變量也要“先賦值,后使用”沒(méi)有賦值的指針變量所存儲(chǔ)的地址數(shù)據(jù)是不確定的,對(duì)它的引用非常危險(xiǎn)對(duì)指針的賦值要注意類型匹配,必要時(shí)可以使用強(qiáng)制類型轉(zhuǎn)換,但要慎重使用*p可以用于與指針p的基類型相同類型的變量可以使用的任何場(chǎng)合指針變量可以作為函數(shù)的參數(shù)17指針變量引用舉例 int a, b, c, *pa, *pb, *pc;pa = &a;pb = &b;pc = &c;a = 100;printf(“*p

7、a=%dn”, *pa);/ *pa=100 *pb = 200;printf(b=%dn, b);/ b=200 scanf(%d, pc);/ 輸入34 printf(c=%dn, c);/ c=34 18指針變量與所指變量的關(guān)系1020papbabint a, b;int *pa, *pb;pa = &a;pb = &b;*pa = 10;b = 20;pa = pb;pb = &a;&a,&*pa*pa,*&a19指針的運(yùn)算運(yùn)算類型算術(shù)運(yùn)算:加、減、自增、自減關(guān)系運(yùn)算:所有關(guān)系運(yùn)算賦值運(yùn)算:一般賦值、加賦值、減賦值上述運(yùn)算在一定約束條件下才有意義(后詳)變量說(shuō)明p,q是同類型的指針變量

8、n是整型變量20指針的算術(shù)運(yùn)算運(yùn)算方式說(shuō) 明p+np之后第n個(gè)元素的地址p-np之前第n個(gè)元素的地址p+p作為當(dāng)前操作數(shù),然后后移一個(gè)元素+pp后移一個(gè)元素,然后作為當(dāng)前操作數(shù)p-p作為當(dāng)前操作數(shù),然后前移一個(gè)元素-pp前移一個(gè)元素,然后作為當(dāng)前操作數(shù)p-q表示p和q兩者之間的元素個(gè)數(shù)條件:p,q是指向同一數(shù)據(jù)集合(數(shù)組)的指針注意避免數(shù)組越界21指針的關(guān)系運(yùn)算條件p,q是指向同一數(shù)據(jù)集合(數(shù)組)的指針運(yùn)算方式pq、p=q、pqpq) printf(%d, p-q);else printf(%d, q-p);pq3個(gè)short253. 指向數(shù)組的指針指針與數(shù)組的關(guān)系指向數(shù)組的指針通過(guò)指針引用數(shù)

9、組元素指向二維數(shù)組的指針26指針與數(shù)組的關(guān)系數(shù)組名是“常量指針”數(shù)組名表示數(shù)組的首地址,因此數(shù)組名也是一種指針(地址)數(shù)組名表示的地址(指針)不能被修改,所以稱之為“常量指針”數(shù)組的指針數(shù)組的起始地址與數(shù)組名表示的指針相同與數(shù)組的第一個(gè)元素(a0)的地址相同27數(shù)組和指針的用法數(shù)組名不能被賦值和修改,可以直接使用, 若指針指向數(shù)組,則兩者的其他用法基本相同定義指針時(shí),只分配一段用來(lái)存放地址的空間,而沒(méi)有分配存放數(shù)據(jù)的空間定義數(shù)組時(shí),為所有元素分配相應(yīng)的連續(xù)的存儲(chǔ)空間,但沒(méi)有存放地址的空間指針應(yīng)賦值后才能使用28指向數(shù)組的指針char a10, *p;p = &a0;char a10, *p=&

10、a0;char a10, *p;p = a;char a10, *p=a;ap&a029通過(guò)指針引用數(shù)組元素當(dāng)一個(gè)指針變量指向數(shù)組或某個(gè)數(shù)組元素時(shí),可以通過(guò)這個(gè)指針變量引用所有的數(shù)組元素引用數(shù)組元素的方法下標(biāo)運(yùn)算符,例如ai、pi指針運(yùn)算符*,例如*(a+i)、*(p+i)注意數(shù)組名不能被修改和賦值注意防止下標(biāo)越界30通過(guò)指針引用數(shù)組元素圖示p0, *p, *ap, ap+1, a+1p1, *(p+1), *(a+1)q+i-2, p+i, a+ipi, *(p+i), *(a+i)qi-2, *(q+i-2), p+9, a+9p9, *(p+9), *(a+9)q, p+2, a+2p2

11、, *(p+2), *(a+2) q0, *q31數(shù)組名和指針引用數(shù)組元素比較 (1)指針指向數(shù)組首地址前提條件:int a10, *p=a;ai、pi、*(a+i)、*(p+i)等用法都是合法的,且它們都表示同一個(gè)數(shù)組元素a+i(或p+i)不是簡(jiǎn)單的在a(或p)表示的地址值上簡(jiǎn)單的加i,而是加上i個(gè)基類型所需的地址偏移量,即加上i*sizeof(int)指針值可以改變,如p+為下一元素的地址數(shù)組名的值不能修改,如a+是非法操作32數(shù)組名和指針引用數(shù)組元素比較 (2)指針指向某個(gè)數(shù)組元素前提條件:p=a+i;*(p+)與ai+等價(jià)*(p-)與ai-等價(jià)*(+p)與a+i等價(jià)*(-p)與a-i等

12、價(jià)注意不能使用*(a+)或a=p+i這種形式注意區(qū)分運(yùn)算順序,*(p+)與(*p)+注意防止下標(biāo)越界,注意掌握指針位置33有一個(gè)整型數(shù)組a,有10個(gè)元素,要求輸出數(shù)組中的全部元素。 1.下標(biāo)法 #include int main() int a10, i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,ai); printf(%n); return 0; 34(2) 通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值 #include int main()

13、int a10, i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,*(a+i); / *(a+i) 和 ai 等價(jià) printf(n); return 0; 35(3) 用指針變量指向數(shù)組元素 #include int main() int i,*p,a10,; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(p=a;p=(a+9);p+) / 數(shù)組

14、名a賦值給p /a+9表示 數(shù)組最后一個(gè)元素a9的起始地址 printf(“%d ”,*p); printf(n); return 0; 36#include int main() int i,*p,a10; printf(please enter 10 integer numbers:); for(p=a,i=0;i10;i+) / 用指針變量輸入,要將數(shù)組起始地址賦值給p scanf(“%d”,p+); /指針向后移動(dòng) p=a; /指針重新指向數(shù)組起始位置 for(i=0;i10;i+,p+) /用指針變量p直接指向數(shù)組元素 printf(%d ,*p); printf(n); retur

15、n 0;373種方法的比較: 第(1)和第(2)種方法執(zhí)行效率相同 編譯系統(tǒng)是將ai轉(zhuǎn)換為*(a+i)處理的,即先計(jì)算元素地址。因此用第(1)和第(2)種方法找數(shù)組元素費(fèi)時(shí)較多。第(3)種方法比第(1)、第(2)種方法快 用指針變量直接指向元素,不必每次都重新計(jì)算地址,像p+這樣的自加操作是比較快的這種有規(guī)律地改變地址值(p+)能大大提高執(zhí)行效率用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素。 用地址法或指針變量的方法不直觀,難以很快地判斷出當(dāng)前處理的是哪一個(gè)元素。384. 指向字符串的指針字符串是存放在字符數(shù)組中的。引用一個(gè)字符串,可以用以下兩種方法。(1) 用字符數(shù)組存放一個(gè)字符串,可以通過(guò)數(shù)組

16、名和格式聲明“%s”輸出該字符串,也可以通過(guò)數(shù)組名和下標(biāo)引用字符串中一個(gè)字符。(2) 用字符指針變量指向一個(gè)字符串常量,通過(guò)字符指針變量引用字符串常量。39直接用字符指針指向字符串字符串常量可對(duì)字符指針直接賦值這是把字符串常量的地址賦給字符指針不是把字符串的內(nèi)容賦給字符指針使用字符指針可以修改字符串的內(nèi)容注意防止越過(guò)原字符串常量的范圍注意字符串末尾應(yīng)保留結(jié)束標(biāo)志040字符串(String)與字符數(shù)組、字符指針字符串一串以0結(jié)尾的字符在C語(yǔ)言中被看作字符串用雙引號(hào)括起的一串字符是字符串常量,C語(yǔ)言自動(dòng)為其添加0終結(jié)符C語(yǔ)言并沒(méi)有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來(lái)處理字符數(shù)

17、組每個(gè)元素都是字符類型的數(shù)組char string100;字符指針指向字符類型的指針char* p;41字符指針變量與字符數(shù)組的區(qū)別定義方法不同 char str10; char *ptr;賦值方法和含義不同 char str10; str = ”china”; strcpy(str,”china”); char *ptr; ptr = ”china”;/*錯(cuò)誤*/*正確*/*正確*/42字符指針變量與字符數(shù)組的區(qū)別在定義一個(gè)數(shù)組時(shí),在編譯時(shí)即分配單元,有確定地址,而定義一個(gè)字符指針變量時(shí),如未對(duì)它賦初值,則其所指數(shù)據(jù)是不定的,因而使用是危險(xiǎn)的。例如,輸入字符串時(shí) char str10; sc

18、anf(%s, str); char *a; scanf(%s, a); char *a; char str10; a = str; scanf(%s, a); /*錯(cuò)誤*/*正確*/*正確*/43字符指針變量與字符數(shù)組的區(qū)別初始化含義不同 char *pstr = ”china”; 等價(jià)于 char *pstr; pstr = ”china”; char str14 = ”china”;不等價(jià)于 char str14; str = ”china”;字符指針是變量,而數(shù)組名是地址常量44字符數(shù)組和字符指針變量比較 (1)定義char astr=Hello, World!;char *pstr=Hello, World!;數(shù)組在定義時(shí)分配存放若干字符的空間指針定義時(shí)只分配存放一個(gè)地址的空間Hello, World!0 pstr:Hello, World!0astr:45字符數(shù)組和字符指針變量比較 (2)字符數(shù)組可以直接使用; 指針要先指向一個(gè)字符串后才能使用字符串常量只能對(duì)數(shù)組賦初值; 指針可以用字符串常量或字符數(shù)組任意賦值,但只是把字符串的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論