2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十章 指針 指針:C的一個(gè)重要概念、重要特色。它使C具備了強(qiáng)大的功能,使C成為程序設(shè)計(jì)語言之首。正確而靈活地運(yùn)用它,就可以方便地處理很多其它高級語言所不能處理的問題。 不掌握指針等于沒有掌握C語言的精華。,10.1 指針的概念 簡單地說,指針就是地址。 要掌握指針的概念就必須弄清: ■內(nèi)存地址概念? ■變量與地址的關(guān)系? ■如何通過地址進(jìn)行變量的存取?,說明例:

2、 內(nèi)存用戶數(shù)據(jù) 1000 3 i

3、 1002 6 j 1004 9 k對變量值的存取總是按地址進(jìn)行的----直接訪問。,int i,j,k;i=3; j=6;k=i+j;,,,,,,,,,,程序經(jīng)編譯后,變量名就不復(fù)存在,以地址對應(yīng)。,也可以采用“間

4、接訪問”方式: 先將變量i的地址存放到另一變量p1中,要訪問i時(shí),先取出p1的內(nèi)容(變量i的地址),再去訪問該地址所對應(yīng)的內(nèi)存單元中的內(nèi)容(變量i的值)。,內(nèi)存用戶數(shù)據(jù) 1000 3 i 1002 6

5、 j 1004 9 k 2000 1000 p1 2004 1002 p2,,,,,,,,,,,,int i,j,k;i=3;

6、 j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j;,在以上概念的基礎(chǔ)上對指針下定義: 變量的地址就是該變量的指針。 存放地址的變量稱指針變量。 若p1存放了變量i的地址, 則稱p1是指向變量i的指針變量。,int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j;,10.2 變量的指針和指向變量的指針變量

7、 變量的指針 指針變量 指向變量的指針變量 用“*”代表“指向” 如*p1代表它所指向的變量i,同一內(nèi)存單元。 以下兩個(gè)語句等價(jià): i=3; 直接訪問 *p1=3; 間接訪問int i,*p1;p1=&i;,內(nèi)存用戶數(shù)據(jù) 1000

8、 3 i 1002 6 j 1004 9 k 2002 1000

9、 p1 2004 1002 p2,,,,,,,,,,,,,,,,,,int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j;*p1=5;*p2=8;,,5,8,■指針變量的定義 指針變量也必須先定義后使用。 int *p1;注意: ① *表

10、示該變量為指針變量,但變量名是p1。 ② 一個(gè)指針變量只能指向同一類型的變量。 int i,*p1; float a; p1=&i; 合法 p1=&a; 不合法,■指針變量的引用 兩種用法: ①用地址運(yùn)算符& p1=&i; ②用指針運(yùn)算符* (實(shí)行間接訪問) *p1=100; k=*p1; 注意: 指針變量只能放地址(指

11、針)。 p1=100; 不允許 使用指針運(yùn)算符*之前,p1必須被賦值(即p1必須存放了某個(gè)變量的地址),例: T10-1.c 注意:要區(qū)別定義和引用中的“*”main(){ int a=100,b=10; int *p1,*p2; 定義指針變量,尚無體指向 p1=&a; p1指向a p2=&b;

12、 p2指向b printf(“*p1=%d, *p2=%d\ n”, *p1, *p2); printf(“&a=%x,& b=%x\ n”,&a, &b); printf(“p1=%x, p2=%x\ n”, p1, p2); printf(“& p1=%x, &p2=%x\ n”, &p1, &

13、p2);},運(yùn)算結(jié)果:*p1=100, *p2=10&a=12ff7c,& b=12ff78p1=12ff7c, p2=12ff78&p1=12ff74, &p2=12ff70,要特別注意以下用法的后果:egp1.c int *p1; *p1=100;,例:輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出 main() T10-2.c{ int a,b,*p1, *

14、p2, *p; scanf(“%d,%d”,&a,&b); 1000 5 a p1=&a; p2=&b; 1002 9 b if(a<b) { p=p1; p1=p2; p2=p;} printf(“\n %d,%d”,a,b); 2000

15、 p1 printf(“\n%d,%d”,*p1,*p2); 2004 p2} 2006 p 改變p1和p2的指向,,,,,,,,,,,1000,1002,1002,1000,1000,重要概念: 只要將某一變量的地址存入指針變

16、量中,就可通過指針變量間接訪問該變量。 配鑰匙!,swap(int p1, int p2) { int t; t=p1;   p1=p2; p2=t; 1000 5

17、a } 1002 9 b main() { int a,b; scanf(“%d,%d”,&a,&b); 2000

18、 p1 if(a<b)swap(a, b); 2004 p2 printf(“\n %d,%d”,a,b); 2006 t } T10-3-1.c,,,,,,,,,,,5,9,5,9,5,例 不用指針變量作函數(shù)參數(shù),將兩個(gè)整數(shù)按大小順序輸出。,怎樣直接修改a、b的值呢?,修

19、改原件——用指針!,■指針變量作為函數(shù)的參數(shù) 可將指針變量作函數(shù)的參數(shù),接受實(shí)參地址,獲得具體指向,進(jìn)而通過指針變量間接訪問主調(diào)函數(shù)的變量。,例T10-3.c用指針變量作函數(shù)參數(shù),將兩個(gè)整數(shù)按大小順序輸出。swap(int *p1, int *p2) { int t; t=*p1;  *p1=*p2;

20、 *p2=t; 1000 5 a } 1002 9 b main() { int a,b;

21、 scanf(“%d,%d”,&a,&b); 2000 p1 if(a<b)swap(&a,&b); 2004 p2 printf(“\n %d,%d”,a,b); 2006

22、 t },,,,,,,,,,,,1000,1002,5,9,5,重要概念:使用指針變量作函數(shù)參數(shù),被調(diào)函數(shù)可以將多個(gè)結(jié)果交給主調(diào)函數(shù)。 數(shù)組名做參數(shù),可返回該數(shù)組所有元素 還記得那個(gè)求成績最高、最低和平均值的例子?還需要用全局變量嗎?,例T10-4-2.c :求n個(gè)數(shù)的最大值、最小值和平均值。float aver(int a[], int n, int *max, int *min){ int i; float s

23、=0; *max=a[0]; *min=a[0]; for(i=0;i*max) *max=a[i]; if(a[i]<*min) *min=a[i]; } return(s/100);},main(){ int a[100],i,max,min;float av;for(i=0;i<100;i++) scanf(“%d”,&a[i]);av=aver(a,10

24、0,&max,&min);printf(“ %d,%d,%f”,max,min,av);},例T10-4-1.c :編寫函數(shù),求一元二次方程的兩個(gè)實(shí)根。#include “math.h” ? root(float a,float b,float c, ){ float d; d=b*b-4*a*c; if(d&l

25、t;0||a==0)return(0); ? =(-b+sqrt(d))/2/a; ? =(-b-sqrt(d))/2/a; return(1); },float *x1, float *x2,*x1,*x2,int,main(){ int k; float a,b,c,x1,x2; scanf(“%f,%f,%f”,&a,&b,&c); k=

26、root(a,b,c,&x1,&x2); if(k) printf(“\n %f,%f”,x1,x2); },輸入:1, -10 ,25輸出:5.000000,5.000000,函數(shù)參數(shù):如不需改變(只讀):一般參數(shù)如需改變(讀寫):指數(shù)參數(shù),10.3 數(shù)組的指針和指向數(shù)組的指針變量數(shù)組有一個(gè)首地址: 數(shù)組的指針。每個(gè)數(shù)組元素也都有地址: 數(shù)組元素的指針。,5,3,2,1,6,8,7

27、,4,2000,2002,2004,2006,■指向數(shù)組元素的指針變量 int a[10],*p; p=a; 指向數(shù)組 p=&a[0]; 指向數(shù)組元素,5,1,2,4,7,6,8,0,3,9,2000,2002,2004,2006,p,,■通過指針引用數(shù)組元素 int a[10],*p; p=&a[0]; 或者 p=a; //p指向a[0]

28、 *p=1; 等效于a[0]=1; 即可通過p來訪問a[0]也可以通過p來訪問其它元素: *(p+1)=3; 等效于a[1]=3; 其中p+1指向a[1]注意:p+1不是地址加1,而是加一個(gè)數(shù)據(jù)類型單位。,一般地,當(dāng)p指向a[0]時(shí),即p=&a[0]; 或者 p=a; p+i ∽ a+i ∽ &a[i]*(p+i) ∽ *(a+i) ∽ a[i] ∽

29、 p[i]即以下幾個(gè)語句等效:a[i]=10; *(p+i)=10; *(a+i)=10; p[i]=10;,舉例:用三種方法輸出數(shù)組元素例T10-5-1.c 用“數(shù)組名+下標(biāo)”的方法main(){int i, a[5];for(i=0; i<5; i++) scanf(“%d”,&a[i]);for(i=0; i<5; i++)printf(“&a[%d]=%x, a[%

30、d]=%d\ n”, i,&a[i], i, a[i] );}輸入: 55 66 77 88 99,輸出: &a[0]=ffce, a[0]=55 &a[1]=ffd0, a[1]=66 &a[2]=ffd2, a[2]=77 &a[3]=ffd4, a[3]=88 &a[4]

31、=ffd6, a[4]=99,舉例:用三種方法輸出數(shù)組元素例T10-5-2.c 計(jì)算“數(shù)組名計(jì)算地址”的方法main(){ int i, a[5]; for(i=0;i<5;i++) scanf(“%d”,a+i); for(i=0;i<5;i++)printf(“a+%d)=%x,*(a+%d)=%d\ n”,i,(a+i), i,*(a+i));},輸出: (a+0)=ffcc

32、, *(a+0)=55 (a+1)=ffce, *(a+1)=66 (a+2)=ffd0, *(a+2)=77 (a+3)=ffd2, *(a+3)=88 (a+4)=ffd4, *(a+4)=99,舉例:用三種方法輸出數(shù)組元素例T10-5-3_new.c 用“指針變量+下標(biāo)”的方法(指針法I )main(){int *p, a[5],i; p

33、=a;for(i=0;i<5;i++) scanf(“%d”,p+i);for(i=0;i<5;i++)printf("&p[%d]=%x, p[%d]=%d, *(p+%d)=%d\n",i,&p[i],i,p[i],i,*(p+i));},輸出:&p[0]=12ff6c, p[0]=55, *(p+0)=55&p[1]=12ff70, p[1]=66,

34、 *(p+1)=66&p[2]=12ff74, p[2]=77, *(p+2)=77&p[3]=12ff78, p[3]=88, *(p+3)=88&p[4]=12ff7c, p[4]=99, *(p+4)=99,舉例:用三種方法輸出數(shù)組元素(例T10-5-4_new.c )用“指針變量指向數(shù)組元素”法(指針法II)main(){int *p, a[5]; for(p=a; p< (a+5

35、); p++)scanf(“%d”,p+i); for(p=a; p< (a+5); p++)printf(“p=%x, *p=%d\ n”, p,*p);},輸出:p=12ff6c,*p=55p=12ff70,*p=66p=12ff74,*p=77p=12ff78,*p=88p=12ff7c,*p=99,p++: 合法, 因p是指針變量,而變量可以用 ++運(yùn)算符的a++: 不合法, 因?yàn)閍是數(shù)組名,其值是

36、數(shù)組元素的首地址,分配之后不可變。,舉例:用三種方法輸出數(shù)組元素(例T10-5-4.c )指針變量當(dāng)作數(shù)組名使用(混合指針法)   main() { int a[5],*p=a,i; for(p=a;p<a+5;p++) scanf(“%d”,p);  p=a;//不能漏!! for(i=0;i<5;i++) printf(“&p[%

37、d]=%x,p[%d]=%d,*(p+%d)=%d\n”, i,&p[i], i,p[i],i,*(p+i)); },輸出:&p[0]=12ff6c,p[0]=55,*(p+0)=55&p[1]=12ff70,p[1]=66,*(p+1)=66&p[2]=12ff74,p[2]=77,*(p+2)=77&p[3]=12ff78,p[3]=88,*(p+3)=88&p[4

38、]=12ff7c,p[4]=99,*(p+4)=99,通過指針引用數(shù)組元素的方法小結(jié)例:累加求和的各種用法:int *p,a[10];s=0;p=a;for(i=0;i<10;i++)s+=a[i];for(i=0;i<10;i++)s+=*(a+i);for(i=0;i<10;i++)s+=*(p+i);for(i=0;i<10;i++)s+=p[i];for(i=0;i<10;i++)s+

39、=*p++; for(p=a;p<a+10;p++)s+=*p; 最后一種用法效率高。,,,,數(shù)組元素地址法,指針法I指針變量指向數(shù)組元素,指針法II指針變量當(dāng)作數(shù)組名注意不能使用a++,指針變量使用時(shí)的幾個(gè)問題, 若p當(dāng)前指向a數(shù)組的第i個(gè)元素,則:10-plus.c ① *p:是取出a[i]的值. ② p ++ :指針指向a[i+1]. ③ *p++ :等價(jià)

40、于*(p++)及a[i++] ,優(yōu)先級同為2,從右向左結(jié)合,將 a[i] 的值取出, 后再使 p增1(不是單純的加一,是p指向a[i+1]). ④ * (++p):與a[++i]等價(jià),先將p指向a[i+1],然后將該元素取出. ⑤ (*p)++:將p所指的數(shù)組元素a[i]的值取出,使a[i]的值增1. ⑥ p-- :指針指向a[i-1]. ⑦ *(p--):與a[i--]等價(jià), 將p 所

41、指向的第i個(gè)數(shù)組元素取出,然后使p指向i-1元素. ⑧ *(--p):與a[-- i]等價(jià),先將p減1指向第i-1個(gè)元素,然后將其取出. ⑨ (*p)--:將p所指的數(shù)組元素a[i]的值取出,使a[i]的值減1.,,,■數(shù)組名作為函數(shù)參數(shù) 有了指針概念的基礎(chǔ)上,重新回顧數(shù)組名作為函數(shù)參數(shù)時(shí),數(shù)據(jù)的傳遞情況:void sort(int a[], int n)void sort(int *a, int n

42、),,例:選擇法排序函數(shù),void sort(int *a, int n)例T10-7-1.c { int i,j,t; for(i=0;ia[j]){t=a[i]; a[i]=a[j]; a[j]=t;}} 只將形參改為指針變量,仍按下標(biāo)法使用,void sort(int *a, int n){ int i,j,t; for(i=0;i*(a+j)) {t=*(a+i); *(

43、a+i)= *(a+j); *(a+j)=t;} } 按指針法使用例T10-7-2.c,進(jìn)一步優(yōu)化:都用指針,效率更高! (例T10-7-3.c )void sort(int *a, int n){ int *i, *j,t; for(i=a;i*j) {t=*i; *i=*j; *j=t;} } main(){ int a[10],j; for(j=0;j<10;j++)

44、scanf(“%d”,a+j); sort(a,10); for(j=0;j<10;j++)printf(“%5d”,a[j]);},分段排序?例T10-7-4.c main(){ int a[10],j; for(j=0;j<10;j++)scanf(“%d”,a+j); for(j=0;j<10;j++)printf(“%5d”,a[j]); },sort(a,5)

45、;,sort(a+5,5);,void sort(int *a, int n){ int *i, *j,t; for(i=a;i*j) {t=*i; *i=*j; *j=t;} },■指向多維數(shù)組的指針和指針變量 從本質(zhì)上說,多維數(shù)組的指針與一維數(shù)組的指針相同,但在概念上和使用上,多維數(shù)組的指針要復(fù)雜些。 以二維數(shù)組的指針為例:,●二維數(shù)組的地址 :一維:a,&a[i],a+

46、i 二維:aa+i (行指針:指向第i行)a[i] ∽*(a+i) (特殊的一維數(shù)組,列指針,指向行中的列)a[i]+j ∽ *(a+i)+j ∽ &a[i][j],int a[3][4],a[0],,討論以下用法的效果:T10-8-1.cfor(i=0;i<3;i++) scanf(“%d”,a+i);輸入數(shù)據(jù):1 2 3,討論以下用法的效果:T10-8-2.cfor(i=0;i<

47、;3;i++) scanf(“%d”,a[1]+i);輸入數(shù)據(jù):1 2 3,討論以下用法的效果:T10-8-3.cfor(i=0;i<3;i++) scanf(“%d”,a[1]+i+2);輸入數(shù)據(jù):1 2 3,討論以下用法的效果:T10-8-4.cfor(i=0;i<3;i++) scanf(“%d”,a+i+1);輸入數(shù)據(jù):1 2 3,a[0]+1,,a[0]+2,,a[0]+3,,一維數(shù)組與二

48、維數(shù)組的比較,第i個(gè)一維數(shù)組的第j個(gè)元素的地址,無意義,*(a+i)+j,第i個(gè)一維數(shù)組的第j個(gè)元素的值,無意義,*(*(a+i)+j),第i個(gè)一維數(shù)組的值第i個(gè)一維數(shù)組的首地址,第i個(gè)元素的值,*(a+i),第i個(gè)元素 的地址一維數(shù)組,第i個(gè)元素的地址,a+i,二維數(shù)組的首地址,一維數(shù)組的首地址,a,二維數(shù)組,一維數(shù)組,,,,,,,,,,,,,注意:指針運(yùn)算符*作用在行指針上的結(jié)果仍是指針----列指針; *作用在列指針上的

49、結(jié)果---具體元素。 *(a+0),*(a+1),*(a+2) ——仍是地址。*(a+i) ∽ a[i] *(a[0]),*(a[1]),*(a[1]) ——具體元素值。*(a[i])*(a+i)+j 也是地址,但要區(qū)別: (a+i)+j——行指針 (a+1)+1 ? *(a+i)+j——列指針 *(a+1)+1 ?,如果要通過a+i形式的地址訪問數(shù)組元素的具體內(nèi)容,則:*(

50、*(a+i)) 或 *(*(a+i)+j)如:*(*(a+1)) —— a[1][0] *(*(a+1)+2) —— a[1][2]討論:例T10-8-5.c*(a+2) *(*(a+1)+3) *(a[1]+1) *(*(a+1)+5),例:求數(shù)組a的所有元素之和。 可有多種用法:例T10-9-1.c~T10-9-3.c M行N列for(i

51、=0;i<M;i++) for(i=0;i<M;i++)for(j=0;j<N;j++) for(j=0;j<N;j++)s+=a[i][j]; s+=*(a[i]+j);for(i=0;i<M;i++)for(j=0;j<N;j++) s+=*(*(a+i)+j);,a[i][j]~*(a[i]+j)~*(*(a+i)+j),●指向二

52、維數(shù)組的指針變量 同樣可使一個(gè)指針變量p指向二維數(shù)組a,再通過p訪問數(shù)組元素。例T10-10.cmain(){ int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int i,k,*p; p=a; k=*p;? k=*(p+2);? for(p=a;p<a+2;p++)printf(“%3d,”,*p); ?}N列:a[i][j]~*(p+i*N

53、+j)~p[i*N+j],k=p[1][2]; 不合法k=*(*(p+1)+2);,k=p[1*4+2]; 合法k=*(p+1*4+2);,例:求矩陣的上三角元素之和。例T10-11.cmain(){ int a[3][4],*p,i,j,s=0; 輸入a p=a; for(i=0;i<3;i++) for(j=i;j<4;j++) s+=p

54、[i*4+j]; 或 s+=*(p+4*i+j) printf(“\n %d”,s);} //s=54N列:a[i][j]~*(p+i*N+j)~p[i*N+j],●多維數(shù)組的指針作函數(shù)參數(shù) 用于接受實(shí)參數(shù)組地址的形參可用兩種:行指針和列指針。 以方陣轉(zhuǎn)置為例:例T10-13-1.c void at(int (*p)[3]) 用行指針 { int i,j,t; 缺點(diǎn)

55、:不通用(必須制定列數(shù)) for(i=0;i<3;i++) for(j=i+1;j<3;j++) { t=p[i][j]; p[i][j]=p[j][i]; p[j][i]=t; } }p指向一個(gè)包含3個(gè)整形元素的一維數(shù)組(行指針),p相當(dāng)于一個(gè)二維數(shù)組!,用列指針:例T10-13-2.c void at(int *p,int n) //n為列數(shù) {

56、int i,j,t; for(i=0;i<n;i++) for(j=i+1;j<n;j++) { t=p[i*n+j]; p[i*n+j]=p[j*n+i]; p[j*n+i]=t; } } 優(yōu)點(diǎn):通用 在編通用函數(shù)時(shí),一般使用列指針。,用列指針:例T10-13-3.c int sum(int *p,int m,int n) //m行n列 { i

57、nt i,j,s=0; for(i=0;i<m;i++) for(j=i;j<n;j++) s+=p[i*n+j]; 或 s+=*(p+n*i+j) return(s); } 優(yōu)點(diǎn):通用 在編通用函數(shù)時(shí),一般使用列指針。,10.4 字符串的指針和指向字符串的指針變量 ■字符串的表示形式 可用兩種方法訪問字符串: ①用字符數(shù)組存放字符串 ②用字符

58、指針指向一個(gè)字符串,例T10-14.cmain(){ char str[5]=”abc”; 定義字符數(shù)組,并將字符串存入 char *p=str; 定義指針變量,指向字符串 printf(“%s”,str); 通過數(shù)組名訪問字符串 printf(“%s”,p); 通過指針變量訪問字符串 printf(“%c”,*(p+2)); 通過指針變量訪問字符 },,,,,

59、,,,,str,a,b,c,\0,,,,,,,,a,b,c,\0,1000,1000,p,,,與其它一維數(shù)組的指針相比,字符串的指針有其獨(dú)特之處: ①可以通過指針對字符串進(jìn)行整體訪問。 ②對字符串的操作依賴于結(jié)束符。 ③可以整體賦初值。 ④有各種字符串處理函數(shù)。,本節(jié)重點(diǎn)掌握: ①通過數(shù)組和通過指針操作字符串的基本方法。 ②常用的字符串處理方法。,例:字符串拷貝操作。例T10-15

60、-1.c,例T10-15-2.cmain(){ char a[]=”abcdef”,b[20]; int i; for(i=0; *(a+i)!=’\0’; i++) *(b+i)=*(a+i); *(b+i)=’\0’; printf(“%s”,b);}main(){ char a[]=”abcdef”,b[20],*p1, *p2; p1=a; p2=b; for( ; *

61、p1!=’\0’;p1++,p2++) *p2=*p1; *p2=’\0’; printf(“%s”,b);},用指針變量處理,將拷貝操作編成一函數(shù):例T10-15-3.c,例T10-15-4.cvoid copy_string(char *from,char *to){ for(; *from; from++,to++) *to=*from; *to=‘\0’;}還可以改成:v

62、oid copy_string(char *from,char *to){ for(; *from;) *to++=*from++; *to=‘\0’;},字符串合并函數(shù):例T10-16.c,void append_string(char *from,char *to){ for(;*to; to++); for(; *from;) *to++=*from++; *t

63、o=0; },閱讀程序:例T10-17.cvoid f (char *c) main() { { c+=2; char c[20]=”abcdef”; (*c)++; f(c+1)

64、; c++; *c=0; printf(“%s”,c); } },■內(nèi)存空間的動(dòng)態(tài)分配 在程序設(shè)計(jì)中,對于要處理的批量數(shù)據(jù),我們往往是選用數(shù)組作為存放這些數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),然而,數(shù)組有一個(gè)明顯的缺點(diǎn),就是在定義數(shù)組時(shí),其長度必須是常值,無法根據(jù)需要?jiǎng)討B(tài)地定義。這樣,在很多情況下,不是定義的數(shù)組長

65、度不夠,就是定義太長以至于浪費(fèi)。 采用動(dòng)態(tài)分配可以克服這一缺點(diǎn),并且可以隨時(shí)釋放。,動(dòng)態(tài)分配內(nèi)存空間步驟: ①定義一指針變量。 ②申請一片內(nèi)存空間,并將其首地址賦給指針變量。此時(shí)便可通過指針變量訪問這片內(nèi)存;不成功則返回地址為0 ③用完后釋放這片內(nèi)存空間。  int *p; p=malloc(字節(jié)數(shù)); …… free(p);sizeof(類型):返回該類型數(shù)據(jù)在當(dāng)前編譯系

66、統(tǒng)中所占的字節(jié)數(shù)。以上函數(shù)的原形在stdio.h中。,,,,,p,,,,,,例:對n個(gè)學(xué)生的分?jǐn)?shù)排序后輸出。例T10-18.c #include “stdio.h”void sort(int *a, int n) { ┈ }main(){ int *a,j,n; scanf(“%d”,&n); a=malloc(n*sizeof(int)); if(!a) exit(0); for(

67、j=0;j<n;j++) scanf(“%d”,a+j); sort(a,n); for(j=0;j<n;j++) printf(“%5d”,a[j]); free(a);} //exit(0):正常運(yùn)行程序并退出程序//exit(1):非正常運(yùn)行程序?qū)е峦顺龀绦?10.5 函數(shù)的指針和指向函數(shù)的指針變量■用函數(shù)指針變量調(diào)用函數(shù)可以用指針變量指向一個(gè)函數(shù)。 一個(gè)函數(shù)在編譯時(shí)被分配給一個(gè)

68、入口地址,這個(gè)入口地址就稱為函數(shù)的指針。 可以用指針變量指向函數(shù),然后通過該指針變量調(diào)用此函數(shù)。,int max(int x, int y){ int z; if(x>y) z=x; else z=y; return(z);}main(){ int (*p)(); 定義指向函數(shù)的指針變量p int a,b,c; p=max;

69、 將p指向函數(shù)max scanf(“%d%d”,&a,&b); c=(*p)(a,b); 通過p調(diào)用函數(shù)max 等效于c=max(a,b); printf(“\n %d”,c);}例T10-19.c,■把

70、指向函數(shù)的指針變量作為函數(shù)參數(shù) 指向函數(shù)的指針變量最常見的用途是把它作為函數(shù)的參數(shù),用于接受主調(diào)函數(shù)傳來的某一函數(shù)的入口地址,從而在被調(diào)函數(shù)中可以通過該指針變量調(diào)用它所指向的函數(shù),這樣,被調(diào)函數(shù)中就可實(shí)現(xiàn)非固定函數(shù)的調(diào)用,以達(dá)到編寫通用函數(shù)的目的。 例:用矩形法編寫一個(gè)通用的求定積分的函數(shù)。關(guān)鍵問題:如何處理被積函數(shù)是未知的。,double intgral (double a,double b,int n,

溫馨提示

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

評論

0/150

提交評論