《C語言程序設計基礎》第八章 指針_第1頁
《C語言程序設計基礎》第八章 指針_第2頁
《C語言程序設計基礎》第八章 指針_第3頁
《C語言程序設計基礎》第八章 指針_第4頁
《C語言程序設計基礎》第八章 指針_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第八章 指針1課程名稱:語言程序設計課型與教法:講授,通過程序擴展,進行對比學習學時:2課時授課題目: 第8章 指針基本教材:語言程序設計(高等教育出版社)廖雷主編教學目的與要求:通過本章的學習使學生掌握指針的意義及使用。教學難點:通過指針引用變量的意義教學重點:指針的使用第八章 指針2第八章 指針指針的概念指針變量指針與數(shù)組指向函數(shù)的指針返回指針值的函數(shù)指針數(shù)組和指向指針的指針字符指針第八章 指針3前言C程序設計中使用指針可以:s 使程序簡潔、緊湊、高效s 在函數(shù)調用后改變有關變量的值s 高效地使用數(shù)組和字符串s 動態(tài)分配內存s 直接處理地址s 有效地表示復雜的數(shù)據(jù)結構s 完成有關文件的操作

2、第八章 指針4 變量與地址程序中: int i; float k; 內存中每個字節(jié)有一個編號-地址.2000200120022005內存02003ik 編譯或函數(shù)調用時為其分配內存單元變量是對程序中數(shù)據(jù)存儲空間的抽象指針的概念2004第八章 指針5.2000200420062005整型變量i10變量i_pointer200120022003指針:一個變量的地址指針變量:專門存放變量地址的變量2000指針指針變量 變量的內容 變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量指針與指針變量第八章 指針6 含義 &: 取變量的地址 *: 取指針所指向變量的內容含義: 取變量的地址單目

3、運算符優(yōu)先級: 14結合性:自右向左含義: 取指針所指向變量的內容單目運算符優(yōu)先級: 14結合性:自右向左兩者關系:互為逆運算理解.2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-指針變量,它的內容是地址量*i_pointer-指針的目標變量,它的內容是數(shù)據(jù)&i_pointer-指針變量占用內存的地址&i10i_pointer*i_pointer&i_pointerii_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i

4、 = *i_pointer = *(&i)&與*運算符第八章 指針7指針變量與其所指向的變量之間的關系指針變量說明一般形式: *;3變量i2000i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33變量i2000i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標識符指針的目標變量的數(shù)據(jù)類型表示定義指針變量不是*運算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 與 int *p1, p2;2、指針變量名是p1,p2 ,不是

5、*p1,*p23、指針變量只能指向定義時所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應用前必須先賦值指針變量第八章 指針8一般形式: *=初始地址值;賦給指針變量,不是賦給目標變量例 int i; int *p=&i;變量必須已說明過類型應一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指針變量作初值例 main( ) int i; static int *p=&i; . ()不能用auto變量的地址去初始化static型指針指針變量的初始化第八章 指針9例:int a,*p,*q;printf(“%o”,p);scanf(“

6、%d”,p);printf(“%d”,*p);p=&a;*p=5;q=p;指針變量的引用/以八進制數(shù)形式輸出指針變量p的值(地址值)/將整型變量a的地址賦給指針變量p,此時p指向a/向p所指向的整型變量輸入一個整型值/將指針變量p所指向的變量的值輸出/將5賦給p所指向的變量/將指針變量p的值賦給指針變量q&aap&a5ap&a5ap&aq第八章 指針10零指針:(空指針)定義:指針變量值為零表示: int * p=0; 表示p不指向任何對象,指針變量值沒有意義p=0與未對p賦值不同用途: 在程序中常作為狀態(tài)比較 例 int *p; . while(p!=NULL) . void *類型指針表示

7、:void *p; 使用時要進行強制類型轉換例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量零指針與空類型指針第八章 指針11main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);運行結果:a=1,b=5 max=5,min=1.指針變量p1 指針變量p2000200820

8、0220042006 指針變量p2 整型變量b 整型變量a1200652008200620082006例 輸入兩個數(shù),并使其從大到小輸出第八章 指針12特點:共享內存,“雙向”傳遞/*ch8_1.c*/swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 將數(shù)從大到小輸出.20002008200A2002200420065變量a 變量b(main)9 變量temp 變量y 變量x(swap)559 59

9、COPY指針變量作為函數(shù)參數(shù)第八章 指針13/*ch8_1.c*/swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);.20002008200A2002200420065變量a 變量b(main)9運行結果:5, 9特點:共享內存,“雙向”傳遞例 將數(shù)從大到小輸出指針變量作為函數(shù)參數(shù)第八章 指針14/*ch8_2.c*/swap(int *p1, int *p2) int p; p=*p1; *p1=*p

10、2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例 將數(shù)從大到小輸出特點:共享內存,“雙向”傳遞指針變量

11、作為函數(shù)參數(shù)第八章 指針15/*ch8_2.c*/swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_2

12、2000200259運行結果:9,5例 將數(shù)從大到小輸出特點:共享內存,“雙向”傳遞指針變量作為函數(shù)參數(shù)第八章 指針16/*ch8_3.c*/swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(a0) printf(b); count-; break; default: if(0=ch & ch=9) printf(%c,ch); bufcount=c

13、h; count+; for(i=0;icount;i+) *pintnum=10*(*pintnum)+bufi-0;/*ch8_6.c*/#include #include main() void getint(int *pintnum); int data; getint(&data); printf(n%d,data); 第八章 指針18課程名稱:語言程序設計課型與教法:講授,通過程序擴展,進行對比學習學時:2課時授課題目: 第8章 指針基本教材:語言程序設計(高等教育出版社)廖雷主編教學目的與要求:通過本章的學習學生應知數(shù)組的指針的意義,數(shù)組元素的指針的意義,及使用數(shù)組名作函數(shù)參數(shù),

14、字符串可以用字符數(shù)組和字符指針表示,應會通過指針引用數(shù)組元素,數(shù)組名與數(shù)組的指針作函數(shù)參數(shù),用字符指針表示字符串,用字符串指針作函數(shù)參數(shù)實現(xiàn)關于字符串的常用操作。教學難點:指針和數(shù)組的關系教學重點:指針和數(shù)組的關系、指針的運算、用字符指針處理字符串、字符串處理函數(shù)第八章 指針19200202204200+i*2218 一維數(shù)組的指針表示方法例 int data10; 數(shù)組名是地址常量,表示數(shù)組首地址,也就是數(shù)組第一個的元素(下標為0) 的地址 data=&data0 data+i與&datai等價,即 data+i=&datai *(data+i) = datai 兩種引用數(shù)組元素方法: 下標

15、法 指針法 指針與數(shù)組data+9data+idata+2data+1data編譯系統(tǒng)計算實際地址時,data i dataid (i為整型數(shù),d為一個元素所占字節(jié)數(shù))data0data1data2dataidata9.例: datai=5; t=data5; data0=k;例: t=*(data+5); *data=k; *(data+i)=5;推導: data+i=&datai即:*(data+i)=*(&datai) *(data+i)=datai第八章 指針20 指向數(shù)組元素的指針變量例 int array10; int *p; p=&array0; /* p=array;*/或 i

16、nt *p=&array0;或 int *p=array;array0array1array2array3array9.指針變量p&array0p指針與數(shù)組第八章 指針21 指針變量的賦值運算int a,array10,*p,*p1,*p2;p=&a; (將變量a地址p)p=array; (將數(shù)組array首地址p)p=&arrayi; (將數(shù)組元素arrayi的地址p)p1=p2; (指針變量p2值p1)p=NULL; (將指針p賦空值,p不指向任何對象) 指針變量的關系運算 若p1和p2指向同一數(shù)組,則 p1p2 表示p1指的元素在后 p1=p2 表示p1與p2指向同一元素 若p1與p2不

17、指向同一數(shù)組,比較無意義 p=NULL或p!=NULL 指針的運算第八章 指針22p+=i (p指向當前對象后第i個對象)p=i (p指向當前對象前第i個對象)p+ (p指向下一個對象)p (p指向前一個對象)p+i (當前對象后第i個對象)pi (當前對象前第i個對象)若p1與p2指向同一數(shù)組(p1p2), p1-p2=兩指針間元素個數(shù) p1+p2 無意義例 p指向int型數(shù)組,且p=&a0;則p+1 指向a1 p+i 指向ai例 int a10; int *p=&a2; p+; *p=1;例 int a10; int *p1=&a2; int *p2=&a5;則:p2-p1=3;a0a1a

18、2a3a4a5a6a7a8a9a數(shù)組 a a+1 a+i a+91 指針的算術運算:pp+1pp+ p1 p2 p+i第八章 指針23a0a1a2a3a9.a a+9 a+1 a+2 地址元素下標法a0a1a2a9a0a1a2a3a9.p p+9 p+1 p+2 地址元素指針變量法*p*(p+1)*(p+2)*(p+9) 下標運算符ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9引用數(shù)組元素的方法指針法p=a;第八章 指針24a0a1a2a3a4a5/*ch8_7.c*/#include main() int a6=0,3,6,9

19、,12,15,*p,i; for(i=0;i6;i+) printf(a%d:%d n,i,ai); for(i=0;i6;i+) printf(*(a+%d):%d n,i,*(a+i); p=a; for(i=0;i6;i+) printf(p%d:%d n,i,pi); for(;pa+6;p+) printf(*(pa+%d):%d n,i,*p);p 例 數(shù)組元素的引用方法03691215第八章 指針25例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 數(shù)組元素地址的正確表示:(A)&(a+1) (B)a+ (C)&p (D)&pi數(shù)組名是地址常量p+,p-

20、()a+,a- ()a+1, *(a+2) ()第八章 指針26/*ch8_8.c*/main() int a =5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(“%d ”,y); printf(“%d”,a0); 輸出:5 6pp58762730123456a6例 注意指針變量的運算第八章 指針27數(shù)組作函數(shù)參數(shù),實參與形參的對應關系實參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量數(shù)組作函數(shù)參數(shù)第八章 指針28-1 9 7 3 -100 0 8 0 1 2 3 4 5 6 7/*ch8_10.c*/int min(int p, in

21、t n) int i,minvalue; minvalue=p0; for(i=1;ipi) minvalue=pi; return minvalue;main() int a=-1,9,7,3,-100,0,8; int minvalue; minvalue=min(a,7); printf(“minvalue=%dn“,minvalue);minvalue= -1例 求一數(shù)組中最小的元素值(1)實參與形參均用數(shù)組iiiiminvalue= -100iii第八章 指針29/*ch8_11.c*/int min(int *p, int n) int i,minvalue; minvalue=*

22、p; p+; for(i=1;i*p) minvalue=*p; return minvalue;main() int a=-1,9,7,3,-100,0,8; int minvalue; minvalue=min(a,7); printf(“minvalue=%dn”,minvalue);實參用數(shù)組,形參用指針變量p-1973-10008a0a1a2a3a4a5a6a數(shù)組例 求一數(shù)組中最小的元素值(2)minvalue= -1ppppminvalue= -100ppp第八章 指針30/*ch8_12.c*/int min(int *p, int n) int i,minvalue; minv

23、alue=*p; for(i=1;i*(p+i) minvalue=*(p+i); return(minvalue);main() int a=-1,9,7,3,-100,0,8; int minvalue,*p=a; minvalue=min(p,7); printf(“minvalue=%dn”,minvalue);實參與形參均用指針變量例 求一數(shù)組中最小的元素值(3)第八章 指針31/*ch8_13.c*/int min(int p, int n) int i,minvalue; minvalue=p0; for(i=1;ipi) minvalue=pi; return minvalue

24、;main() int a=-1,9,7,3,-100,0,8; int minvalue,*p=a; minvalue=min(p,7); printf(“minvalue=%dn”,minvalue);實參用指針變量,形參用數(shù)組例 求一數(shù)組中最小的元素值(4)第八章 指針32 int *p 與 int q10 數(shù)組名是指針(地址)常量 p=q; p+i 是qi的地址 數(shù)組元素的表示方法:下標法、指針法和指針變量法,即若p=q,則 pi qi *(p+i) *(q+i) 形參數(shù)組實質上是指針變量,即int q int *q 在定義指針變量(不是形參)時, 不能把int *p 寫成int p;

25、 系統(tǒng)只給p分配能保存一個指針值的內存區(qū)(一般2字節(jié));而給q分配2*10字節(jié)的內存區(qū)一級指針變量與一維數(shù)組的關系第八章 指針33對于二維數(shù)組:(1)a是數(shù)組名, 包含三個元素 a0,a1,a2(2)每個元素ai 又是一個一維 數(shù)組,包含4個 元素aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23*a *(a+1)*(a+2)*(a+0)行指針與列指針a0+1*a+1*(a+0)+1行指針列指針指針與二維數(shù)組第八章 指針34

26、s 說明形式: (*指針名); 例 int (*p)4;( )不能少int (*p)4與int *p4不同p的值是一維數(shù)組的首地址,p是行指針可讓p指向二維數(shù)組某一行 如 int a34, (*p)4=a;int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或 *p+1p1+2或 *(p+1)+2*(*p+1)或 (*p)1 *(*(p+1)+2)一維數(shù)組指針變量元素個數(shù)和二維數(shù)組列數(shù)必須相同指向一維數(shù)組的指針變量第八章 指針35s 用指向變量的指針變量s 用指向一維數(shù)組的指針變量s 用二維數(shù)組名實參形參數(shù)組名int x4

27、指針變量int (*q)4數(shù)組名int x4指針變量int (*q)4數(shù)組名a數(shù)組名a指針變量p1指針變量p1若int a34; int (*p1)4=a; int *p2=a0;指針變量p2指針變量int *q二維數(shù)組作函數(shù)參數(shù)第八章 指針36例 求一個3*4矩陣的所有元素值之和。設矩陣為:arr11arr10arr9arr8arr7arr6arr5arr4arr3arr2arr1arr04a23-1a220a217a205a13-3a125a112a1010a039a028a013a00a =3 8 9 102 5 -3 57 0 -1 4aijarri*n+j /*ch8_24.c*/#

28、include main() int add(int m,int n,int arr); int total,a34=3,8,9,10,2, 5,-3,5,7,0,-1,4; total=add(3,4,a0); printf(“total=%d”,total);int add(int m,int n,int arr) int i,j,sum=0; for(i=0;im;i+) for(j=0;jn;j+) sum=sum+arri*n+j;return sum;第八章 指針37例 求一個4*4階矩陣中元素的最小值#include int min(int a4) int i,j,minvalu

29、e; minvalue=a00; for(i=0;i4;i+) for(j=0;j4;j+) if(aijminvalue) minvalue=aij; return minvalue;main() static int a44=1,2,3,4,9,8,7,6,-10,10,-5,2,3,5,2,8; printf(“min=%d”,min(a); /*ch7_15.c*/ int min( int (*a)4 )第八章 指針38u 函數(shù)定義形式: *() 例 int *f(int x, int y)返回指針值的函數(shù)第八章 指針39 字符指針 字符串表示形式 用字符數(shù)組實現(xiàn)例 main( )

30、char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); IloveChistring0string1string2string3string4string5string6string7string8string9stringstring10string11string12string13n!a0結果: I love China! China!string+7第八章 指針40例 main( ) char *string=“I love China!”; printf(“%sn”,string); str

31、ing+=7; while(*string) putchar(*string); string+; /*ch8_14.c*/IloveChistringn!a0字符指針初始化:把字符串首地址賦給string char *string; string=“I love China!”;string*string!=0 用字符指針實現(xiàn)結果: I love China! China!第八章 指針41例 用函數(shù)調用實現(xiàn)字符串復制(1)用字符數(shù)組作參數(shù)(2)用字符指針變量作參數(shù)aIamateaceh0r.sourceabyuarasutndedestboet.0Iaaeceh0r.t.0mtavoid s

32、trcopy(char dest,char source) int i=0; while(sourcei!=0) desti=sourcei;i+; desti=0; /*ch8_15.c*/ main() char a=I am a teacher.; char b=You are a student.; printf(string_a=%sn string_b=%sn,a,b); strcopy(b,a); printf(nstring_a=%snstring_b=%sn,a,b);void strcopy(char *dest,char *source) for(;*source!=0;

33、dest+,source+) *dest=*source; *dest=0; /*ch8_16.c*/main() char *a=I am a teacher.; char *b=You are a student.; printf(string_a=%snstring_b=%sn,a,b); strcopy(b,a); printf(nstring_a=%snstring_b=%sn,a,b);字符串指針作函數(shù)參數(shù)第八章 指針42u字符串輸出函數(shù)puts 原型:int puts(char *str)功能:把str指向的字符串輸出到標準輸出設備,將0轉 換為回車換行返回值:成功,返回換行符,

34、若失敗,返回 -1u字符串輸入函數(shù)gets 原型:char *gets(char *str)功能:從鍵盤輸入一以回車結束的字符串放入str所指向的字 符數(shù)組中,并用串結束符0代替輸入中的換行符返回值:成功,返回str的值;否則,返回NULL說明:輸入串長度應小于字符數(shù)組長度常用的字符串處理函數(shù)例 /*ch8_17.c*/ #include main( ) char string80,*str; printf(“Input a string:”); gets(string); gets(str); puts(string); puts(str); 輸入: How are you? I am a

35、student.輸出: How are you ? I am a student.第八章 指針43u字符串連接函數(shù)strcat 原型:char *strcat(char *s1,char *s2)功能:把字符串s2(包括結束符0)連到字符串s1后面返值:返回s1說明: 字符數(shù)組1必須足夠大 連接前,兩串均以0結束;連接后,串1的0 取消,新串以串2的0標志結束例 #include #include main() static char str120=“This ”; char *str2=“is a string”; printf(“%sn”,strcat(str1,str2); printf

36、(“%sn”,strcat(str1,”!”); /*ch8_18.c*/常用的字符串處理函數(shù)結果: This is a string This is a string!第八章 指針44u字符串拷貝函數(shù)strcpy 原型:char *strcpy(char *s1,char *s2)功能:將s2指向的字符串拷貝到s1中去包括結束符0返值:返回s1說明:字符數(shù)組1必須足夠大 拷貝時0一同拷貝 不能使用賦值語句為一個字符數(shù)組賦值例 #include #include main() char str130,str330; char *str2=“This is a string”; strcpy(s

37、tr1,str2); strcpy(str3,”That is another string”); printf(“str1=%sn”,str1); printf(“str3=%sn”,str3); /*ch8_19.c*/常用的字符串處理函數(shù)結果:str1=This is a stringstr3=Thst is another string不能寫成:str1=str2;str3=“This is another string”第八章 指針45u字符串比較函數(shù)strcmp 原型:int strcmp(char *s1,char *s2)功能:比較字符串s1,s2的大小比較規(guī)則:對兩串從左向右

38、逐個字符比較(ASCII碼), 直到遇到不同字符或0為止返值:返回int型整數(shù),a. 若字符串1 字符串2, 返回正整數(shù) c. 若字符串1=字符串2, 返回零說明:字符串比較不能用“=”,必須用strcmp常用的字符串處理函數(shù)例 char str130 =“This is a string”; char *str3=”That is another string”; if(!strcmp(str1,str3) printf(“str1=str3n”); else printf(“str1str3n”);結果: str1str3第八章 指針46u字符串長度函數(shù)strlen 原型:int strl

39、en(char *s)功能:計算字符串s的長度返回值:返回字符串實際長度,不包括0在內例 對于以下字符串,strlen(s)的值為:(1)char s10=A,0,B,C,0,D;(2)char s =“tv0willn”;(3)char s =“x69082n”; 答案:1 3 1常用的字符串處理函數(shù)第八章 指針47u定位字符在字符串中位置的函數(shù)strchr 原型:char *strchr(char *s1,int c)功能:找出字符串s1中第一次出現(xiàn)字符c的位置返回值:返回指向該位置的指針,不存在,則返回NULL常用的字符串處理函數(shù)例 #include #include main() ch

40、ar str130=“I love china!”; char *str2=“This is a string”; int ch=o; printf(“%sn”,strchr(str1,ch); if(!strchr(str2,ch) printf(“%c isnt in ”%s”n”,ch,str2); /*ch8_20.c*/結果:ove china!o isnt in “This is a string”第八章 指針48u定位子串在字符串中位置的函數(shù)strstr 原型:char *strstr(char *s1,char *s2)功能:找出字符串s1中第一次出現(xiàn)字符串s2的位置返回值:返

41、回指向該位置的指針,不存在,則返回NULL常用的字符串處理函數(shù)例 #include #include main() char str130=“I love china!”; char *str2=“china”,*str3; str3=strstr(str1,str2); if(str3) printf(“%sn”,str3); /*ch8_21.c*/結果: china!第八章 指針49 char *cp; 與 char str20; str由若干元素組成,每個元素放一個字符;而cp中存放字符串首地址 系統(tǒng)只給cp分配能保存一個指針值的內存區(qū);而給str分配1*20字節(jié)的內存區(qū) str是地址

42、常量;cp是地址變量 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () cp未賦值,則指向對象不定,接受鍵入字符串時,必須先開辟存儲空間例 char str10; scanf(“%s”,str); ()而 char *cp; scanf(“%s”, cp); ()改為: char *cp,str10; cp=str; scanf(“%s”,cp); ()字符指針變量與字符數(shù)組例 #include main() char *s=“C language”; s+=2; printf(“%sn”,s); 結果:l

43、anguage例 #include main() char s=“C language”; s+=2; printf(“%sn”,s); ()第八章 指針50動態(tài)存儲分配的函數(shù)u 內存申請函數(shù) malloc 原型:void *malloc(unsigned size)功能:在內存的動態(tài)存儲區(qū)分配長度為size的連續(xù)空間返回值:成功,返回新分配內存塊起始地址;否則,返回NULL說明:函數(shù)的返回值是一個無類型指針,其特點是可以指向任何類型的數(shù)據(jù)。但在實際使用malloc()函數(shù)時,必須將其返回值強制轉換成被賦值指針變量的數(shù)據(jù)類型,以免出錯。例 char *s; s=(char *)malloc(1

44、0*sizeof(char); scanf(“%s”,s);第八章 指針51動態(tài)存儲分配的函數(shù)例 char *s; s=(char *)malloc(10*sizeof(char); scanf(“%s”,s); free(s);u 釋放內存空間函數(shù)free 原型:void free(void *p)功能:釋放由p指向的內存塊(p是調用malloc()函數(shù)的返回值)返回值:無說明:原則上,使用malloc()函數(shù)申請的內存塊,操作結束后,應及時使用free()函數(shù)予以釋放。尤其是循環(huán)使用malloc()函數(shù)時,如果不及時釋放不再使用的內存塊,很可能很快就耗盡系統(tǒng)的內存資源,從而導致程序無法繼續(xù)

45、運行 第八章 指針52課程名稱:語言程序設計課型與教法:講授,通過程序擴展,進行對比學習學時:2課時授課題目: 第8章 指針基本教材:語言程序設計(高等教育出版社)廖雷主編教學目的與要求:通過本章的學習學生應知指針數(shù)組、指向指針的指針和指向函數(shù)的指針的定義、引用、main函數(shù)形參的意義,應會使用指針數(shù)組處理多個字符串,編寫帶有形參的主函數(shù),使用指向指針的指針和指向函數(shù)的指針和返回指針的函數(shù)解決實際的問題。教學難點:指向指針的指針教學重點:指針數(shù)組、帶形參的main函數(shù)、指向函數(shù)的指針第八章 指針53 用于處理二維數(shù)組或多個字符串 指針數(shù)組 定義:其元素為指針的數(shù)組 說明的一般形式: *;例 i

46、nt *p4;指針所指向變量的數(shù)據(jù)類型區(qū)分int *p4與int (*p)4 指針數(shù)組賦值與初始化 指針數(shù)組和指向指針的指針賦值: int i,j,k; int *p3;p0=&i;p1=&j;p2=&k;P2P1P0 j i kp初始化: static int i,j,k; int *p3=&i,&j,&k;第八章 指針54L 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; .或

47、:main() char *p4; p0= Fortran; p1= Lisp; p2= Basic; p3=NULL; .初始化:main() char *p=Fortran, Lisp, Basic,NULL; .L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30指針數(shù)組賦值與初始化第八章 指針55 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

48、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 h 0b y e 0二維數(shù)組存儲空間固定字符指針數(shù)組相當于可變列長的二維數(shù)組分配內存單元=數(shù)組長度*2+各字符串長度(包括0)指針數(shù)組元素的作用相當于二維數(shù)組的行名但指針數(shù)組中元素是指針變量二維數(shù)組的行名是地址常量二維數(shù)組與指針數(shù)組區(qū)別:第八章 指針56 一級指針:指針變量中存放目標變量的地址p1&p2&i3P2(指針變量)i(整型變量)例 int *p1; int *p2; int i=3; p2=

49、&i; p1=&p2; *p1=5; 二級指針:指針變量中存放一級指針變量的地址例 int *p; int i=3; p=&i; *p=5;&i3P(指針變量)i(整型變量)一級指針二級指針一級指針目標變量指向指針的指針第八章 指針57 說明形式: *;如 char *p;例 int i, *p; p=&i; () /p是二級指針,不能用變量地址為其賦值最終目標變量的數(shù)據(jù)類型*p2是p2間接指向對象的地址*p2是p2間接指向對象的值例 int i=3; int *p1; int *p2; p1=&i; p2=&p1; *p2=5;ip1p23&i&p1*p2, *p1*p2指向指針的指針第八章

50、 指針58/*ch8_27.c*/#include void swap(int *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);abpqabpqrsabpqsrabpq輸出: 1,2例 一級指針與二級指針圖解1第八章 指針59/*ch8_28.c*/#include void swap(int *r,int *s) int *t; t=*r; *r=*s; *s=t;main() int a=1,b=2,*p,*q; p=&a; q=&b

51、; swap(&p,&q); printf(%d,%dn,*p,*q);abpqbapqabrspqabrspq輸出: 2,1例 一級指針與二級指針圖解2第八章 指針60例 對字符串排序 用二維字符數(shù)組/*ch8_25.c*/#include #include void sort(char name12,int n) char temp12; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) strcpy(temp,namej-1); strcpy(namej-1,namej); strcpy(namej,temp); void print(

52、char name12,int n) int i; for(i=0;in;i+) printf(“%sn”,namei);main() char name12=Follow me,BASIC, Great Wall,FORTRAN,Computer ; sort(name,5); print(name,5); C o m p u t e r 0 F O R T R A N 0 G r e a t W a l l 0 B A S I C 0 F o l l o w m e 0name0name1name2name3name4第八章 指針61main() void sort(char *name,

53、int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=namej; namej=temp; /*ch8_26.c print函數(shù)略*/name0name1name2

54、name3name4nameGreat WallFortran ab ComputerFollow meBASICjjjji=0例 用指針數(shù)組對字符串排序 圖解1第八章 指針62main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j; fo

55、r(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=namej; namej=temp; /*ch8_26.c print函數(shù)略*/jjji=1例 用指針數(shù)組對字符串排序 圖解2name0name1name2name3name4nameGreat WallFortran ab ComputerFollow meBASICi=0第八章 指針63main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Gre

56、at Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=namej; namej=temp; /*ch8_26.c print函數(shù)略*/jji=2例 用指針數(shù)組對字符串排序 圖解3i=1name0name1name2name3name4nameGreat WallFortran ab Comp

57、uterFollow meBASIC第八章 指針64main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=n

58、amej; namej=temp; /*ch8_26.c print函數(shù)略*/ji=3例 用指針數(shù)組對字符串排序 圖解4i=2name0name1name2name3name4nameGreat WallFortran ab ComputerFollow meBASIC第八章 指針65main() void sort(char *name,int n), print(char *name,int n); char *name=Follow me,BASIC, Great Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,

59、n);void sort(char *name,int n) char *temp; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=namej; namej=temp; /*ch8_26.c print函數(shù)略*/例 用指針數(shù)組對字符串排序 圖解5name0name1name2name3name4nameGreat WallFortran ab ComputerFollow meBASIC第八章 指針66main() void sort(char *name,int n), print(char

60、*name,int n); char *name=Follow me,BASIC, Great Wall,Fortran ab ,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j; for(i=0;ii;j-) if(strcmp(namej-1,namej)0) temp=namej-1; namej-1=namej; namej=temp; /*ch8_26.c print函數(shù)略*/例 對字符串排序 void sort( char *name,int

溫馨提示

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

評論

0/150

提交評論