C語(yǔ)言指針與數(shù)組.ppt_第1頁(yè)
C語(yǔ)言指針與數(shù)組.ppt_第2頁(yè)
C語(yǔ)言指針與數(shù)組.ppt_第3頁(yè)
C語(yǔ)言指針與數(shù)組.ppt_第4頁(yè)
C語(yǔ)言指針與數(shù)組.ppt_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7部分 指針、指針與數(shù)組,編程步驟: 分析程序框架(粗算法)細(xì)算法程序調(diào)試,2,本講內(nèi)容和目標(biāo)要求,正確理解指針的概念 理解指針作函數(shù)參數(shù)時(shí),函數(shù)的調(diào)用過(guò)程 掌握指針與一維數(shù)組、二維數(shù)組的關(guān)系 掌握與動(dòng)態(tài)內(nèi)存分配相關(guān)的三個(gè)庫(kù)函數(shù),并了解動(dòng)態(tài)數(shù)組的用法 至少能夠讀懂指針相關(guān)的程序,掌握指針在編程中的作用,3,新的概念:指針(Pointer),指針也是一種數(shù)據(jù)類(lèi)型 一種特殊的數(shù)據(jù)類(lèi)型,這種類(lèi)型存儲(chǔ)的是地址 C/c+的特色 有些復(fù)雜但很實(shí)用 指針變量與指針常量 指針變量 專(zhuān)門(mén)存放地址數(shù)據(jù)的變量 指針常量 指一個(gè)固定的地址,例如:數(shù)組名,4,兩種尋址方式,如何讀寫(xiě)內(nèi)存中的數(shù)據(jù)? 通過(guò)變量的地址訪(fǎng)問(wèn)變量所在的存儲(chǔ)單元 兩種尋址方式 直接(尋址)引用 直接按變量地址來(lái)存取變量?jī)?nèi)容的引用方式 間接(尋址)引用 通過(guò)指針變量來(lái)間接存取它所指向的變量的引用方式,直接尋址,間接尋址,5,間接尋址訪(fǎng)問(wèn): int i; int *pi; pi=,例1:直接尋址與間接尋址的表示,直接尋址訪(fǎng)問(wèn): int i; i=3;,如果能直接尋址那當(dāng)然就不用間接尋址了,但有時(shí),只能用間接尋址的方法解決問(wèn)題,數(shù)據(jù)類(lèi)型:int *(指向整型變量的指針) 變量名稱(chēng):pi 變量的初值:&i 含義:向系統(tǒng)申請(qǐng)一個(gè)動(dòng)態(tài)區(qū)的內(nèi)存空間,用來(lái)存儲(chǔ)整型指針變量pi的初值&i,即將pi指向了變量i。,通過(guò)*pi這種形式,實(shí)現(xiàn)對(duì)變量i的間接引用。,2000,3,6,為什么引入指針的概念,指針有如下好處: 為函數(shù)提供修改變量值的手段 為C的動(dòng)態(tài)內(nèi)存分配系統(tǒng)提供支持 可以改善某些子程序的效率 為動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹(shù)等)提供支持,7,int i,*p; p=,int i,*p=,int i; float *p; p=,int *p; p=100;,判斷對(duì)錯(cuò)!,必須進(jìn)行賦值才能引用!否則p指向了哪呢?,一個(gè)指針變量不能指向與其類(lèi)型不同的變量!float又稱(chēng)變量P的基類(lèi)型,應(yīng)在類(lèi)型相同的指針變量之間賦值,int *p; scanf(“%p”,指針變量只 存放地址!,int *p; *p=100;,對(duì)指針變量賦值只能通過(guò)&求得!,8,例2:讀程序,#include void main() int a=5,b=10; int *pa= ,讀程序的關(guān)鍵: 指針變量指向哪兒? 所指向的變量里存儲(chǔ)的數(shù)據(jù)是多少? 更改的是指針還是指針?biāo)赶虻淖兞浚?-1,9,指針變量與其它類(lèi)型變量的對(duì)比,共性 在內(nèi)存中占據(jù)一定大小的存儲(chǔ)單元 先定義,再使用 指針變量的特殊性 指針變量只能存放地址,而不能存放數(shù)據(jù) 必須初始化后才能使用,否則指向不確定的存儲(chǔ)單元 只能指向同一基類(lèi)型的變量,否則warning. 可參與的運(yùn)算:加、減、關(guān)系、賦值,10,主調(diào)函數(shù),被調(diào)函數(shù),void main() int a, b; a = 5; b = 9; Swap(a, b); printf (“a=%d,b=%d“,a,b); ,void Swap(int x, int y) int temp; temp = x; x = y; y = temp; ,5,5,a,b,實(shí) 參,形 參,9,9,傳數(shù)值調(diào)用,x,y,5,temp,9,5,因?yàn)樵诰植孔兞康淖饔糜蛲鉄o(wú)法直接引用,所以無(wú)法交換成功。 如何交換作用域外兩個(gè)變量的值?(例3) 間接引用!,11,主調(diào)函數(shù),被調(diào)函數(shù),void main() int a, b; a = 5; b = 9; Swap( ,void Swap(int *pa, int *pb) int temp; temp = *pa; *pa = *pb; *pb = temp; ,&a,實(shí) 參,形 參,&b,傳地址調(diào)用,x,y,5,temp,5,a,b,9,9,5,指針的好處之一: 通過(guò)間接引用改變了其它作用域內(nèi)變量的值。 當(dāng)計(jì)算結(jié)果不只一個(gè)時(shí),可以用這種方法,實(shí)現(xiàn)數(shù)據(jù)的“返回”。,12,習(xí)題7.1,下面的函數(shù)用于計(jì)算兩個(gè)整數(shù)之和,并通過(guò)指針形參z得到x和y相加后的結(jié)果。,void Add(int x,int y, z) = x+y; ,int *,*z,13,習(xí)題7.2,函數(shù)功能為_(kāi) void Exchange(int *p1, int *p2) int p; p = *p1; *p1 = *p2; *p2 = p; A)交換*p1和*p2的值 B)正確,但無(wú)法改變*p1和*p2的值 C)交換*p1和*p2的地址 D)可能造成系統(tǒng)故障,14,小結(jié)1,指針的基礎(chǔ)知識(shí) 尋址方式 指針的概念、定義、賦值、間接引用,15,例4 讀程序,#include void main ( ) int a=2,4,6,8,10; int y=0,i,*p; p= ,兩個(gè)重要內(nèi)容: 指針指向了哪個(gè)數(shù)組元素? 是指針運(yùn)算還是數(shù)組元素運(yùn)算,2 4 6 8 10,16,指針運(yùn)算地址運(yùn)算,單個(gè)指針的運(yùn)算 加減運(yùn)算:每加(減)1表示指針指向后(前)一個(gè)數(shù)據(jù)單元 例:p+;-p;p=p+n; 兩個(gè)指針的運(yùn)算 比較:用來(lái)比較兩個(gè)指針的前后位置 例: (p1p2) 相減:兩個(gè)指針相距多遠(yuǎn)?,主要用于對(duì)數(shù)組的處理,17,用數(shù)組名(指針常量) 引用數(shù)組元素,6000 6001 6002 6003 6004 6005 6006 6007,a,a+1,a+2,void main() int a10,i; puts(“please input %d score:”,N); for (i=0; i10; i+) scanf(“%d“, ,輸入輸出數(shù)組元素:方法1:數(shù)組名下標(biāo),void main() int a10 ,i; puts(“please input %d score:”,10); for (i=0; i10; i+) scanf(“%d”, ? ); for (i=0; i10; i+) printf(“%d “, ? ); ,輸入輸出數(shù)組元素: 方法2:數(shù)組名+偏移量,a+i,*(a+i),18,用指針變量引用數(shù)組元素,main() int a10, i; int *p=a; puts(“please input %d score:”,10); for (i=0; i10; i+) scanf(“%d“, ,輸入輸出數(shù)組元素: 方法3:指針變量下標(biāo),也可以用指針變量引用一維數(shù)組元素 int a10,*p=a;,6000 6001 6002 6003 6004 6005 6006 6007,a,p+1,p+2,main() int a10 ,i; int *p=a; puts(“please input %d score:”,10); for (i=0; i10; i+) scanf(“%d”, ? ); for (i=0; i10; i+) printf(“%d “, ? ); ,輸入輸出數(shù)組元素: 方法4:指針變量+偏移量,p+i,*(p+i),19,用指針變量引用數(shù)組元素,main() int a10 , i; int *p; for (p=a; p(a+10); p+) scanf(“%d“, p); for (p=a; p(a+10); p+) printf(“%d “, *p); ,輸入輸出數(shù)組元素: 方法5:指針變化,也可以用指針變量引用一維數(shù)組元素 int a10,*p=a;,6000 6001 6002 6003 6004 6005 6006 6007,a,p+,p+,通過(guò)數(shù)組名的變化引用數(shù)組元素行不行?,數(shù)組元素的引用形式 ai或*(a+i) pi或*(p+i) *(p+),20,例5 讀程序,#include void main() int a = 1,2,3,4,5; int *p = NULL; p = a; printf(“%d, “,*p); printf(“%d, “,*(+p); printf(“%d, “,*+p); printf(“%d, “,*(p-); printf(“%d, “,*p+); printf(“%d, “,*p); printf(“%d, “,+(*p); printf(“%d, “,*p); ,1,2,3,3,2,3,4,4,兩個(gè)重要內(nèi)容: 指針指向了哪個(gè)數(shù)組元素? 是指針運(yùn)算還是數(shù)組元素運(yùn)算,21,區(qū)分幾個(gè)表達(dá)式,P+ *p+ *(p+) *(+p) (*p)+,指向下一個(gè)地址單元 間接引用p指向的數(shù)據(jù)單元,然后,p指向下一個(gè)地址單元 同上 先將p指向下一個(gè)地址單元,然后間接引用p指向的數(shù)據(jù)單元 P指向的數(shù)據(jù)+1,22,例6 讀程序,#include void main() int i = 0; char b = “program“; char *a = “PROGRAM”; /*定義一個(gè)指針變量指向字符串,與上邊定義的區(qū)別是:前者是先申請(qǐng)內(nèi)存空間,后存入字符串,而后者是先將字符串存入在內(nèi)存的某個(gè)地方,然后再用a指向該字符串所在內(nèi)存的開(kāi)始位置。另外。b是常量,a是變量*/ printf(“%c%sn“,*a, b + 1); while (putchar (*(a + i) i+; printf(“i = %dn“,i); while ( - i) putchar (*(b + i); printf(“n%sn“, ,Program PROGRAM i=7 margor gram,23,例7:編寫(xiě)函數(shù)實(shí)現(xiàn)求和1,float sum(float a,int n) int i;float sum= a 0; for(i=1;in;i+) sum+= a i; return(sum); ,#include float sum(float a,int n); void main() int i; float sco4,s; for(i=0;i4;i+) scanf(“%f”, ,形參是數(shù)組名,實(shí)參是數(shù)組名,24,例7:編寫(xiě)函數(shù)實(shí)現(xiàn)求和2,float sum(float *a,int n) int i;float sum= a 0; for(i=1;in;i+) sum+= a i; return(sum); ,#include float sum(float *a,int n); void main() int i; float sco4,s; for(i=0;i4;i+) scanf(“%f”, ,形參是指針,實(shí)參是數(shù)組名,25,例7:編寫(xiě)函數(shù)實(shí)現(xiàn)求和3,float sum(float *a,int n) int i;float sum= a 0; for(i=1;in;i+) sum+= a i; return(sum); ,#include float sum(float *a,int n); void main() int i; float sco4,s; float *p=sco; for(i=0;i4;i+) scanf(“%f”, ,形參是指針,實(shí)參是指針,26,例7:編寫(xiě)函數(shù)實(shí)現(xiàn)求和4,float sum(float a4,int n) int i;float sum= a 0; for(i=1;i4;i+) sum+= a i; return(sum); ,#include float sum(float a,int n); void main() int i; float sco4,s; float *p=sco; for(i=0;i4;i+) scanf(“%f”, ,形參是數(shù)組名,實(shí)參是指針,27,總之, 數(shù)組作函數(shù)參數(shù)有下列四種寫(xiě)法:,但無(wú)論哪種形式,本質(zhì)上,傳遞的都是數(shù)組的首地址。,28,小結(jié)2,指針與一維數(shù)組的關(guān)系 如何利用指針引用數(shù)組元素 形參是指針變量 學(xué)習(xí)指針的關(guān)鍵: 是對(duì)地址處理,還是對(duì)數(shù)據(jù)處理? 何時(shí)有*,何時(shí)無(wú)*,29,作業(yè)2,編寫(xiě)函數(shù) void strcat(int *p1,int *p2) 并在主函數(shù)中調(diào)用。,30,習(xí)題7.3,1下列對(duì)字符串的定義中,錯(cuò)誤的是: 。 A) char str7 = “FORTRAN“; B) char str = “FORTRAN“; C) char *str = “FORTRAN“; D) char str = F,O,R,T,R,A,N,0; 2以下程序段的輸出結(jié)果是:_ 。 char a = “ABCDE“ ; char *p = NULL; for (p=a; pa+5; p+) printf(“%sn“, p); ,A)ABCDE B)A C)E D)ABCDE B D BCDE C C CDE D B DE E A E,31,下面函數(shù)實(shí)現(xiàn)strlen函數(shù)的功能,即計(jì)算指針p所指向的字符串中的實(shí)際字符個(gè)數(shù)。 unsigned int MyStrlen(char *p) int len; len = 0; for (; *p != ; p+) len ; return ; ,0,+,len,習(xí)題7.4,32,下面函數(shù)也是實(shí)現(xiàn)strlen函數(shù)功能的,但計(jì)算字符串s中的實(shí)際字符個(gè)數(shù)的方法與上一道題有所不同。 unsigned int MyStrlen(char s) char *p = s; while (*p != ) p+; return ; ,0,p-s,習(xí)題7.5,33,習(xí)題7.6,int MyStrcmp(char s, char t) int i; for (i=0; si = ti; i+ ) if (si = ) return 0 ; return ( ); ,0,si-ti,34,下面函數(shù)實(shí)現(xiàn)strcmp函數(shù)的功能,即比較兩個(gè)字符串的大小,將兩個(gè)字符串中第一個(gè)出現(xiàn)的不相同字符的ASII碼值之差作為比較的結(jié)果返回,返回值大于0表示第一個(gè)字符串大于第二個(gè)字符串,返回值小于0表示,表示第一個(gè)字符串小于第二個(gè)字符串,當(dāng)兩個(gè)字符串完全一樣時(shí),返回值為0。 int MyStrcmp(char *p1, char *p2) for (; *p1 = *p2; p1+,p2+) if (*p1 = 0) return ; return ; ,0,*p1-*p2,習(xí)題7.7,35,指針與二維數(shù)組,#define M 2 #define N 3 int bMN; 兩種觀(guān)點(diǎn): 看成一個(gè)一維數(shù)組 看成數(shù)組的數(shù)組,36,將二維數(shù)組看成一個(gè)一維數(shù)組,int bMN; 二維數(shù)組b相當(dāng)于一個(gè)有6個(gè)元素的一維數(shù)組 若有int *p=(總之是列地址) bij相對(duì)于數(shù)組起始地址的偏移量為i*N+j 則pi*N+j或*(p+i*N+j)表示每一個(gè)數(shù)組元素。,37,填空題:求二維數(shù)組元素的和,#include void main() int a34=1,3,5,7,9,11,13,17,19,21,23; int i,j,sum=0,*p= ; for ( i=0 ;i3;i+) for(j=0; j4; j+) sum+=p ; printf(“sum=%4d“,sum); ,a0或&a00,i*4+j,38,#include void main() int a34=1,3,5,7,9,11,13,17,19,21,23; int *p= ; for ( ; ;p+) if ( )%4=0) printf(“n“); printf(“%4d“, ); ,填空:輸出二維數(shù)組元素的值,1 3 5 7 9 11 13,輸出結(jié)果: 1 3 5 7 9 11 13 15 17 19 21 23,a0或&a00,pa0+12,p-a0,*p,39,將二維數(shù)組看成數(shù)組的數(shù)組,行地址,將二維數(shù)組的每一行看成一維數(shù)組,*(b+1),*(b+0),再將二維數(shù)組b看成由b0,b1兩個(gè)元素組成的一維數(shù)組,注意: b0,b1存放的是每行的首地址,40,指針與二維數(shù)組,行地址,b+0,b+1,一維數(shù)組b,b,b1 *(b+1),b0 *(b+0),列地址,b0+0 b0+1 b0+2 *(b+0)+0 *(b+0)+1 *(b+0)+2,一維數(shù)組b0,b1+0 b1+1 b1+2 *(b+1)+0 *(b+1)+1 *(b+1)+2,列地址,b10 b11 b12 *(*(b+1)+0) *(*(b+1)+1) *(*(b+1)+2),b00 b01 b02 *(*(b+0)+0) *(*(b+0)+1) *(*(b+0)+2),一維數(shù)組b1,請(qǐng)注意:這樣的一維數(shù)組只是一個(gè)示意圖,并不在內(nèi)存中存在。,41,指針與二維數(shù)組,b 代表二維數(shù)組的首地址,指向第0行的首地址(行地址) b+i 指向第i行的首地址(行地址) *(b+i) 或 bi 代表第i行第0列的地址(列地址) *(b+i)+j 或 bi+j 代表第i行第j列的地址(列地址) *(*(b+i)+j ) 或 bij 代表第i行第j列的元素(數(shù)組元素),42,用數(shù)組名引用二維數(shù)組元素,元素bij的幾種等價(jià)的引用方式 bij *(bi+j) *(*(b+i)+j) (*(b+i)j,如何用指針變量引用二維數(shù)組元素?,43,習(xí)題7.8,設(shè)有語(yǔ)句:int array34; 則在下面幾種引用下標(biāo)為i和j的數(shù)組元素的方法中,不正確的引用方式是:_ A)arrayij B)*(*(array + i) + j) C)*(arrayi + j) D)*(array + i*4 + j),D,44,二維數(shù)組與指針,用指針指向二維數(shù)組,有兩種指針: 列指針,這種指針指向二維數(shù)組的每一個(gè)元素,它每加1,指向二維數(shù)組的下一個(gè)數(shù)組元素。 行指針,這種指針指向二維數(shù)組的行,它每加1,指向二維數(shù)組的下一行。 上邊兩種指針?lè)謩e對(duì)應(yīng)著對(duì)二維數(shù)組的兩種看法。,45,二維數(shù)組的行指針,行指針指向二維數(shù)組的行 例:int (*p) 3; 含義:定義一個(gè)指針變量p,用于指向一行(每行有3個(gè)元素) 定義格式 :類(lèi)型 (*行指針名) 常量N;,要用p指向數(shù)組b,如何初始化? p=b(或p=/*用行地址初始化*/ p+的含義是? 指向b1,即指向下一行的開(kāi)始位置,是行地址。 如何用P引用b中每一個(gè)數(shù)據(jù)元素? pij *(pi+j) *(*(p+i)+j) (*(p+i)j,46,#include void main() char a510=“abcde“,“abc“,“abcd“,“ab“,“abcdef“; char (*p)10; int i; for(i=0;i5;i+) p=a+i; printf(“%sn”,*p); p=a+2; p+; printf(“*p=%cn“,*p); ,例8二維數(shù)組與指針數(shù)組的對(duì)比,/*行指針,其變化是行方向的地址變化*/ /*指向第i行*/ /*注意:*p仍然是地址,該語(yǔ)句輸入從這個(gè)地址開(kāi)始到0結(jié)束的那一串字符*/,輸出結(jié)果: abcde abc abcd ab abcdef ab,47,#include void main() char *a5=“abcde“,“abc“,“abcd“,“ab“,“abcdef“; char *p; int i; for(i=0;i5;i+) p=a+i; printf(“%sn”,*p); p=a+2; p+; printf(“*p=%cn“,*p); ,讀程序,a,/*定義一維指針數(shù)組a,a有五個(gè)數(shù)組元素,每個(gè)元素存字符串的首地址*/ /*二級(jí)指針*/ /* p指向指針數(shù)組a的每一個(gè)元素*/ /*注意:*p與pi等價(jià),仍然是地址*/,輸出結(jié)果: abcde abc abcd ab abcdef ab,48,相關(guān)語(yǔ)法:指針數(shù)組,元素均為指針類(lèi)型數(shù)據(jù)的數(shù)組,稱(chēng)為指針數(shù)組 定義形式為: 類(lèi)型關(guān)鍵字 *數(shù)組名數(shù)組長(zhǎng)度; 例如 char *a5; 含義:,注意與行指針的區(qū)別: char (*a)5;,49,例9:字符串排序 方法一:用二維數(shù)組解決,char strN10 = “Pascal“,“Basic“,“Fortran“, “Java“,“Visual C“; for (i=0; iN-1; i+) /*交換法排序*/ for (j = i+1; jN; j+) if (strcmp(strj, stri) 0) strcpy(temp,stri); strcpy(stri,strj); strcpy(strj,temp); /*交換的是每一對(duì)字符串*/ ,50,方法1排序前后,若順序發(fā)生變化,交換每個(gè)字符。,請(qǐng)注意:這樣的一維數(shù)組只是一個(gè)示意圖,并不在內(nèi)存中存在。,51,例: 方法二:用指針數(shù)組解決,char *ptrN = “Pascal“,“Basic“,“Fortran“, “Java“,“Visual C“; for (i=0; iN-1; i+) /*交換法排序*/ for (j = i+1; jN; j+) if (strcmp(ptrj, ptri) 0) temp = ptri; ptri = ptrj; ptrj = temp; /*交換的是地址*/ ,52,方法2排序前后,指針的好處之二: 提高效率!,若順序發(fā)生變化,交換數(shù)組元素(地址)。,53,#include void ave(float (*p)3,int n); void main() int num; float score53=65,98,76,78,69,87, 67,68,81,80,65,98,64,83,79; printf(“please input number of student, I will tell you his average score:“); scanf(“%d“, ,例10:求某個(gè)學(xué)生的平均值,54,#include float *find(float(*pionter)4,int n); void main() float score53=65,98,76,78,69,87, 67,68,81,80,65,98,64,83,79; float *p; int i,m; printf(“Enter the number to be found:“); scanf(“%d“, ,輸出某個(gè)學(xué)生的成績(jī),返回指針值的函數(shù),55,小結(jié)3,二維數(shù)組與指針 二維數(shù)組與指針的關(guān)系 區(qū)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論