C語(yǔ)言課件第五章指針.ppt_第1頁(yè)
C語(yǔ)言課件第五章指針.ppt_第2頁(yè)
C語(yǔ)言課件第五章指針.ppt_第3頁(yè)
C語(yǔ)言課件第五章指針.ppt_第4頁(yè)
C語(yǔ)言課件第五章指針.ppt_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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、第五章 指 針,5.1 指針的概念,指針是C語(yǔ)言的重要特征,是C語(yǔ)言訪問(wèn)內(nèi)存數(shù)據(jù)和程序的靈活 和有效的手段。,C語(yǔ)言的指針支持: 函數(shù)的地址調(diào)用; 動(dòng)態(tài)分配內(nèi)存; 數(shù)組的地址引用。,內(nèi)存、地址、指針,內(nèi)存存放了計(jì)算機(jī)正在運(yùn)行的程序和程序正在使用的數(shù)據(jù)。內(nèi) 存的基本單元是字節(jié)(Byte)。,為了訪問(wèn)內(nèi)存單元,CPU給每個(gè)內(nèi)存單元一個(gè)編號(hào),該編號(hào)稱 為該內(nèi)存單元的地址。,變量是程序中可以改變的量,當(dāng)說(shuō) 明變量時(shí),系統(tǒng)將為其在內(nèi)存中開(kāi)辟相 應(yīng)得內(nèi)存單元。由此確定變量的地址及 內(nèi)存中的表示方式。,2000H,2001H,2002H,2003H,int a=0;,a 的 內(nèi) 存 單 元,a的地址,標(biāo)識(shí)符

2、命名的指針變量名。,指針標(biāo)志。,指針指向?qū)ο蟮念愋汀?int *p, *q; /* p、q是指向整型變量的指針。*/,float *pfValue ,*pf; /* pfValue和pf是指向浮點(diǎn)型的指針。*/,指針的引用,定義指針的目的是通過(guò)指針引用內(nèi)存對(duì)象,指針的引用應(yīng)按如 下步驟進(jìn)行:,說(shuō)明指針,int a=0, *p;,指針指向?qū)ο?p=,通過(guò)指針引用對(duì)象,*p=*p+2;,指針操作的兩種運(yùn)算:,取地址運(yùn)算 ,2000H,a,p,p= /* p指向a。 */,2000H,*p=2;,2,舉例:,#include void main (void ) int x ,*p; x=55; p=

3、 ,2000H,x,p,2000H,55,65,關(guān)于指針的說(shuō)明:,指針必須指向?qū)ο蠛?,才能引用?int *p; *p=2; /* Error! */, p= 則: p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+; /*含義指向a后的整型單元*/,2002H,2002H,p1- -; /*指向a前的整型單元*/,p1+n; /*指向a后的n個(gè)整型單元*/,p1- n; /*指向a前的n個(gè)整型單元*/,p2- p1; /*a和b之間差的單元數(shù)*/,結(jié)果 200H,p n 相當(dāng)于: p的實(shí)際內(nèi)容 nsizeof(*p);,六種關(guān)系運(yùn)算,比較兩個(gè)同類型變量之間的地

4、址關(guān)系。,p1p2;,指針運(yùn)算說(shuō)明,#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1= ,差別,a,指針指向數(shù)組,p=a; /*指向數(shù)組的首地址*/ p= /*指向數(shù)組的首地址*/,通過(guò)指針引用數(shù)組元素,當(dāng)指針指向數(shù)組的首地址時(shí),則下標(biāo)為i的元素地址為: p+i 或a+i,引用數(shù)組元素可以有三種方法:,下標(biāo)法: a i 指針?lè)ǎ?*(p+i) 數(shù)組名法:*(a+i),注意:數(shù)組名是地址常量,不能改變!,a=p; /*Error!*/,舉例:打印數(shù)組中的奇數(shù)。,#include void main(void ) int i ,a 10

5、; for (i=0 ; i10 ; i+ ) scanf ( “ %d” , ,數(shù)組元素法。,循環(huán)輸入。,循環(huán)判斷,滿足條件輸出。,數(shù)組名法。,a+i,*(a+i),指針?lè)ā?*p ;,p = a;,p+,*(p+i),結(jié)果是否 正確?,p= a; *p=*,注意指針在運(yùn)算時(shí)的變化。,指針與字符串(字符數(shù)組),字符串在內(nèi)存中可以存儲(chǔ)為兩種形式:,字符數(shù)組 字符串常量,可以使指針指向字符數(shù)組或字符串常量,通過(guò)指針引用字符數(shù) 組或字符串的各個(gè)字符。,指針與字符數(shù)組:,char *chp,ch =”Hello!”; /*說(shuō)明字符指針和字符數(shù)組*/ chp=ch; /*指針指向字符數(shù)組*/ putc

6、har( *(chp+2); /*通過(guò)指針引用數(shù)組元素*/,指針與字符串:,char *chp; /*說(shuō)明字符指針*/ chp=“Hello!”; /*指針指向字符串*/ puts(chp); /*通過(guò)指針引用字符串*/,說(shuō)明指針時(shí),可以同時(shí)賦初值,如:,char *chp=“Hello!”;,賦值表示將字符串的地址賦給指針!,將無(wú)符號(hào)的八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)。,#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn”,n); ,p指向s數(shù)組。

7、,輸入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,chp5ex5,思考題:將4位十六進(jìn)值字符串轉(zhuǎn)化為十進(jìn)制字符串。,二維數(shù)組的地址,如下說(shuō)明數(shù)組 int a34=1,2,3,4,5,6,7,8,9,10,11,12;,其二維結(jié)構(gòu)如下:,行,列,為了便于索引,C語(yǔ)言將數(shù)組分為兩級(jí)管理。,a0,a1,a2,將a理解為一維數(shù)組, 數(shù)組有三個(gè)元素,它們分別為a0、 a1,a2 。各個(gè)元素又是一個(gè)有四個(gè)元素的一維數(shù)組。,從地址的角度看: a 為a0 第一行的首地址 a+1 為a1 第二行的首地址 a+2 為a2 第三行的首地址,a+1

8、地址一次加一行。,i行j列數(shù)組元素的地址可以由a i +j得到。,數(shù)組名地址的兩級(jí)管理,a,a0,a1,a2,a00 a01 a02,a10 a11 a12,a20 a21 a22,等價(jià)地址及其管理方式,數(shù)組名是數(shù)組的地址,而且是常量,* 運(yùn)算不改變其值!,以下三種地址等價(jià):,a+i,*(a+i),a i ,加法按行遞增,加法按列遞增,(a+1)+1,*(a+1)+1,差別?,數(shù)組名表示數(shù)組元素,a i j ,*(a+i) j ,*(*(a+i)+j),*(a i +j),指針與二維數(shù)組,int *p, a34; p=a; aij *(p+4*i+j)等價(jià)!,a00,a,a01,a02,a0,

9、a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,舉例: 在數(shù)組a中查找輸入的數(shù),輸出行列位置。,#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d” , ,下標(biāo)法。,*(a i +j),*(*(a+i)+j),*(p+4*i+j),思考題:下列程序輸出的結(jié)果是?,#include #include void main(void) char arr24; strcpy(arr,”you”); strcpy(arr1,”

10、me”); arr03= ,5.3 指 針 數(shù) 組,指針是存放其它數(shù)據(jù)對(duì)象地址的變量。因此,指針可以構(gòu)成數(shù) 組。每個(gè)數(shù)組元素為一個(gè)指針變量,且在內(nèi)存中連續(xù)存放。,指針數(shù)組的說(shuō)明,說(shuō)明格式: type *數(shù)組名const exp;,int *p 4 ;,含義是在內(nèi)存中開(kāi)辟空間,并指明元素所指向的對(duì)象的類型。,數(shù)組名p為數(shù)組的地址。,使用前必須讓各元素指向?qū)ο蟆?int i, a34, *p3; for(i=0;i3;i+) p i =a i ; *(pi+j)=2; /*通過(guò)指針數(shù)組引用數(shù)組元素aij*/,指針數(shù)組的應(yīng)用舉例,指針數(shù)組與多維數(shù)組,通過(guò)指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。,#inclu

11、de void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int *p3= a0, a1, a2 ; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d” , *(pi+j); printf ( “n” ) ; ,p0,數(shù)組a的二維結(jié)構(gòu),p1,p2,a0,a1,a2,每輸出一行,打印回車。,指針數(shù)組與多字符串,通過(guò)指針數(shù)組構(gòu)成的菜單,執(zhí)行DOS命令。,#include void main(void ) char *command = “dir”, “time”, “

12、date”, ch ; for ( ; ; ) do printf (“1: directoryn”) ; printf (“2:set timen” ) ; printf (“3:set daten”) ; printf (“4:quitn”) ; printf (nselection:”) ; ch =getchar( ) ; printf (“n”) ; while (ch4) ; if (ch=4) break; system (commandch-1) ; ,內(nèi)層循環(huán)輸入選項(xiàng),外層循環(huán)根據(jù)選項(xiàng)執(zhí)行命令,執(zhí)行系統(tǒng)命令函數(shù),如:system(“dir”);,3-1 2,chp5ex3,5

13、.4 指向指針的指針,如果指針變量的內(nèi)容存放其它指針的地址,稱該指針為指向指 針的指針。,指向指針的指針的說(shuō)明:,形式: type *p;,int *p;,p是一個(gè)指向整形指針的指針。,#include void main ( void) int x, *p, *q ; x=10; p= ,p為指向整型的指針。,q為指向整型指針的指針。,x,p,q,2000H,3000H,10,2000H,3000H,指向指針的指針的應(yīng)用,指向指針的指針一般用于多維數(shù)組和指針數(shù)組的操作。,多維數(shù)組,#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,1

14、2, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ; for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d” , *( *(p+i)+ j ) ) ; printf (“n”) ; ,ai,aij,arr,arr,p,p+1,多字符串,#include void main (void) char *name = “one” , “two” , “three” , “four” ; char *p ; int i ; for ( i=0 ; i4 ; i+) p=name+i ; printf (“%sn”, *p) ; ,p,name+i,5.5 指針的類型問(wèn)題,通過(guò)指針可以訪問(wèn)基本類型的變量及數(shù)組,指針的類型是其指 向數(shù)據(jù)的類型,該類型決定了指針邏輯加一時(shí)所加的物理字節(jié)數(shù)。,C語(yǔ)言定義了一個(gè)空類型(void)??疹愋蛯?duì)于變量代表內(nèi)存 中的一個(gè)字節(jié)。指向空類型的指針,在邏輯加1時(shí)地址也加1。,void a, *p; p= ,可以強(qiáng)制轉(zhuǎn)換指針的類型,轉(zhuǎn)換方式為:,(type *) p,#include void mai

溫馨提示

  • 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)論