C語言程序設(shè)計教學(xué)課件:第9章 指針_第1頁
C語言程序設(shè)計教學(xué)課件:第9章 指針_第2頁
C語言程序設(shè)計教學(xué)課件:第9章 指針_第3頁
C語言程序設(shè)計教學(xué)課件:第9章 指針_第4頁
C語言程序設(shè)計教學(xué)課件:第9章 指針_第5頁
已閱讀5頁,還剩96頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、共 90 頁 第 1 頁第九章 指 針C語言程序設(shè)計共 90 頁 第 2 頁本 章 要 點1. 理解指針與地址的概念;2. 掌握指針的定義和運算;3. 掌握指向基本類型、數(shù)組、字符串的指針的使用;4.充分理解指針和數(shù)組的等價性;5.掌握指針函數(shù)和函數(shù)指針的使用;6.了解指向指針的指針的概念及其使用。共 90 頁 第 3 頁預(yù) 備 知 識內(nèi)存:就是內(nèi)部存儲器,是由存儲單元組成 的。它的特點是存儲單元是線性連續(xù) 的。存儲單元的最小單位是字節(jié)。 1. 內(nèi)存的概念共 90 頁 第 4 頁地址:為了訪問內(nèi)存中的某個存儲單元,我們 要為它編號,這種編號稱為內(nèi)存地址。 通過地址我們就能夠訪問該地址所標 識的

2、存儲單元。2. 地址的概念共 90 頁 第 5 頁變量的地址:變量的地址是變量在內(nèi)存中占用連續(xù)字節(jié)的首地址。2007存儲單元共 90 頁 第 6 頁以往對變量的訪問:定義變量: int k;編譯系統(tǒng)根據(jù)類型為k分配內(nèi)存。輸入變量的值:scanf(“%d”,&k); &k就代表了變量k在內(nèi)存中的地址。通過變量名訪問變量,這種操作稱為直接訪問;通過指針間接訪問:C提供了另一種方式,將變量 k的地址存放在另一個變量處(假定為pk),通過訪問 pk,就可以間接地訪問變量 k,這種方式稱為間接訪問。變量的存取方法:直接存取和間接存取。 共 90 頁 第 7 頁引入指針程序設(shè)計的優(yōu)點有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)

3、。方便使用字符串、數(shù)組。可以得到多個返回值。可以進行動態(tài)分配內(nèi)存。程序簡潔、緊湊, 執(zhí)行效率高。共 90 頁 第 8 頁 9.1.1 指針的基本概念指針:一個變量的地址稱為該變量的指針。指針變量:若一個變量專用于存放另一個變量的地址(指針),則稱此變量為指針變量。 若指針變量p的值等于變量x的地址, 則說指針變量p指向變量x。1000351000pxx的值p的值X的內(nèi)存地址9.1 指針的基本概念及指針變量的定義共 90 頁 第 9 頁指針的對象:當(dāng)把變量的地址存入指針變量后,就可以說這個指針指向了該變量。 共 90 頁 第 10 頁9.1.2 指針變量的定義指針變量定義的一般形式: 類型標識符

4、 *標識符例:float *p1;int *p2;作用:定義變量為指針類型,使之專門用于存放地址。指針所指的變量的類型指針變量名共 90 頁 第 11 頁說明:(1)*用于定義指針變量,但指針變量名不帶*。 如 int *p1; float *p2; 定義的指針變量為p1,p2 (2)一個指針變量只能指向同一類型的變量。 如 p1 只能用于指向整型變量 p2 只能用于指向?qū)嵭妥兞浚?)無論指針變量指向何種類型,指針變量本身都是整型的,指針變量本身也有自己的地址,占兩個字節(jié)的存儲空間。 共 90 頁 第 12 頁1.取地址運算 & 格式: & 變量 設(shè)有變量說明 int a, b, *p, *q

5、; p=&a; 把a的地址賦給p,使p指向a q=p; 讓q也指向a,使p、q都指向a p=&b; 讓p指向b,使q指向a,p指向b 9.2 指針變量的引用和運算C語言提供兩種與指針有關(guān)的運算符:& *共 90 頁 第 13 頁 2. 取內(nèi)容運算 *格式: * 指針表達式設(shè)p是一個指針表達式,則:(1)若*p出現(xiàn)在賦值號左邊,表示給p所指變量賦值(2)若*p不出現(xiàn)在賦值號左邊,表示p所指變量的值 若有變量說明:int a, *p ; p=&a; 讓p指向變量a *p=10; 等價于 a=10 printf(“%d”, *p); 打印p所指變量的值 scanf(“%d”, &a); 給變量a輸入

6、值 scanf(“%d”, p); 給變量a輸入值 *p+25 等價于a+25共 90 頁 第 14 頁3. 為指針變量賦初值 指針變量使用前必須有值 指針變量的初值必須是地址值(不能是整數(shù)) 方法 :在說明指針變量時同時初始化 int a , b, *p = &a; p= &b; (2) 使用賦值語句賦值 int a,b,*p; p =&a ; p =&b 共 90 頁 第 15 頁 把值為0的指針變量稱作空指針變量。 空指針變量表示不指向任何地方,表示指針變量的一種狀態(tài)。 p=0 ; p=0; p=NULL; 三個語句等價。其中p為指針變量;0的ASCII碼值為0;NULL是在“stdio

7、.h”文件中定義的符號常數(shù),其值為0,代表地址0和空指針的概念。 如果給空指針變量所指內(nèi)存區(qū)域賦值,將會得到一個出錯信息。 *p=5; 4. 空指針共 90 頁 第 16 頁對*及&的說明:(同級運算,由右向左)若pa=&a (將 a 的地址送指針變量pa), 則&*pa &(*pa) &(a) &a pa*&a *(&a) *pa a (*pa)+ a+*pa+ *(pa+) (先取*pa值,然后使pa加1)*+pa *(+pa) (先使pa加1 ,再取*pa值)注意:此時pa不再指向a共 90 頁 第 17 頁例 9-1 輸出變量的值。 main( ) int a,b; int *pa,

8、*pb; a=100; b=10; pa=&a; pb=&b; printf(“%d,%dn”,a,b); printf(“%d,%dn”,*pa,*pb); 定義指針變量pa,pb將a的地址送pa將b的地址送pb輸出所指向的變量運行結(jié)果為100,10100,10共 90 頁 第 18 頁例9-2將兩個整型數(shù)a,b按由大到小次序輸出。main( ) int *p1 ,*p2 ,*p ,a ,b; scanf(“%d,%d”,&a,&b); p1=&a;p2=&b; if(a、=、q p指針所指元素位于q所指元素之后時為1,反之為0。 p=q p指針所指元素位于q所指元素之后(或兩指針指向同一元

9、素)時為1,反之為0。=和!=運算符,比較的是兩個指針表達式是否指向同一個內(nèi)存單元;、=,比較的是兩個指針所指內(nèi)存區(qū)域的先后次序語法格式: 指針表達式 關(guān)系運算符 指針表達式例:int a10; int *p=a, *q=a+3;判斷以下表達式的值p=&a0 p=&a1 p=q p+4=q+2 pa+2 pq 共 90 頁 第 28 頁5. 同類指針相減 同類指針相減時,兩個指針應(yīng)該指向連續(xù)存放的同類數(shù)據(jù)區(qū)域。 語法 :p-q 說明: p-q 的值,等于(p的值-q的值)/所指類型長度, 即p,q兩個指針之間數(shù)據(jù)元素的個數(shù)。 例如:若有 int a10 , *p, *q; p=a; q=&a5

10、; 則p-q=5 表示p,q之間數(shù)據(jù)元素的個數(shù)是 4。 共 90 頁 第 29 頁格式: (類型名 * ) 指針表達式功能:將指針表達式的值轉(zhuǎn)換成指定類型的指針。 例如: int *p; double d, *q=&d; p=(int * )q;6. 強制類型轉(zhuǎn)換運算共 90 頁 第 30 頁 9.3.3 通過指針引用數(shù)組元素引用數(shù)組中的元素可以用以下方法: 下標法 : 如 a3,ai 指針法: 即通過指向數(shù)組元素的指針找到所需的元素. 這種方法占內(nèi)存少, 運行速度快,程序代碼質(zhì)量高。 假設(shè)p已定義為指針變量,并已賦了一個地址,它指向某一個數(shù)組元素. 且有賦值語句p= &a0; 則: p+1

11、表示數(shù)組中的下一個元素, a+i和p+i都是ai 的地址,或者說它們指向ai. *(a+i) 或 *(p+i)是a+i或p+i所指向的數(shù)組元素。 指向數(shù)組的指針變量也可帶有下標,如pi與*(p+i)等價。共 90 頁 第 31 頁對下標為i的元素訪問: ai,*(a+i),*(p+i),pi對ai的地址表示: &ai,a+i,p+i,&pi 3412115678910p=aa0aia91000共 90 頁 第 32 頁例: 用三種方法輸出數(shù)組全部元素。下標法:main( ) int a10, i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); fo

12、r(i=0;i10;i+) printf(“%5d”,ai); 地址法(通過數(shù)組名計算數(shù)組元素地址)for(i=0;i10;i+)printf(“%5d”,*(a+i);指針法for(p=a;p(a+10);p+)printf(“%5d”,*p );共 90 頁 第 33 頁例9-3 用指針訪問數(shù)組元素。main( ) int a10,*pa, i; for (i=0;i10;i+) ai=i+1; pa=a; for(i=0;i10;i+,pa+) printf(“%d”,*pa); printf(“n”);不要忘記賦初值如何修改程序可以完成功能?共 90 頁 第 34 頁例9-4 給定10

13、個整數(shù),求最大值。main( ) int a10=5,7,3,6,2,1,8,9,4,0; int i, *p,max; p=a; max=*p+; for(i=1; imax ) max=*p ; printf ( “max=%dn”, max); 問題:如果修改語句for(i=1;imax) max=*p+ ;能實現(xiàn)程序功能嗎?問題:如果修改語句for(;pmax) max=*p ;能實現(xiàn)程序功能嗎?共 90 頁 第 35 頁9.3.4 字符串指針與字符串1.字符串的表示形式 用字符數(shù)組表示,如:main( ) char string =“I love China!”; printf(“%

14、sn”,string);數(shù)組名 用字符指針實現(xiàn),如:mian( ) char * string =“I love China!”; printf(“%sn”,string);把“I love China!”的首地址賦給指針變量string特點:字符串的長度不受限制;字符指針指向別處,字符串將失蹤.共 90 頁 第 36 頁2.字符指針變量與字符數(shù)組的比較字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是字符串的首地址。 賦值方式: char str =“I am a boy!” 或: char str20; scanf(“%s”,str);字符指針變量指向字符串首地址。賦

15、值方法三種: (1) char *pa=“I am a boy!” (2) char *pa; pa=“I am a boy!” (3) char *pa, str20; pa=str; scanf(“%s”,pa);共 90 頁 第 37 頁3 vc+6.0 字符指針變量的內(nèi)容是常量char *pa=“I am a boy!” (2) char *pa; pa=“I am a boy!”; pa2=A;不可以*(pa+2)=A;不可以scanf(“%c”,pa2);不可以scanf(“%s”,pa);不可以printf(“%c”,pa2);可以改用字符數(shù)組 char a =“I am a b

16、oy!”,*pa=a;Char pa=I am a boy!” 共 90 頁 第 38 頁 例9-5 已知下面程序的輸出結(jié)果:ABCDCD,請完善程序: main() char *chp=“ABCD”; for( ; _A_; chp=chp+2) printf(“%s”, _B_); printf(“n”); A. *chp!=0B. chp共 90 頁 第 39 頁例9-6將字符數(shù)組s1中的字符串拷貝到字符數(shù)組s2中去。#include stdio.hmain( )char s120, s220;int i; scanf(%s, s1); for( i=0; *s1 i!=0; i+) s

17、2i=s1i; s2i=0; printf(%sn,s2); 共 90 頁 第 40 頁例9-6將字符數(shù)組s1中的字符串拷貝到字符數(shù)組s2中去。#include stdio.hmain( )char s120, s220, *p1=s1, *p2=s2; scanf(%s, p1); for( ; *p1 !=0; p1+, p2+) *p2=*p1; *p2=0; printf(%sn,s2); 共 90 頁 第 41 頁例9-7 :刪除字符串尾部的空格#include stdio.hint main( )char str=ab cd , *p; printf(“*%s*n,str); fo

18、r( p=str;*p !=0; p+); for( p-;*p = ;p-) *p=0; printf(“*%s*n,str); return 0; 共 90 頁 第 42 頁作用: 函數(shù)的參數(shù)不僅可以是整型、實型、字符型,還可以是指針型,它的作用是將一個變量的地址傳送到另外一個函數(shù)中。int* fun( int *p1, int* p2) int *p; . return p;9. 4 指針與函數(shù)9.4.1 指針變量作函數(shù)參數(shù)共 90 頁 第 43 頁例:交換兩個變量的值。注意函數(shù)調(diào)用形實結(jié)合方式.swap(int x,int y) int t; t=x; x=y; y=t;main( )

19、 int a,b; scanf(“%d,%d”,&a,&b); if(ab) swap(a,b); printf(“%d,%dn”,a,b); 單向值傳遞!調(diào)用函數(shù)時a的值傳送給x,b值傳送給y,可是執(zhí)行完函數(shù)后,x和y的值是互換了,但a,b的值并未互換。共 90 頁 第 44 頁swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;main( )int a,b; int *pa, *pb; scanf(“%d,%d”,&a,&b); pa=&a; pb=&b; if(ab) swap(pa,pb); pintf(“%d,%dn”,a,b); 運

20、行情況:5,99,5交換指針所指向的變量的值分析觀察使用指針做形參和實參的結(jié)果例:將兩個數(shù)按從大到小順序輸出(交換兩個變量的值)。結(jié)論:被調(diào)用函數(shù)不能改變實參指針變量的值,但可以改變實參指針變量所指向的變量的值。共 90 頁 第 45 頁函數(shù)調(diào)用過程如下圖所示:調(diào)用swap函數(shù)之前:pa &a 5 a &b pb 9 b共 90 頁 第 46 頁 &ap1 &bp2 5 &apa a 9 &bpb b &a 9 &apap1 a 5 &b &bpbp2 b執(zhí)行函數(shù)語句,p1、p2所指向的變量的值相互交換*p1*p2ab共 90 頁 第 47 頁pa &a 9 a &b 5 pb b函數(shù)調(diào)用結(jié)束

21、后,p1、p2所占用的內(nèi)存單元被釋放,共 90 頁 第 48 頁swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; main( )int a,b;int *pa, *pb; scanf(“%d,%d”,&a,&b); pa=&a; pb=&b; if(ab) swap(pa, pb);printf(“%d,%dn”,*pa,*pb);C語言中,實參和形參間的數(shù)據(jù)是單向值傳遞方式。指針做函數(shù)參數(shù)也遵循該原則.改變指針形參的值,也不能改變指針實參的值.結(jié)果為:?交換了兩個指針中的內(nèi)容。共 90 頁 第 49 頁 9.4.2 數(shù)組名作函數(shù)參數(shù) 當(dāng)用數(shù)組名

22、作為參數(shù)時,如果形參數(shù)組中元素的值發(fā)生變化,實參數(shù)組元素的值也隨之變化,為什么? 若有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實參與形參的對應(yīng)關(guān)系有以下4種情況: 形參與實參都用數(shù)組名 實參用數(shù)組名,形參用指針變量 實參形參均用指針變量 實參為指針變量,形參為數(shù)組名都是地址傳遞,只是形式不同!共 90 頁 第 50 頁例9-6:用選擇法對10個整數(shù)由小到大排序。方法1:形參和實參都用數(shù)組名(在函數(shù)中介紹的)main( ) int i, a10;void sort( );for(i=0;i10;i+) scanf(%d”,&ai);sort(a,10);for(i=0; i10 ;i+)

23、printf(%d, ai); void sort( int x , int n) int i,j, t; for(i=0;in-1;i+) for(j=i+1;jxj) t=xi; xi=xj; xj=t; 形參是數(shù)組名實參也是數(shù)組名共 90 頁 第 51 頁方法2:形參是數(shù)組名,實參是指針變量。main( ) int *p, i, a10;void sort( );p=a;for(i=0;i10;i+) scanf(%d,p+);sort(p,10);for(p=a, i=0; i10 ;i+) printf(%d, *p+); void sort( int x, int n) int i

24、,j, t; for(i=0;in-1;i+) for(j=i+1;jxj) t=xi; xi=xj; xj=t; p=a;形參是數(shù)組名實參是指針當(dāng)用數(shù)組名作函數(shù)參數(shù)時,由于數(shù)組名代表的是數(shù)組首元素地址,因此傳遞的是地址,所以要求實參為指針變量。共 90 頁 第 52 頁方法3:實參是數(shù)組名,形參是指針變量。void sort( int *x, int n) int i,j, t; for(i=0;in-1;i+) for(j=i+1;j*(x+j) t=*(x+i); *(x+i)=*(x+j); *(x+j)=t; 實參是指針main( ) int i, a10;void sort( );

25、for(i=0;i10;i+) scanf(%d”,&ai);sort(a,10);for(i=0; i10 ;i+) printf(%d , ai); 形參是指針實參是數(shù)組名共 90 頁 第 53 頁方法4:實參和形參都是指針變量。void sort( int*x, int n) int i,j, t; for(i=0;in-1;i+) for(j=i+1;jxj) t=*(x+i); *(x+i)=*(x+j); *(x+j)=t; 實參是指針main( ) int *p, i, a10;void sort( );p=a;for(i=0;i10;i+) scanf(%d,p+);p=a;s

26、ort(p,10);for(p=a, i=0; iy) z=x; else z=y; return (z);指向函數(shù)的指針指向max函數(shù)共 90 頁 第 66 頁在一個程序中,一個指針變量可以先后指向不同的函數(shù); 例如: int (*p)( ); int max( ); int min( ); p=max; c=(*p)(a , b); p=min; c=(*p)(a , b);P先于*結(jié)合,是指針變量,然后再與()結(jié)合,表示此指針變量指向函數(shù)。共 90 頁 第 67 頁例9-10main ( ) int (*p)( ); int a,b ,c, k; scanf(%d,%d,%d”,&a,&

27、b,&k); if (k=0) p=max; else p=min; c=(*p)(a,b); printf(“a=%d,b=%d,m=%d”,a,b,c); max(int x,inty;) int z; if (xy) z=x; else z=y; return (z);min(int x,int y;) int z; if (xy) z=x; else z=y; return (z);指向函數(shù)的指針指向max函數(shù)用函數(shù)的指針調(diào)用函數(shù)共 90 頁 第 68 頁實參函數(shù)名f1 f2 sub(int(*x1)( ) , int (*x2)( ) )int a,b,i,j;a=(*x1)(i);

28、b=(*x2)(i,j);定義x1,x2為函數(shù)指針變量調(diào)用f1函數(shù)調(diào)用f2函數(shù)2. 指向函數(shù)的指針變量做函數(shù)的形參函數(shù)的實參用函數(shù)名int f1( ).int f2( ).main()sub(f1,f2); 共 90 頁 第 69 頁9.5 指針與二維數(shù)組9.5.1 二維數(shù)組的結(jié)構(gòu) 一個數(shù)組的名字代表該數(shù)組的首地址,并可看成是地址常量,這一規(guī)定對二維數(shù)組或更高維數(shù)組同樣適用。若有定義: float *p, d35;則:可以把d看作是一個一維數(shù)組,共有3個元素,每個元素又都是一個5個元素的實型數(shù)組。二維數(shù)組名 d 代表第一行的首地址。d+1第二行的首地址d00d01d02d03d04d10d11

29、d12d13d14d20d21d22d23d24d0d1d2d共 90 頁 第 70 頁二維數(shù)組元素的地址-用行地址轉(zhuǎn)換int a34=1,3,5,7,9,11,13,15,17,19,21,231 3 5 7 9 11 13 1517 19 21 23a0a1a2aa0+2 , *(a+0)+2, &a02&a11 ,a1+1, *(a+1)+1&a00&a10&a20*(a+0)*(a+1)*(a+2)a0+0 , *(a+0)+0, &a00a0, *a &aij ,ai+j, *(a+i)+j共 90 頁 第 71 頁二維數(shù)組元素的地址用首地址轉(zhuǎn)換int a34=1,3,5,7,9,1

30、1,13,15,17,19,21,23int *p=&a00;1 3 5 7 9 11 13 1517 19 21 23&a02, p+2, p+0*4+2 &a11 , p+5, p+1*4+1,int aMN,*p;p=&a00;p=a0&aij=p+i*N+j&a00, p+0*4+0 共 90 頁 第 72 頁用指針引用二維數(shù)組元素int a34=1,3,5,7,9,11,13,15,17,19,21,231 3 5 7 9 11 13 1517 19 21 23a0a1a2a*(a0+2) , *(*(a+0)+2), a02a11 ,*(a1+1), *(*(a+1)+1)&a00

31、&a10&a20*(a+0)*(a+1)*(a+2)aij ,*(ai+j),*(*(a+i)+j) *(&a00+4*i+j) a00*a0, *a 共 90 頁 第 73 頁例9-11 用指向變量的指針訪問二維數(shù)組main( ) int n=1,a54; int *p=a0; /*指向一維數(shù)組*/ for ( ; pa0+20; p+) *p=n+; /*為數(shù)組元素賦值*/ for ( p=a; pa+20; p+) printf(%4d,*p); if (p-a0+1)%4=0) printf(n); 輸出結(jié)果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1

32、6 17 18 19 20共 90 頁 第 74 頁以上程序可改為下列形式:main( ) int n=1,i,a54; int *p=a0; for (i=0;i20;i+) *(p+i)=n+; for (i=0;i20;i+) printf(%4d,*(p+i); if (i+1)%4=0) printf(”n); 輸出結(jié)果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20保持指針變量內(nèi)容不變使指針順序移動共 90 頁 第 75 頁int i,j;main( ) int *p, a34, b34, c34; printf(The va

33、lue of a:n); for(i=0; i3; i+) for(j=0; j4; j+) scanf(%d,ai+j); printf(The value of b:n); for(i=0; i3; i+) for(j=0; j4; j+) scanf(%d, *(b+i)+j);例9-11: 將a矩陣與b矩陣相加,計算結(jié)果存入c矩陣。表示a數(shù)組第i行第j列元素的地址表示b數(shù)組第i行第j列元素的地址共 90 頁 第 76 頁 matrix(*a, b0, &c00); printf(The value of c:); for(p=c0; pc0+12; p+) if (p-c0+1)%4=

34、0) printf(n); printf(%-4d,*p); matrix(int *x, int *y, int *z) for(i=0; i3; i+) for(j=0; j4; j+) *(z+i*4+j )=*(x+i*4+j)+ *(y+i*4+j); /zij=xij+yij; 數(shù)組元素在內(nèi)存中按“行優(yōu)先”的順序存放,因此可用z+i*4+j表示二維數(shù)組各元素的地址,相當(dāng)于&zij ,*(z+i*4+j)就是取該元素的值。*a相當(dāng)于*(a+0),即a0表示a數(shù)組第0行第0列元素的地址。b0表示 b數(shù)組第0行第0列元素的地址。&c00表示 c數(shù)組第0行第0列元素的地址。計算aij在數(shù)組

35、中相對位置的計算公式為:i*m+jm為二維數(shù)組的列數(shù)共 90 頁 第 77 頁9.5.3 指向數(shù)組的指針變量(行指針)1. 定義格式 類型說明符 (*變量名)正整型常量表達式2. 功能 定義一個名為“變量名”的指針變量,這個指針變量所指的對象是一個有“正整型常量表達式”個元素的一維數(shù)組。例如:int a34,(*p)4=a;定義p是一個指針變量,它指向包含4個整型元素的一維數(shù)組。 p的值就是該一維數(shù)組的起始地址。a0a1a2P=ap+1p+2共 90 頁 第 78 頁例9-13:輸出二維數(shù)組任一行任一列元素aij的值main( ) double a34=1,3,5,7,9,11,13,15,1

36、7,19,21,23; int *p,i,j ; p=a; scanf(“%d,%d”,&i,&j); printf(“a%d%d=%fn”, i , j,*(p+i*4+j);輸入1,2運行結(jié)果:a12=13這里的指針變量p是定義為指向整型數(shù)據(jù)的aij在數(shù)組中的位置用相對于數(shù)組起始位置的相對移位量計算共 90 頁 第 79 頁例9-13輸出二維數(shù)組任一行任一列元素aij的值main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j ; p=a; scanf(“%d%d”,&i,&j); printf(“a%d%d=%dn”, i

37、 , j,*(*(p+i)+j); 1 3 5 7 9 11 13 1517 19 21 23p,ap+1p+2a0a1a2=p=a;aij=*(*(p+i)+j);aij=*(pi+j);共 90 頁 第 80 頁例9-15 閱讀下面程序。 main( )int i;int *q,(*p)4,a34=2,4,6,8,10,12,14,16,18,20,22,24; q=a0; for(i=1;i=0;i-) printf(%dt, *(pi+i); printf(n);程序運行結(jié)果: 2 6 10 14 22 12 2 第i行j列元素的地址為:pi+j第i行j列元素的值為:*(pi+j)q是

38、定義為指向整型數(shù)據(jù)的P指向一個包含4個整型元素的一維數(shù)組。2 4 6 810 12 14 1618 20 22 24 共 90 頁 第 81 頁#include “stdio.h”void average(float *p,int n) float *p1,sum=0,aver; p1=p+n-1; for(;p=p1;p+) sum=sum+(*p); aver=sum/n; printf(“average=%5.2fn,aver);例9-16 有3名學(xué)生,各學(xué)4門課程,利用指向數(shù)組的指針變量計算總平均分及第n個學(xué)生的成績。void serach(float (*p)4,int n) int

39、 i; printf(“The score of No.%d are :n”,n); for(i=0;i4;i+) printf(“%5.2f ”,*(*(p+n)+i); printf(“n”);main( ) float score34=65,67,70,60,80,87,90,81,90,99,100,98; average(score,12); serach(score,2);共 90 頁 第 82 頁定義一個由 6個指針變量構(gòu)成的指針數(shù)組,數(shù)組中的每個數(shù)組元素都是一個指向一個整數(shù)的指針變量。整數(shù)整數(shù)整數(shù)整數(shù)整數(shù)整數(shù)pa0pa1pa2pa3pa4pa5指針數(shù)組pa指針數(shù)組:數(shù)組中的元素

40、均為指針類型。適合用來指向字符串1.定義形式:數(shù)據(jù)類型 * 數(shù)組名常量表達式例如: int *pa6;2.功能:9.6 指針數(shù)組共 90 頁 第 83 頁3.指針數(shù)組的初始化 必須用地址值為指針數(shù)組初始化 int a33 = 1,2,3,4,5,6,7,8,9,*pa3; pa0=a0;pa1=a1;pa2=a2; 1 2 34 5 67 8 9a0a1a2*pa0*pa1*pa2指針數(shù)組*pa3 相當(dāng)于有三個指針,*pa0,*pa1,*pa2 初始化的結(jié)果:共 90 頁 第 84 頁 字符串?dāng)?shù)組:數(shù)組中的每個元素都是存放字符的數(shù)組。 字符串?dāng)?shù)組的每一行可存放一個字符串。 用賦初值的方式給字符

41、串?dāng)?shù)組賦值:直接給字符串?dāng)?shù)組賦初值char b48=VC,FORTRAN,BASIC, Foxpro;由于字符串長短不一,定義時應(yīng)考慮最長的串和結(jié)束標志的位置。造成內(nèi)存單元浪費。4. 用指針數(shù)組訪問字符串 F O R T R A N 0 B A S I C 0F o x p r o 0 V C 0二維字符數(shù)組共 90 頁 第 85 頁用給字符型指針數(shù)組賦初值的方式構(gòu)成字符串?dāng)?shù)組若有定義:char *f4= Turbo C, FORTRAN, BASIC, Foxpro;此定義還可以寫成:char *f= Turbo C, FORTRAN, BASIC, Foxpro;則數(shù)組f中的每個元素都存放

42、著對應(yīng)的一個字符串的首地址,各字符串依次存入各相應(yīng)的首地址開始的連續(xù)存儲單元中。 F O R T R A N 0 B A S I C 0F o x p r o 0f0f1f2f3 T u r b o C 0節(jié)省內(nèi)存空間!共 90 頁 第 86 頁例9-16#include “stdio.h”main( )char *s4=“dog”,“cat” , “pig”, “all animals”; int i; for (i=0; i 4; i+) printf(“%sn”, si);指針數(shù)組S各元素的內(nèi)容是指向各字符串的首地址。運行結(jié)果:dogcatpigall animals共 90 頁 第 8

43、7 頁例9-18 將5個字符串從小到大排序后輸出。/*用指針數(shù)組實現(xiàn)將5個字符串從小到大排序后輸出*/#include “stdio.h”#include “string.h”void main() int i; char *p=“red”,”blue”,”yellow”,”green”; void fsort(char *clolor,int n); fsort(p,4); /* 調(diào)用函數(shù) */ for(i=0;i4;i+) printf(“%sn”,pi); 共 90 頁 第 88 頁/* 使用冒泡法實現(xiàn)字符串從小到大排序 */void fsort(char *color,int n) i

44、nt k,j; char *temp; for(k=1;kn;k+) for(j=0;j0) temp=colorj; colorj=colorj+1; colorj+1=temp; p0p1p2p3b l u e 0y e l l o w 0g r e e n 0r e d 0p共 90 頁 第 89 頁9.8 二級指針指向指針的指針: 指向指針數(shù)據(jù)的指針變量。通常用于指向字符型指針變量。說明格式: 類型說明符 * 指針變量名例如: char * p;定義指針變量p,用于存儲另一個指針變量的地址。 共 90 頁 第 90 頁例如:main( )int x=1,y=2,z=3; int *p1

45、3; int *p2; p10=&x, p11=&y, p12=&z; p2=p1; printf(“%dn”, *p2); printf(“%dn”, *(p2+1); printf(“%dn”, *(p2+2);共 90 頁 第 91 頁例如:main( )char *s =“China”,“Japan”, “English”,”Franch”; char *p; int i; p=s+2; /p=&s2; printf(“%sn”, *p);*p=*(s+2)=s2存放的是English的首地址打印p指針內(nèi)的內(nèi)容,即指針指向的字符串chinajapanenglishfranchS0S1S

46、2S3p共 90 頁 第 92 頁有關(guān)指針數(shù)據(jù)類型的小結(jié)定義:int p; p為整型變量int *p;.p為指向整型數(shù)據(jù)的指針變量;int *pN;.定義指針數(shù)組p,它由N個指向整型數(shù)據(jù)指針元素組成;int (*p)N;定義指向含N個元素的一維數(shù)組的指針變量p;int p( );p為帶回整型函數(shù)值的函數(shù);int *p( );p為帶回一個指針的函數(shù),該指針指向整型數(shù)據(jù);int (*p)( );.p為指向函數(shù)的指針,該函數(shù)返回一個整型值;int *p;.p是一個指針變量,它指向一個指向整型數(shù)據(jù)的指針變量。二級指針。指針在使用前一定要賦值,指針可以指向任何數(shù)據(jù)類型,指向誰,就存誰的地址必須用地址值為指針變量初始化(&變量名,&a,或數(shù)組名),不允許用整數(shù)相同類型的指針可以相互賦值優(yōu)缺點:快速靈活、可實現(xiàn)動態(tài)存儲分配;易出大錯。共 90 頁 第 93 頁int aMN, aN;ai和*(a+i)無條件等價a+i、ai、*(a+i)、&ai0均表示第i行首地址

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論