《解析C程序設(shè)計》高級程序設(shè)計ppt課件_第1頁
《解析C程序設(shè)計》高級程序設(shè)計ppt課件_第2頁
《解析C程序設(shè)計》高級程序設(shè)計ppt課件_第3頁
《解析C程序設(shè)計》高級程序設(shè)計ppt課件_第4頁
《解析C程序設(shè)計》高級程序設(shè)計ppt課件_第5頁
已閱讀5頁,還剩142頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8章 高級程序設(shè)計2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計2主要內(nèi)容如何打印學生成績?nèi)绾未蛴W生成績指針數(shù)組指針數(shù)組指向指針的指針指向指針的指針指向二維數(shù)組的指針指向二維數(shù)組的指針查找字符位置問題查找字符位置問題返回指針的函數(shù)返回指針的函數(shù)多用處排序問題多用處排序問題指向函數(shù)的指針指向函數(shù)的指針文件復(fù)制問題文件復(fù)制問題帶參數(shù)的帶參數(shù)的main函數(shù)函數(shù)如何打印構(gòu)造體信息如何打印構(gòu)造體信息構(gòu)造體指針構(gòu)造體指針約瑟夫環(huán)問題約瑟夫環(huán)問題鏈表鏈表如何管理用戶程序如何管理用戶程序外部函數(shù)外部函數(shù)2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計3問題的提出問題的提出在許多應(yīng)用領(lǐng)域,需要

2、存儲多種各式各樣的信在許多應(yīng)用領(lǐng)域,需要存儲多種各式各樣的信息。息。例如,管理一個班學生的成績,一個班有多個例如,管理一個班學生的成績,一個班有多個學生,而每一個學生又有多門課的成績,因此學生,而每一個學生又有多門課的成績,因此常常使用二維數(shù)組存儲數(shù)據(jù);而存儲多個學生常常使用二維數(shù)組存儲數(shù)據(jù);而存儲多個學生的信息時,又會用到字符串數(shù)組。為了方便地的信息時,又會用到字符串數(shù)組。為了方便地使用和管理這些數(shù)組,就會用到指針。使用和管理這些數(shù)組,就會用到指針。但是這里所指的指針和前面的指針有所不同,但是這里所指的指針和前面的指針有所不同,已經(jīng)不是簡單的單個指針定義,會涉及到如何已經(jīng)不是簡單的單個指針定

3、義,會涉及到如何將各類指針綜合在一起。將各類指針綜合在一起。【例例8-1】有一個班,有有一個班,有5個學生,各學個學生,各學3門課,門課,計算各個學生的平均成績。計算各個學生的平均成績。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計4問題的分析問題的分析該問題涉及該問題涉及5個學生的成績,而每個學生個學生的成績,而每個學生又有又有3門課,因此用二維數(shù)組存儲這門課,因此用二維數(shù)組存儲這15個個數(shù)據(jù)。數(shù)據(jù)。但是問題本身要求計算每個學生的成績,但是問題本身要求計算每個學生的成績,每個學生的成績對應(yīng)著一個一維數(shù)組,每個學生的成績對應(yīng)著一個一維數(shù)組,訪問一維數(shù)組可以使用指針,但是要訪訪問一維數(shù)

4、組可以使用指針,但是要訪問問5個一維數(shù)組,就需要個一維數(shù)組,就需要5個指針,這個指針,這5個個指針的類型是一致的,因此就可以考慮指針的類型是一致的,因此就可以考慮能不能將這能不能將這5個指針組成一個數(shù)組,這就個指針組成一個數(shù)組,這就是本節(jié)將介紹的指針數(shù)組。是本節(jié)將介紹的指針數(shù)組。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計5指針數(shù)組指針數(shù)組用處:處理二維數(shù)組或多個字符串用處:處理二維數(shù)組或多個字符串定義:數(shù)組中的元素為指針變量定義:數(shù)組中的元素為指針變量格式:格式:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 *數(shù)組名數(shù)組名數(shù)組長度數(shù)組長度;例:例:int *p5;其中:其中:p0指向存放第

5、指向存放第1個學生的三門課程的個學生的三門課程的數(shù)組,數(shù)組,p1指向存放第指向存放第2個學生的三門課程個學生的三門課程的數(shù)組,依此類推。的數(shù)組,依此類推。 指針所指向變量的數(shù)據(jù)類型指針本身的存儲類型區(qū)分區(qū)分int *p5與與int *p52022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計6【注意注意】p為該指針數(shù)組名,和其它數(shù)組名一樣,為該指針數(shù)組名,和其它數(shù)組名一樣,p是常量,不能對它進展增量運算。是常量,不能對它進展增量運算。p為為指針數(shù)組元素指針數(shù)組元素p0的地址,的地址,p+i為為pi的地的地址。那么,址。那么,*p就是就是p0,*p+i就是就是pi。2022-5-7?解析C程序設(shè)

6、計?第8章 高級程序設(shè)計7指針數(shù)組對處理字符串提供了更大的方便和靈指針數(shù)組對處理字符串提供了更大的方便和靈敏性,指針數(shù)組由于其中每個元素都為指針變敏性,指針數(shù)組由于其中每個元素都為指針變量,因此指針數(shù)組非常合適用來處理假設(shè)干個量,因此指針數(shù)組非常合適用來處理假設(shè)干個字符串。字符串。如構(gòu)造字符串數(shù)組,在這種構(gòu)造中,數(shù)組中的如構(gòu)造字符串數(shù)組,在這種構(gòu)造中,數(shù)組中的每一個元素都是一個字符串。而字符串實際上每一個元素都是一個字符串。而字符串實際上是指向字符串第一個字符的指針,所以字符串是指向字符串第一個字符的指針,所以字符串數(shù)組中的每一個字符串實際上是指向字符串第數(shù)組中的每一個字符串實際上是指向字符串

7、第一個字符的指針,我們定義字符串數(shù)組如下:一個字符的指針,我們定義字符串數(shù)組如下:char *suit4= Hearts, Diamonds, Clubs, Spades;2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計8suit0suit1suit2suit3H e a r t s 0D i a m o n d s 0C l u b s 0S p a d e s 0數(shù)組中存放只是指針數(shù)組中存放只是指針 :圖圖8-12022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計9【注意注意】指針數(shù)組和一般數(shù)組一樣,允許指針數(shù)指針數(shù)組和一般數(shù)組一樣,允許指針數(shù)組在定義時初始化,但由于指針數(shù)組的組在

8、定義時初始化,但由于指針數(shù)組的每個元素是指針變量,它只能存放地址,每個元素是指針變量,它只能存放地址,所以對指向字符串的指針數(shù)組在說明賦所以對指向字符串的指針數(shù)組在說明賦初值時,是把存放字符串的首地址賦給初值時,是把存放字符串的首地址賦給指針數(shù)組的對應(yīng)元素。指針數(shù)組的對應(yīng)元素。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計10v指針數(shù)組賦值與初始化指針數(shù)組賦值與初始化賦值:main() int b23,*pb2; pb0=b0; pb1=b1; .int *pb2pb0pb1int b23123246初始化:main() int b23,*pb =b0,b1; .int *pb2pb0

9、pb1int b231232462022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計11v指針數(shù)組賦值與初始化指針數(shù)組賦值與初始化L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30賦值:main() char a=Fortran; char b=Lisp; char c=Basic; char *p4; p0=a; p1=b; p2=c; p3=NULL; .或:main() char *p4; p0= Fortran; p1= Lisp; p2= Basic; p3=NULL; .初始化:main() char *p=Fortran, Lisp, Ba

10、sic,NULL; .L i s p 0F o r t r a n 0B a s i c 0p0p1p2p302022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計12 char name59=“gain,“much,“stronger, “point,“bye; char *name5=“gain,“much,“stronger, “point,“bye;g a i n 0s t r o n g e r 0p o i n t 0m u c h 0name0name1name2name3name4b y e 0g a i n 0s t r o n g e r 0p o i n t 0m u c

11、 h 0b y e 0v二維數(shù)組與指針數(shù)組區(qū)別二維數(shù)組與指針數(shù)組區(qū)別:二維數(shù)組存儲空間固定字符指針數(shù)組相當于可變列長的二維數(shù)組分配內(nèi)存單元=數(shù)組維數(shù)*2+各字符串長度指針數(shù)組元素的作用相當于二維數(shù)組的行名但指針數(shù)組中元素是指針變量二維數(shù)組的行名是地址常量2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計13main int b23,*pb2; int i,j; fori=0;i2;i+ forj=0;j3;j+ bij=i+1*j+1; pb0=b0; pb1=b1; fori=0;i2;i+ forj=0;j3;j+,pbi+ printfb%d%d:%2dn,i,j,*pbi; 例例

12、用指針數(shù)組處理二維數(shù)組用指針數(shù)組處理二維數(shù)組b00 *pb0b01 *(pb0+1)b02 *(pb0+2)b10 *pb1b11 *(pb1+1)b12 *(pb1+2)int *pb2pb0pb1int b231232462022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計14例例 對字符串排序簡單項選擇擇排序?qū)ψ址判蚝唵雾椷x擇擇排序main void sortchar *name,int n, printchar *name,int n; char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sortn

13、ame,n; printname,n;void sortchar *name,int n char *temp; int i,j,k; fori=0;in-1;i+ k=i; forj=i+1;j0 k=j; ifk!=i temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkjkjjji=02022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計15例例 對字符串排序簡單項選擇擇排序?qū)ψ址判蚝唵雾椷x擇擇排序main void sort

14、char *name,int n, printchar *name,int n; char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sortname,n; printname,n;void sortchar *name,int n char *temp; int i,j,k; fori=0;in-1;i+ k=i; forj=i+1;j0 k=j; ifk!=i temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat Wal

15、lFORTRANComputerFollow meBASICkkjjji=1k2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計16例例 對字符串排序簡單項選擇擇排序?qū)ψ址判蚝唵雾椷x擇擇排序main void sortchar *name,int n, printchar *name,int n; char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sortname,n; printname,n;void sortchar *name,int n char *temp; int i,j,k; fori=0

16、;in-1;i+ k=i; forj=i+1;j0 k=j; ifk!=i temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkjji=22022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計17例例 對字符串排序簡單項選擇擇排序?qū)ψ址判蚝唵雾椷x擇擇排序main void sortchar *name,int n, printchar *name,int n; char *name=Follow me,BASIC, Great W

17、all,FORTRAN,Computer ; int n=5; sortname,n; printname,n;void sortchar *name,int n char *temp; int i,j,k; fori=0;in-1;i+ k=i; forj=i+1;j0 k=j; ifk!=i temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkkji=32022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計18例例 對字符串排序簡單

18、項選擇擇排序?qū)ψ址判蚝唵雾椷x擇擇排序main void sortchar *name,int n, printchar *name,int n; char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sortname,n; printname,n;void sortchar *name,int n char *temp; int i,j,k; fori=0;in-1;i+ k=i; forj=i+1;j0 k=j; ifk!=i temp=namei; namei=namek; namek=temp; name

19、0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASIC2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計19在介紹指針數(shù)組的根底上,下面介紹指在介紹指針數(shù)組的根底上,下面介紹指向指針數(shù)據(jù)的指針變量,也就是指向指向指針數(shù)據(jù)的指針變量,也就是指向指針的指針。針的指針。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計20指向指針的指針指向指針的指針 從圖從圖8-1可以看出,可以看出,suit是一個指針數(shù)組,是一個指針數(shù)組,它的每一個元素是一個指針型數(shù)據(jù),其它的每一個元素是一個指針型數(shù)據(jù),其值為地址。而同時考慮值為地

20、址。而同時考慮suit作為一個數(shù)組,作為一個數(shù)組,數(shù)組名數(shù)組名suit代表該數(shù)組的首地址,代表該數(shù)組的首地址,suit+i代表代表suiti這個元素的地址,那么這個元素的地址,那么suit和和suit+i就是指向指針型數(shù)據(jù)的指針。自然就是指向指針型數(shù)據(jù)的指針。自然也就可以定義相應(yīng)的變量存放他們的值,也就可以定義相應(yīng)的變量存放他們的值,這就是在這部分要討論的指向指針的指這就是在這部分要討論的指向指針的指針。針。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計21假如一個指針變量存放的又是另一個指假如一個指針變量存放的又是另一個指針變量的地址,那么稱這個指針變量為針變量的地址,那么稱這個指針

21、變量為指向指針數(shù)據(jù)的指針變量,又稱多級指指向指針數(shù)據(jù)的指針變量,又稱多級指針,簡稱為指向指針的指針。針,簡稱為指向指針的指針。指向指針數(shù)據(jù)的指針變量的定義形式為:指向指針數(shù)據(jù)的指針變量的定義形式為:類型標識符類型標識符 *指針變量名指針變量名; 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計22例如:例如:int m=3,n=4,*pm=&m,*pn,*pp; pn=&n; pp=&pn;那么:那么:pm指向了指向了m的,的,*pm表示表示m的值。的值。pp指向了指向了pn,*pp的值為的值為pn的值,即的值,即n的的地址值;地址值; *pp的值等于的值等于*p

22、n,即變量,即變量n的的值。其內(nèi)存指向如圖值。其內(nèi)存指向如圖8-2所示。所示。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計23&pn&n4n的值的值pnpp&m3m的值的值pmpp,&pn&n,pn,*ppn,*pn,*pppm,&mm,*pm圖圖8-2一級指針與二級指針指向示意圖一級指針與二級指針指向示意圖由結(jié)合關(guān)系可知:*pp相當于*pp,而*pp即是pn,因此*pp就是*pn,也就是變量n的值。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計24對于前面的數(shù)組名對于前面的數(shù)組名suit假如要定義一個同假如要定義一個同類型的指

23、向指針的指針,形式如下:類型的指向指針的指針,形式如下:char *p; p=suit;這里這里p前面的兩個前面的兩個*號,就說明定義的是號,就說明定義的是指向字符指針型變量的指針,也就是二指向字符指針型變量的指針,也就是二級指針。下面看一個簡單的例子:級指針。下面看一個簡單的例子:2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計25#include void mainint a5=1,3,5,7,9; /*定義一維整型數(shù)組定義一維整型數(shù)組*/int *num5,i; /*num為指針數(shù)組為指針數(shù)組*/int *p; /*p為指向指針的指針為指向指針的指針*/fori=0;i5;i+nu

24、mi=&ai; /*num獲取數(shù)組獲取數(shù)組a各個元素的地址各個元素的地址*/p=num; /*p指向指針數(shù)組的首地址,也就是二級指針指向指針數(shù)組的首地址,也就是二級指針*/fori=0;i5;i+printf%d,*p; /*利用二級指針訪問數(shù)組中的元素利用二級指針訪問數(shù)組中的元素*/p+;printfn;在這個例子中,在這個例子中,數(shù)組元素的地址數(shù)組元素的地址存放在指針數(shù)組存放在指針數(shù)組中,而指針數(shù)組中,而指針數(shù)組本身的地址那么本身的地址那么存放在指向指針存放在指向指針的指針的變量中的指針的變量中。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計26多級指針多級指針v定義定義:

25、 指向指針的指針指向指針的指針v一級指針一級指針:指針變量中存放目的變量的地址指針變量中存放目的變量的地址p1&p2&i3P2(指針變量指針變量)i(整型變量整型變量)例例 int *p1; int *p2; int i=3; p2=&i; p1=&p2; *p1=5;v二級指針二級指針:指針變量中存放一級指針變量的地址指針變量中存放一級指針變量的地址例例 int *p; int i=3; p=&i; *p=5;&i3P(指針變量指針變量)i(整型變量整型變量)一級指針一級指針單級間接尋址單級間接尋址二級指針二級指針一級指針一級指針目的變量目的變

26、量二級間接尋址二級間接尋址2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計27從理論上說,可以延伸到更多的級成為從理論上說,可以延伸到更多的級成為“多級指針。但實際上在程序中很少多級指針。但實際上在程序中很少有超過二級指針的。級數(shù)越多,越難理有超過二級指針的。級數(shù)越多,越難理解,容易產(chǎn)生混亂,出錯時機也多。解,容易產(chǎn)生混亂,出錯時機也多。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計28l定義形式:定義形式:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名;指針名;如如 char *p;例 int i, *p; p=&i; /p是二級指針,不能用變量地址為其賦值指針本身的存儲

27、類型最終目的變量的數(shù)據(jù)類型*p是p間接指向?qū)ο蟮牡刂?p是p間接指向?qū)ο蟮闹道?int i=3; int *p1; int *p2; p1=&i; p2=&p1; *p=5;ip1p23&i&p1*p2, *p1*p2v多級指針多級指針例 三級指針 int *p; 四級指針 char *p;2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計2920002008200A20022004200612變量a 變量b(main) 指針變量p2000 指針變量q2002例 一級指針與二級指針#include void swapint *r,int *s int *t;

28、 t=r; r=s; s=t;main int a=1,b=2,*p,*q; p=&a; q=&b; swapp,q; printf%d,%dn,*p,*q;20022000COPY 指針變量s 指針變量r(swap) 指針變量t2000200220002022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計3020002008200A20022004200612變量a 變量b(main) 指針變量p2000 指針變量q2002例 一級指針與二級指針#include void swapint *r,int *s int *t; t=r; r=s; s=t;main int a=1

29、,b=2,*p,*q; p=&a; q=&b; swapp,q; printf%d,%dn,*p,*q;輸出: 1,22022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計31例 一級指針與二級指針#include void swapint *r,int *s int *t; t=r; r=s; s=t;main int a=1,b=2,*p,*q; p=&a; q=&b; swapp,q; printf%d,%dn,*p,*q;abpqabpqrsabpqsrabpq輸出: 1,22022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計32例 一級指針與二級指針

30、#include void swapint *r,int *s int *t; t=*r; *r=*s; *s=t;main int a=1,b=2,*p,*q; p=&a; q=&b; swap&p,&q; printf%d,%dn,*p,*q;20002008200A20022004200612變量a 變量b(main) 指針變量p2000 指針變量q200220062004COPY 二級指針s 二級指針r(swap) 指針變量t2000200220002022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計33例 一級指針與二級指針#include void

31、 swapint *r,int *s int *t; t=*r; *r=*s; *s=t;main int a=1,b=2,*p,*q; p=&a; q=&b; swap&p,&q; printf%d,%dn,*p,*q;20002008200A20022004200612變量a 變量b(main) 指針變量p2000 指針變量q200220002002輸出: 2,12022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計34例 一級指針與二級指針#include void swapint *r,int *s int *t; t=*r; *r=*s; *s=t;m

32、ain int a=1,b=2,*p,*q; p=&a; q=&b; swap&p,&q; printf%d,%dn,*p,*q;abpqbapqabrspqabrspq輸出: 2,12022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計35例 用二級指針處理字符串#define NULL 0void main char *p; char *name=hello,good,world,bye,; p=name+1; printf%o : %s , *p,*p; p+=2; while*p!=NULL printf%sn,*p+;name0name1name2na

33、me3name4char *name5worldbye0hellogoodnamep運行結(jié)果:644 : good bye用*p可輸出地址%o或%x, 也可用它輸出字符串%sp*p+2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計36【例例8-2】用指針的指針輸出給定的字符串。用指針的指針輸出給定的字符串。#include void main static char *a=abcde,abc,abcd,ab,abcdef; /*指針數(shù)組指針數(shù)組*/ char *p; int i; fori=0;i5;i+ p=a+i; printf%sn,*p; /*二級指針的間接引用為一級指針,在這指

34、字符串二級指針的間接引用為一級指針,在這指字符串*/ p=a+2; p+; printf*p=%sn,*p;程序的運行結(jié)果:程序的運行結(jié)果:abcdeabcabcdababcdef*p=ab2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計37由于定義的由于定義的char *a5; 它的它的5個元素個元素a0、a1、a2、a3、a4是地址,而數(shù)組名是地址,而數(shù)組名a也是地址,它指向該數(shù)組的首地址。因也是地址,它指向該數(shù)組的首地址。因此此a就相當于一個二級指針,與定義的就相當于一個二級指針,與定義的p具有一樣的特性,但其本質(zhì)是不同的。具有一樣的特性,但其本質(zhì)是不同的。如圖如圖8-3所示。所示

35、。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計38a+1abc0abcde0ab0abcd0a0a1a2a3aa數(shù)組數(shù)組字符串字符串a(chǎn)bcdef0a4p圖圖8-3 指針數(shù)組與二級指針示意圖指針數(shù)組與二級指針示意圖2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計39二級指針與指針數(shù)組的關(guān)系二級指針與指針數(shù)組的關(guān)系int *p 與與 int *q10 v指針數(shù)組名是二級指針指針數(shù)組名是二級指針常量常量vp=q; p+i 是是qi的地址的地址v指針數(shù)組作形參,指針數(shù)組作形參,int *q 與與int *q完全等價;但完全等價;但作為變量定義兩者不同作為變量定義兩者不同v系統(tǒng)只給系統(tǒng)只

36、給p分配能保存一個指針值的內(nèi)存區(qū);而給分配能保存一個指針值的內(nèi)存區(qū);而給q分配分配10塊內(nèi)存區(qū),每塊可保存一個指針值塊內(nèi)存區(qū),每塊可保存一個指針值2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計40定義定義含義含義int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定義整型變量定義整型變量ip為指向整型數(shù)據(jù)的指針變量為指向整型數(shù)據(jù)的指針變量定義含定義含n個元素的整型數(shù)組個元素的整型數(shù)組an個指向整型數(shù)據(jù)的指針變量組成的指針數(shù)組個指向整型數(shù)據(jù)的指針變量組成的指針數(shù)組pp為指向含為指向含n個元素的一

37、維整型數(shù)組的指針變量個元素的一維整型數(shù)組的指針變量f為返回整型數(shù)的函數(shù)為返回整型數(shù)的函數(shù)p為返回指針的函數(shù),該指針指向一個整型數(shù)據(jù)為返回指針的函數(shù),該指針指向一個整型數(shù)據(jù)p為指向函數(shù)的指針變量,該函數(shù)返回整型數(shù)為指向函數(shù)的指針變量,該函數(shù)返回整型數(shù)p為指針變量,它指向一個指向整型數(shù)據(jù)的指針變量為指針變量,它指向一個指向整型數(shù)據(jù)的指針變量指針的數(shù)據(jù)類型指針的數(shù)據(jù)類型2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計41例例 以下定義的含義以下定義的含義1int *p3;2int *p3;3int *pint;4int *pint;5int *pint;6int *p3int;7int *p3

38、int;函數(shù)指針數(shù)組,函數(shù)返回函數(shù)指針數(shù)組,函數(shù)返回int型指針型指針指針數(shù)組指針數(shù)組指向一維數(shù)組的指針指向一維數(shù)組的指針返回指針的函數(shù)返回指針的函數(shù)指向函數(shù)的指針,函數(shù)返回指向函數(shù)的指針,函數(shù)返回int型變量型變量指向函數(shù)的指針,函數(shù)返回指向函數(shù)的指針,函數(shù)返回int 型指針型指針函數(shù)指針數(shù)組,函數(shù)返回函數(shù)指針數(shù)組,函數(shù)返回int型變量型變量2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計42指向二維數(shù)組的指針指向二維數(shù)組的指針 指針變量可以指向一維數(shù)組中的元素,指針變量可以指向一維數(shù)組中的元素,同時也可以指向二維數(shù)組中的元素。同時也可以指向二維數(shù)組中的元素。從使用上而言,后者要復(fù)雜的

39、多,但是從使用上而言,后者要復(fù)雜的多,但是在很多情況下,它的使用可以幫助程序在很多情況下,它的使用可以幫助程序更好的實現(xiàn),本節(jié)就討論該問題。更好的實現(xiàn),本節(jié)就討論該問題。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計43對于二維數(shù)組:1a是數(shù)組名, 包含三個元素 a0,a1,a22每個元素ai 又是一個一維 數(shù)組,包含4個 元素aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23基類型行指針與列指針a0+1a1+1a

40、2+1*(a+0)+1*(a+1)+1*(a+2)+12022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計44l對二維數(shù)組對二維數(shù)組 int a34,有有ua-二維數(shù)組的首地址,即第二維數(shù)組的首地址,即第0行的首地址行的首地址ua+i-第第i行行的首地址的首地址uai *a+i-第第i行第行第0列列的元素地址的元素地址uai+j *a+i+j -第第i行第行第j列列的元素地址的元素地址u*ai+j *a+i+j aijla+i=&ai=ai=*a+i =&ai0, 值相等,含義不同值相等,含義不同ua+i &ai,表示第表示第i行首地址,指向行行首地址,指向行uai

41、*a+i &ai0,表示第表示第i行行第第0列元素地址,指向列列元素地址,指向列int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+22022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計45int a34;a00a01a10a11a20a21a02a03a12a13a22a23二維數(shù)組元素表示形式:1a122*a1+23*a+1+24*&a00+1*4+2地址表示:1 a+1 2 &a103 a14 *a+15int * a+1行指針列指

42、針地址表示:1 &a122 a1+23 *a+1+24&a00+1*4+22022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計46表示形式表示形式含義含義地址地址a二維數(shù)組名,數(shù)組首地址二維數(shù)組名,數(shù)組首地址a0,*(a+0),*a第第0行第行第0列元素地址列元素地址a+1第第1行首地址行首地址a1,*(a+1)第第1行第行第0列元素地址列元素地址a1+2,*(a+1)+2,&a12第第1行第行第2列元素地址列元素地址*(a1+2),*(*(a+1)+2),a12第第1行第行第2列元素值列元素值20002000200820082012132022-5-7?解析C程序設(shè)

43、計?第8章 高級程序設(shè)計47v二維數(shù)組的指針變量二維數(shù)組的指針變量l指向二維數(shù)組元素的指針變量指向二維數(shù)組元素的指針變量例 指向二維數(shù)組元素的指針變量main static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; forp=a0;pa0+12;p+ ifp-a0%4=0 printfn;printf%4d ,*p; p=*a; p=&a00; p=*a+0; p=a; p=*a; p=&a00; p=(int *)a; p=a; int a34;a00a01a10a11a20a21a02a03a12a13a22a23p20

44、22-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計48l指向指向一維數(shù)組的指針變量一維數(shù)組的指針變量u定義形式:定義形式: 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名指針名一維數(shù)組維數(shù)一維數(shù)組維數(shù); 例例 int *p4; 不能少int *p4與int *p4不同p的值是一維數(shù)組的首地址,p是行指針u可讓可讓p指向二維數(shù)組某一行指向二維數(shù)組某一行 如如 int a34, *p4=a;int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)一維數(shù)組指針變

45、量維數(shù)和二維數(shù)組列數(shù)必須一樣2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計49例 一維數(shù)組指針變量舉例main static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,*p4; forp=a,i=0;i3;i+,p+ forj=0;j4;j+ printf%d ,*p+j; printfn;p=a0; p=*a; p=&a00; p=&a0; p=a0; p=*a; p=&a00; p=&a0; int a34;a00a01a10a11a20a21a02a03a12a13a22a23ppp p0j20

46、22-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計50關(guān)于一維數(shù)組與指針關(guān)系的結(jié)論可以推廣到二關(guān)于一維數(shù)組與指針關(guān)系的結(jié)論可以推廣到二維數(shù)組、三維數(shù)組等多維數(shù)組??梢园讯S數(shù)維數(shù)組、三維數(shù)組等多維數(shù)組。可以把二維數(shù)組看成是這樣的一維數(shù)組:它的每個單元本身組看成是這樣的一維數(shù)組:它的每個單元本身又是一個一維數(shù)組。例如:又是一個一維數(shù)組。例如:int a43=1,3,5,7,9,11,13,15,17,19,21,23; 這里這里a是一個數(shù)組名。數(shù)組是一個數(shù)組名。數(shù)組a包含包含4個元素個元素即即4行行:a0,a1,a2,a3,而每個元素又是一,而每個元素又是一個包含個包含3個元素個元素即即3列元素

47、列元素的一維數(shù)組。如的一維數(shù)組。如a1代表的一維數(shù)組包括:代表的一維數(shù)組包括:a10,a11,a12三個元素。如圖三個元素。如圖8-4所示。所示。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計51= a= a00 00 a a01 01 a a0202 = a= a10 10 a a11 11 a a1212 = a= a20 20 a a21 21 a a2222 = a= a30 30 a a31 31 a a3232 a0a1a2aa3= 1= 1 3 3 5 5 = 7= 7 9 9 11 11 = 13= 13 1515 17 17 = 19= 19 2121 23 23 a

48、0a1a2aa31000100610121018a00 a01 a02a00 a01 a02a10 a11 a12a10 a11 a12a20 a21 a22a20 a21 a22a30 a31 a32a30 a31 a32a0a1a2aa3a+1a+2a+3二維數(shù)組的地址二維數(shù)組的地址 :a代表整個二維數(shù)組的首地址代表整個二維數(shù)組的首地址, a+i的含義是ai的地址的地址。 ai+j即表示第i行第j列元素的地址,即&aij。 *a+1、*a、*a+i雖然形式上是指針運算符,似乎指的是變量地址中所存儲的值,但它仍仍然是地址然是地址,它們分別是a1、a0、ai的值。而a1、a0、ai仍然

49、是地址,它們分別是a10、a00、ai0的地址。a是行指針,*a是列指針,*a表示a00的值。同樣*a+1是a10的值。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計52二維數(shù)組元素的值的表示二維數(shù)組元素的值的表示 既然既然a1與與*a+1是等價的,那么是等價的,那么a1+2就可以寫成就可以寫成*a+1+2,而,而a1+2是是a12的地址。因此的地址。因此*a1+2就是就是a12的值,所以的值,所以*a+1+2也代也代表表a12的值。的值。 一般地,一般地,aij、*ai+j、*a+i+j都表示都表示aij的值,甚至還可的值,甚至還可以寫成以寫成*a+ij的形式。的形式。2022-5

50、-7?解析C程序設(shè)計?第8章 高級程序設(shè)計53表示形式表示形式含義含義地址值地址值&a指向二維數(shù)組的指針指向二維數(shù)組的指針1000a二維數(shù)組名,指向一維數(shù)組二維數(shù)組名,指向一維數(shù)組a0,即第,即第0行首地址行首地址1000a0 , *a+0 , *a第第0行第行第0列元素地址列元素地址1000a+1 , &a1第第1行首地址行首地址1006a1 , *a+1第第1行第行第0列元素地址列元素地址1006a1+2 , *a+1+2 , &a12第第1行第行第2列元素地址列元素地址1010*a1+2 , *a+1+2 , a12第第1行第行第2列元素的值列元素的值元素值為元素

51、值為11表表8-1 指向二維數(shù)組的指針的幾種表示方式指向二維數(shù)組的指針的幾種表示方式2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計541000 1002 10041000 1002 1004 1 3 5 1 3 51006 1008 10101006 1008 1010 7 9 11 7 9 111012 1014 10161012 1014 1016 13 15 17 13 15 171018 1020 10221018 1020 1022 19 21 23 19 21 23aa+1a+2a+3a0a0a0+1a0+1a0+2a0+2圖圖8-5 使用二維數(shù)組名指向數(shù)組元素示意圖使用二

52、維數(shù)組名指向數(shù)組元素示意圖2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計55不要把不要把&ai簡單的理解為簡單的理解為ai的物理地址,因的物理地址,因為并不存在為并不存在ai這個變量。它只是一種地址的這個變量。它只是一種地址的計算方法,能得到第計算方法,能得到第i行的地址。行的地址。&ai和和ai的值是一樣的,但它的含義卻不同。的值是一樣的,但它的含義卻不同。 &ai或或a+i指向行,而指向行,而ai或或*a+i指向列。指向列。當下標當下標j=0時,時,&ai和和ai+j的值相等。的值相等。*a+i只是只是ai的另一種表示形式。在二維數(shù)組中,的另一種表示

53、形式。在二維數(shù)組中,a+i=ai=*a+i=&ai=&ai0即它們的地即它們的地址值是相等的。址值是相等的。 2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計56例 二維數(shù)組與指針運算main int a34=1,2,3,4,3,4,5,6,5,6,7,8; int i; int *p4=a,*q=a0; fori=0;i3;i+ ifi=0 *pi+i/2=*q+1;else p+,+q; fori=0;i3;i+ printf%d,aii; printf%d,%dn,*int *p,*q;運行結(jié)果:2,4,7,5,3123434565678pq2pqpq2022-5-

54、7?解析C程序設(shè)計?第8章 高級程序設(shè)計57例 3個學生各學4門課,計算總平均分,并輸出第n個學生成績main void averagefloat *p,int n; void searchfloat *p4,int n; float score34=65,67,79,60,80,87,90,81,90,99,100,98; average*score,12; searchscore,2;void averagefloat *p,int n float *p_end, sum=0,aver; p_end=p+n-1; for;p=p_end;p+sum=sum+*p; aver=sum/n;

55、printfaverage=%5.2fn,aver;void searchfloat *p4, int n int i; printf No.%d :n,n; fori=0;i4;i+ printf%5.2f ,*p+n+i;列指針行指針函數(shù)說明float p46552796080879081909910098pp pni2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計58例 3個學生各學4門課,計算總平均分,并查找一門以上課 不及格學生, 輸出其各門課成績void search(float (*p)4, int n) int i,j,flag; for(j=0;jn;j+) flag=

56、0;for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1;if(flag=1) printf(No.%d is fail,his scores are:n,j+1); for(i=0;i4;i+)printf(%5.1f ,*(*(p+j)+i); printf(n); main() void search(float (*p)4, int n); float score34=.,.,.; search(score,3);6552796080879081909910098p pji2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計59二維數(shù)組與一維數(shù)組指針變量的關(guān)

57、系二維數(shù)組與一維數(shù)組指針變量的關(guān)系 如如 int a510 與與 int *p10;Y二維數(shù)組名是一個指向有二維數(shù)組名是一個指向有10個元素的一維數(shù)組的個元素的一維數(shù)組的指指針常量針常量Yp=a+i 使使 p指向二維數(shù)組的第指向二維數(shù)組的第i行行Y*p+i+j aij Y二維數(shù)組形參實際上是一維數(shù)組指針變量,二維數(shù)組形參實際上是一維數(shù)組指針變量, 即即 int x 10 int *x10Y變量定義不是形參時兩者不等價變量定義不是形參時兩者不等價Y系統(tǒng)只給系統(tǒng)只給p分配能保存一個指針值的內(nèi)存區(qū)一般分配能保存一個指針值的內(nèi)存區(qū)一般2字節(jié);而給字節(jié);而給a分配分配2*5*10字節(jié)的內(nèi)存區(qū)字節(jié)的內(nèi)存區(qū)

58、2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計60【例例8-3】用指針變量輸出數(shù)組元素的值。用指針變量輸出數(shù)組元素的值。 #include void main int a34=1,3,5,7,9,11,13,17,19,21,23; int *p; for p=a0;pa0+12;p+ if p-a0%4=0 printfn; printf%4d,*p; 程序的運行情況: 1 3 5 7 9 11 13 1517 19 21 232022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計61在在【例例8-3】中的指針變量中的指針變量p是指向整型是指向整型變量的,變量的,p+1所指向的元素是

59、所指向的元素是p所指向的所指向的元素的下一元素,如元素的下一元素,如p=a0;指向列指向列,這時這時p指向的元素是指向的元素是a00,而,而p+1指向指向的元素是的元素是a01。這種指針我們稱之為。這種指針我們稱之為列指針列指針。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計62指向由指向由m個元素構(gòu)成的一維數(shù)組的指針變量個元素構(gòu)成的一維數(shù)組的指針變量 可以改用另一方法,使可以改用另一方法,使p不是指向整型變不是指向整型變量,而是指向一個包含量,而是指向一個包含m個元素的一維個元素的一維數(shù)組。即當數(shù)組。即當p=a0;指向行指向行時,要使時,要使p+1不指向不指向a01,而是指向,而是指

60、向a1,p的增的增值以一維數(shù)組的長度為單位,這種指針值以一維數(shù)組的長度為單位,這種指針我們稱之為我們稱之為行指針行指針。如圖。如圖8-6所示。所示。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計63a0a01000 1002 10041000 1002 1004 1 3 5 1 3 51006 1008 10101006 1008 1010 7 9 11 7 9 111012 1014 10161012 1014 1016 13 15 17 13 15 171018 1020 10221018 1020 1022 19 21 23 19 21 23pp+1p+2p+3a1a1a2a2a3a3圖圖8-6 使用行指針變量指向數(shù)組元素示意圖使用行指針變量指向數(shù)組元素示意圖2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計64為了方便起見,我們可以定義一個具有為了方便起見,我們可以定義一個具有數(shù)組名一樣特征的指針,定義形式為:數(shù)組名一樣特征的指針,定義形式為:數(shù)據(jù)類型數(shù)據(jù)類型 *指針變量名指針變量名N;其中其中N表示一個整型常量。注意表示一個整型常量。注意“ 不能少。不能少。2022-5-7?解析C程序設(shè)計?第8章 高級程序設(shè)計65【例例8-4】用行指針變量輸出數(shù)

溫馨提示

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

評論

0/150

提交評論