版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)創(chuàng)建第一個(gè)C語言程序項(xiàng)目1“學(xué)生成績管理系統(tǒng)”中相關(guān)數(shù)據(jù)設(shè)計(jì)及簡單處理項(xiàng)目2項(xiàng)目中的數(shù)據(jù)處理及封面與菜單的初步設(shè)計(jì)項(xiàng)目3項(xiàng)目中學(xué)生成績的等級判定項(xiàng)目4學(xué)生成績的分組匯總程序項(xiàng)目5利用數(shù)組完善項(xiàng)目中數(shù)據(jù)的處理項(xiàng)目6利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)項(xiàng)目7利用結(jié)構(gòu)體實(shí)現(xiàn)項(xiàng)目項(xiàng)目8利用指針優(yōu)化項(xiàng)目項(xiàng)目9利用文件完善項(xiàng)目項(xiàng)目10項(xiàng)目9利用指針優(yōu)化項(xiàng)目目標(biāo)TARGET知識(shí)目標(biāo)掌握指針的定義與使用。掌握指針的運(yùn)算。掌握指向數(shù)組的指針。掌握指向結(jié)構(gòu)體的指針。掌握指向函數(shù)的指針。目標(biāo)TARGET技能目標(biāo)能夠熟練使用數(shù)組指針解決多個(gè)數(shù)據(jù)處理問題。能夠利用指針操作結(jié)構(gòu)體,對結(jié)構(gòu)體成員進(jìn)行訪問。能夠使用指針解決函數(shù)相關(guān)問題,提高執(zhí)行效率。用指針實(shí)現(xiàn)學(xué)生最高、最低成績查找任務(wù)9.1用指針實(shí)現(xiàn)學(xué)生成績排序任務(wù)9.2任務(wù)9.1用指針實(shí)現(xiàn)學(xué)生最高、最低成績查找
任務(wù)描述
改進(jìn)學(xué)生成績管理系統(tǒng),用指針來實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)中的最值的查找,提高程序執(zhí)行效率。任務(wù)分析
項(xiàng)目8中開發(fā)的學(xué)生成績管理系統(tǒng),對數(shù)據(jù)的操作是通過結(jié)構(gòu)成員訪問實(shí)現(xiàn)的,顯然執(zhí)行效率低,處理批量數(shù)據(jù)速度太慢。本任務(wù)將利用指針知識(shí)優(yōu)化程序主要功能模塊—最值查找,用指針來訪問結(jié)構(gòu)成員,處理批量數(shù)據(jù),以提高系統(tǒng)的訪問效率。
本任務(wù)的要點(diǎn)是:用指向結(jié)構(gòu)的指針作為函數(shù)的參數(shù)。1認(rèn)識(shí)指針Part◎指針與數(shù)組◎指針的概念指針的概念
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。如一個(gè)整型變量inta=247,在內(nèi)存中占據(jù)4個(gè)字節(jié),存儲(chǔ)的內(nèi)容是247,假如所占據(jù)的4個(gè)字節(jié)從地址為0012FF7C開始,則變量a的地址就是0012FF7C,該地址也叫整型變量所占存儲(chǔ)單元的首地址,也是變量a的指針,記作&a。一個(gè)變量的地址稱為該變量的“指針”。如果有一個(gè)變量專門用來存放其他變量的地址(指針),這個(gè)變量被稱為“指針變量”。指針的概念
(1)指針變量的定義、初始化和使用指針變量在使用前首先需要定義,定義指針變量的語法格式如下所示:
類型標(biāo)識(shí)符*指針變量名;一般指針變量初始化格式如下所示:類型標(biāo)識(shí)符*指針變量名=&變量名;指針的概念
指針變量的初始化方式:1)定義指針變量,由系統(tǒng)進(jìn)行初始化操作,或者不進(jìn)行初始化。如:inta,*p;2)定義指針變量的同時(shí)進(jìn)行初始化。如:inta,*p=&a;或者inta;int*p=&a;3)指針變量初始化為空值。如:inta,*p=NULL;指針的概念
指針變量的引用:指引用指針變量指向的變量,就是根據(jù)指針變量中存放的地址,訪問該地址對應(yīng)的變量。訪問指針變量指向變量的方式非常簡單,只需在指針變量前加一個(gè)“*”(取值運(yùn)算符)即可,訪問指針變量的語法格式如下所示:*指針表達(dá)式;指針的概念
(2)指針變量作為函數(shù)參數(shù)指針變量作為變量,它具有變量的一切特征,它也可以作為函數(shù)的形參,接受在函數(shù)調(diào)用時(shí)實(shí)參傳過來的值,那么指針變量作為函數(shù)的參數(shù)時(shí),實(shí)參必須是指針變量、變量的地址、地址常量等。指針的概念
#include<stdio.h>voidmain(){intnum=1;int*ptr=#//定義一個(gè)指針變量,指針printf("\nnum的值=%dnum地址=%p",num,&num);//顯示num的地址printf("\nptr的地址是%pptr存放的值是地址為%pptr指向的值=%d",&ptr,ptr,*ptr);getchar();}例9-1寫一個(gè)程序,獲取一個(gè)int變量num的地址,并顯示到終端,將num的地址賦給指針ptr,并通過ptr去修改num的值。指針的概念
執(zhí)行結(jié)果說明:(1)int*表示類型為指針類型,變量名稱為ptr,ptr就是一個(gè)int*類型,ptr指向了一個(gè)int類型的變量的地址。(2)如果要輸出一個(gè)變量的地址,使用格式是%p,&num表示取出num這個(gè)變量的對應(yīng)地址。(3)指針變量,本身也有地址,ptr的地址為&ptr;ptr表示指針變量存放的地址,通過*ptr獲取指針指向的值。注意:(1)指針和指針變量是兩個(gè)完全不同的概念,指針是一個(gè)地址,而指針變量是存放地址(指針)的變量。(2)基本數(shù)據(jù)類型都有對應(yīng)的指針類型,形式為數(shù)據(jù)類型*,比如int的對應(yīng)的指針就是int*,float對應(yīng)的指針類型就是float*,依次類推。指針與數(shù)組
(1)數(shù)組的指針和指向數(shù)組的指針變量
數(shù)組的指針是指數(shù)組在內(nèi)存中的起始地址,數(shù)組元素的指針是數(shù)組元素在內(nèi)存中的起始地址。
類似于指向簡單變量的指針,指向數(shù)組的指針變量只要將數(shù)組的首地址(或數(shù)組名)賦給指針變量即可。例如:intiData[5];/*定義iData為整型數(shù)據(jù)的數(shù)組*/int*p;/*定義p為指向整型變量的指針*/則語句:p=&iData[0];(或p=iData;)/*p指向iData數(shù)組的第0號元素*/稱為p指針為指向數(shù)組iData的指針變量。指針與數(shù)組
(2)數(shù)組元素的引用假設(shè)指針變量p指向了數(shù)組iData,若想引用數(shù)組中的元素,可以通過下列兩種方式。1)下標(biāo)法iData[i] //①數(shù)組名下標(biāo)法p[i] //②指針變量下標(biāo)法2)指針法*(iData+i) //①數(shù)組名指針法*(p+i) //②指針變量指針法指針與數(shù)組
(3)數(shù)組名作為函數(shù)參數(shù)當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí),在函數(shù)調(diào)用時(shí),實(shí)際傳遞給函數(shù)的是該數(shù)組的起始地址,即指針值。所以,實(shí)參可以是數(shù)組名或指向數(shù)組的指針變量。而被調(diào)函數(shù)的形參,既可以說明為數(shù)組,也可以說明為指針。指針與數(shù)組
(4)字符串與指針訪問一個(gè)字符串可以通過兩種方式,第一種就是前面學(xué)習(xí)過的使用字符數(shù)組來存放一個(gè)字符串,從而實(shí)現(xiàn)對字符串的操作;另一種方法就是下面要介紹的使用字符指針指向一個(gè)字符串,此時(shí)可以不定義數(shù)組。例如:char*p="IloveC";指針與數(shù)組
(5)指針數(shù)組如果一個(gè)數(shù)組的每個(gè)元素都是指針類型的數(shù)據(jù),則這種數(shù)組稱指針數(shù)組。指針數(shù)組定義的一般形式為:類型標(biāo)識(shí)符*數(shù)組名[常量表達(dá)式];比如:int*ptr[3];ptr聲明為一個(gè)指針數(shù)組,由3個(gè)整數(shù)指針組成。因此,ptr中的每個(gè)元素,都是一個(gè)指向int值的指針。指針與數(shù)組
#include<stdio.h>voidmain(){intarray[10]={1,2,3,4,5,6,7,8,9,10};inti,*p;p=array;for(i=0;i<10;p++,i++){printf("%d",*p);}printf("\n");}例9-2定義一個(gè)一維數(shù)組,并用指針依次訪問數(shù)組元素。指針與數(shù)組
執(zhí)行結(jié)果說明:(1)在第7行for語句中,int類型的指針變量p指向數(shù)組array,第7~10行,通過for循環(huán)移動(dòng)指針p,依次指向數(shù)組中的每個(gè)元素,并輸出。(2)指針是一個(gè)用數(shù)值表示的地址,可以對指針執(zhí)行四種算術(shù)運(yùn)算:++、--、+、-。當(dāng)對指針進(jìn)行++時(shí),指針會(huì)按照它指向的數(shù)據(jù)類型字節(jié)數(shù)大小增加,例如int*指針,每++,就增加4個(gè)字節(jié),指向了下一個(gè)數(shù)組元素。注意:(1)數(shù)組名并不代表整個(gè)數(shù)組,只代表數(shù)組首元素的地址。(2)和指針變量不同的是,數(shù)組名array中的地址是不可變的,而指針p中的地址是可變的。指針與數(shù)組
#include<stdio.h>voidfunc(int*p){*p=20;}voidmain(){intnum=10;printf("num=%d\n",num);func(&num);printf("num=%d\n",num);getchar();}例9-3指針作為函數(shù)參數(shù)應(yīng)用。指針與數(shù)組
執(zhí)行結(jié)果說明:在程序中第2行代碼定義一個(gè)func()函數(shù),該函數(shù)的參數(shù)類型為指針類型。在main()函數(shù)中調(diào)用該函數(shù)時(shí)傳入變量num的地址,對其取值運(yùn)算后賦新的值。注意:func()函數(shù)必須寫在main()函數(shù)的前面,否則需要在main()函數(shù)前聲明func()函數(shù)。指針與數(shù)組
#include<stdio.h>voidmain(){//定義一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素,指向的是一個(gè)字符串char*books[]={"三國演義","西游記","紅樓夢","水滸傳"};inti,len=4;//遍歷for(i=0;i<len;i++){printf("\nbooks[%d]指向字符串是=%s",i,books[i]);}getchar();}例9-4請編寫程序,定義一個(gè)指向字符的指針數(shù)組來存儲(chǔ)字符串列表(四大名著書名),并通過遍歷該指針數(shù)組,顯示字符串信息。指針與數(shù)組
執(zhí)行結(jié)果說明:1)本例中定義了一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素,指向的是一個(gè)字符串。2)使用循環(huán)依次輸出指針數(shù)組指向字符串的值,格式控制為%s。注意:數(shù)組指針和指針數(shù)組不是同一個(gè)概念,數(shù)組指針是指一個(gè)指向數(shù)組的指針,指針數(shù)組是指數(shù)組中的元素類型都是指針類型。任務(wù)9.2用指針優(yōu)化學(xué)生成績錄入與瀏覽
任務(wù)描述改進(jìn)學(xué)生成績管理系統(tǒng),用指針優(yōu)化學(xué)生成績錄入與瀏覽,提高程序執(zhí)行效率。任務(wù)分析我們將利用指針知識(shí)優(yōu)化程序,用指針來訪問結(jié)構(gòu)成員,處理批量數(shù)據(jù),達(dá)到提高系統(tǒng)的訪問效率。本任務(wù)的要點(diǎn)是:在函數(shù)體內(nèi)直接用指針訪問結(jié)構(gòu)成員。2指針的更多應(yīng)用Part◎指針與函數(shù)◎指針與結(jié)構(gòu)體指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針稱為結(jié)構(gòu)體指針,其定義格式和基本數(shù)據(jù)類型的指針變量定義一樣。一般形式為:struct結(jié)構(gòu)類型名*指針變量名當(dāng)結(jié)構(gòu)體指針指向一個(gè)結(jié)構(gòu)體變量時(shí),該指針變量的值就是該結(jié)構(gòu)體變量的起始地址。用取地址運(yùn)算符“&”就可獲得結(jié)構(gòu)變量的指針。一般形式為:指針變量名=&結(jié)構(gòu)體變量名;指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針例如:structStudent{charname[20];//姓名intid;//學(xué)號floatscore;//分?jǐn)?shù)}stu;指向結(jié)構(gòu)體student的指針變量定義并賦值為:structstudent*p=&stu;指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針在定義了指向結(jié)構(gòu)體類型變量的指針后,可以通過結(jié)構(gòu)體指針操作結(jié)構(gòu)體變量的成員,常用的訪問方式是:結(jié)構(gòu)體變量名.成員名(*結(jié)構(gòu)體指針變量名).成員名結(jié)構(gòu)體指針變量名->成員名例如:根據(jù)如上例子指針變量p指向了結(jié)構(gòu)體變量stu,則三種訪問方式分別為:stu.成員名、(*p).成員名、p->成員名。指針與結(jié)構(gòu)體
(3)指向結(jié)構(gòu)體數(shù)組的指針類似于用指向結(jié)構(gòu)體變量的指針,間接訪問結(jié)構(gòu)體成員一樣,也可以用指向結(jié)構(gòu)體數(shù)組及其元素的指針來處理結(jié)構(gòu)體數(shù)組??梢园呀Y(jié)構(gòu)體數(shù)組的數(shù)組名賦值給結(jié)構(gòu)體指針,也就是把結(jié)構(gòu)體數(shù)組的首地址賦值給結(jié)構(gòu)體指針。指針與結(jié)構(gòu)體
(3)指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù)類似于普通指針變量作為函數(shù)參數(shù)一樣,用指向結(jié)構(gòu)的指針變量作實(shí)參時(shí),是屬于“地址傳遞”方式。指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學(xué)生成績的錄入和瀏覽模塊①使用typedef給學(xué)生信息類型定義別名typedefstructstudent //定義學(xué)生成績結(jié)構(gòu)體{intnum; //學(xué)號charname[16]; //姓名floatmath; //數(shù)學(xué)成績floatyw; //語文成績floateng; //英語成績floatsum; //總分}STUDENT,*PSTUDENT;指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學(xué)生成績的錄入和瀏覽模塊②修改成績錄入模塊用指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù),函數(shù)體內(nèi)用指針法訪問結(jié)構(gòu)體成員。voidfnInputData(PSTUDENTs){inti;charch[2];PSTUDENTstu=s;stu+=m;//m已錄入的記錄總數(shù)PSTUDENTtemp;do{printf("\n\t請輸入學(xué)生信息:\n\t\t學(xué)號:");scanf("%ld",&stu->num);for(temp=s,i=0;i<m;i++,temp++)if(temp->num==stu->num)指針與結(jié)構(gòu)體
{printf("\n\t該學(xué)號已存在,請按任意鍵繼續(xù)!");getchar();}printf("\t\t姓名:");//輸入姓名、數(shù)學(xué)、英語、語文成績scanf("%s",stu->name);printf("\t\t數(shù)學(xué):");scanf("%f",stu->math);printf("\t\t英語:");scanf("%f",stu->eng);printf("\t\t語文:");scanf("%f",stu->yw);stu->sum=stu->math+stu->yw+stu->eng;//計(jì)算總成績m++;stu++;printf("\t\t是否繼續(xù)?(y/n):");scanf("%s",ch);}while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0);}指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學(xué)生成績的錄入和瀏覽模塊③修改成績?yōu)g覽模塊voidfnMod(PSTUDENTs){inti;PSTUDENTstu=s;printf("\t學(xué)號\t姓名\t數(shù)學(xué)\t語文\t英語\t總分\n");if(m==0)printf("\n\n\t\t沒有記錄");for(i=0;i<m;i++,stu++)printf("\t%-8ld%-8s%-8.1f%-8.1f%-8.1f%-8.1f\n",stu->num,stu->name,stu->math,stu->yw,stu->eng,stu->sum);}指針與結(jié)構(gòu)體
#include<stdio.h>structStudent{ //聲明結(jié)構(gòu)體類型structStudent intnum; charname[20]; charsex; intage;};structStudentstu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFang",'M',19},{10104,"WangMin",'F',20}}; //定義結(jié)構(gòu)體數(shù)組并初始化
intmain(){ structStudent*p; //定義指向structStudent結(jié)構(gòu)體變量的指針變量
printf("No.Namesexage\n"); for(p=stu;p<stu+3;p++) printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age);//輸出結(jié)果
return0;}例9-5已知3名學(xué)生的信息,包含姓名、性別和年齡,請自定義結(jié)構(gòu)體類型,然后利用指向結(jié)構(gòu)體數(shù)組的指針變量來訪問學(xué)生的信息,并在屏幕上輸出。指針與結(jié)構(gòu)體
執(zhí)行結(jié)果說明:1)構(gòu)造結(jié)構(gòu)體類型,包含姓名、性別、年齡三個(gè)成員。2)定義學(xué)生結(jié)構(gòu)體數(shù)組并初始化。3)在main()函數(shù)中定義學(xué)生結(jié)構(gòu)體類型指針變量,并指向結(jié)構(gòu)體數(shù)組。4)構(gòu)造循環(huán),利用結(jié)構(gòu)體指針變量訪問結(jié)構(gòu)體數(shù)組成員。注意:如果pStr指向結(jié)構(gòu)體數(shù)組的一個(gè)元素,則pStr+1就指向同一結(jié)構(gòu)體數(shù)組的下一個(gè)元素。指針與結(jié)構(gòu)體
例9-6已知3名學(xué)生的信息,包含編號、姓名、性別和年齡,請自定義結(jié)構(gòu)體類型,輸出3名學(xué)生信息,輸出過程通過函數(shù)實(shí)現(xiàn)。指針與結(jié)構(gòu)體
#include<stdio.h>structstudent{intid;intage;charname[10];charsex;};voidshow(structstudent*stu,intcount){structstudent*p;for(p=stu;p<stu+count;p++){printf("id:%d,age:%d,name:%s,sex:%c\n",p->id,p->age,p->name,p->sex);}}voidmain(){structstudentstu[3]={{1001,18,"ZhangSan",'M'},{1002,16,"LiSi",'W'},{1003,19,"ZhaoLiu",'M'}}; show(stu,3); getchar();}指針與結(jié)構(gòu)體
執(zhí)行結(jié)果說明:1)聲明show()函數(shù)并實(shí)現(xiàn)功能。2)聲明main()函數(shù),在main()函數(shù)中,定義并初始化結(jié)構(gòu)體數(shù)組。3)調(diào)用show()函數(shù),遍歷結(jié)構(gòu)體數(shù)組并輸出其成員的值。4)在該案例中,由于無法通過數(shù)組直接獲取到其長度,因此,在定義的show()函數(shù)中,需要傳遞兩個(gè)參數(shù),其中一個(gè)是結(jié)構(gòu)體數(shù)組的首地址,另一個(gè)是數(shù)組的長度。show()函數(shù)接收到傳遞來的數(shù)組首地址和長度后,使用for循環(huán),將結(jié)構(gòu)體數(shù)組中的所有成員輸出。注意:結(jié)構(gòu)體指針變量用于存放結(jié)構(gòu)體變量的首地址,所以將指針作為函數(shù)參數(shù)傳遞時(shí),其實(shí)就是傳遞結(jié)構(gòu)體變量的首地址。指針與函數(shù)
(1)函數(shù)的返回值是指針類型一個(gè)函數(shù)不僅可以返回int型、float型、char型和結(jié)構(gòu)類型等數(shù)據(jù)類型,也可以返回指針類型的數(shù)據(jù)。返回指針類型的函數(shù)定義格式為:類型名*函數(shù)名([參數(shù)表]){
函數(shù)體;}指針與函數(shù)
(1)函數(shù)的返回值是指針類型例如:int*func(){int*p;.../*省略的其它操作語句*/return(p);}func()函數(shù)的返回值是一個(gè)指向整型變量的指針。指針與函數(shù)
(2)指向函數(shù)的指針變量①指向函數(shù)的指針變量的定義函數(shù)在內(nèi)存中也占據(jù)一定的存儲(chǔ)空間并有一個(gè)入口地址(函數(shù)開始運(yùn)行的地址),這個(gè)地址就稱為該函數(shù)的指針??梢杂靡粋€(gè)指針變量來存放函數(shù)的入口地址,這時(shí)稱該指針指向這個(gè)函數(shù),并稱該指針變量為“指向函數(shù)的指針變量”,簡稱為“函數(shù)的指針變量”或“函數(shù)指針”,可以通過函數(shù)指針來調(diào)用函數(shù),這是函數(shù)指針的主要用途。函數(shù)指針定義的一般形式為:類型標(biāo)識(shí)符
(*指針變量名)(參數(shù));指針與函數(shù)
(2)指向函數(shù)的指針變量②指向函數(shù)的指針變量的賦值與其它指針的定義一樣,函數(shù)指針定義后,應(yīng)給它賦一個(gè)函數(shù)的入口地址,即使它指向一個(gè)函數(shù),才能使用這個(gè)指針。C語言中,函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值:指向函數(shù)的指針變量=函數(shù)名;指針與函數(shù)
(2)指向函數(shù)的指針變量③用函數(shù)指針變量調(diào)用函數(shù)通過函數(shù)指針來調(diào)用函數(shù)的一般格式是:(*函數(shù)指針)(實(shí)參表)指針與函數(shù)
(3)指向函數(shù)的指針變量作函數(shù)參數(shù)假設(shè)函數(shù)A在運(yùn)行過程中要根據(jù)不同情況多次調(diào)用下列函數(shù):B、C、D和E之一來協(xié)助它進(jìn)行處理,按照以往的做法是,用條件選擇語句將上述函數(shù)寫在函數(shù)A的函數(shù)體中的多個(gè)位置上,這是一種笨拙的、靈活性較差的處理方法。現(xiàn)在,可以通過使用函數(shù)指針作為函數(shù)參數(shù)的方式向函數(shù)A傳遞其它函數(shù)的入口地址,從而靈活地調(diào)用其他函數(shù)。指針與函數(shù)
例9-7函數(shù)指針實(shí)例,聲明add()函數(shù)和times()函數(shù)分別實(shí)現(xiàn)兩個(gè)整數(shù)相加和相乘。在main()函數(shù)體內(nèi)定義函數(shù)指針。用函數(shù)指針分別調(diào)用add()函數(shù)和times()函數(shù)計(jì)算兩個(gè)數(shù)的和及乘積。指針與函數(shù)
#include<stdio.h>intadd(inta,intb){returna+b;}inttimes(inta,intb){returna*b;}intfunc(int(*p)(int,int),inta,intb){returnp(a,b);}voidmain(){inta,b,result;int(*p)(int,int);a=32;b=12;p=add;result=func(p,a,b);printf("%d+%d=%d\n",a,b,result);p=times;result=func(times,a,b);printf("%d*%d=%d\n",a,b,result);getchar();}指針與函數(shù)
執(zhí)行結(jié)果說明:
在該案例中,第2~9行代碼定義了add()函數(shù)和times()函數(shù),分別用于對兩個(gè)參數(shù)進(jìn)行相加和相乘處理。第10~13行代碼定義了一個(gè)func()函數(shù)接收一個(gè)函數(shù)指針p和兩個(gè)int類型變量作為參數(shù),在函數(shù)中通過函數(shù)指針p來決定用哪個(gè)函數(shù)處理這兩個(gè)int類型的參數(shù),最后將結(jié)果返回。第20~25行代碼分別將函數(shù)指針p指向add()函數(shù)和times()函數(shù),func()函數(shù)調(diào)用參數(shù)p,然后使用result變量來接收func()的返回值,并在控制臺(tái)輸出結(jié)果。注意:1)指針函數(shù)本質(zhì)是一個(gè)函數(shù),其返回值為指針。函數(shù)指針本質(zhì)是一個(gè)指針,其指向一個(gè)函數(shù)。其寫法分別為:指針函數(shù):int*fun(intx,inty);函數(shù)指針:int(*fun)(intx,inty);2)指針函數(shù)的*是屬于數(shù)據(jù)類型的,而函數(shù)指針的星號是屬于函數(shù)名的。拓展案例案例9-1寫出下面問題的算法問題描述請編寫一個(gè)函數(shù)strlong(),返回兩個(gè)字符串中較長的一個(gè),通過指針函數(shù)實(shí)現(xiàn)。拓展案例
#include<string.h>char*strlong(char*str1,char*str2){//函數(shù)返回的char*(指針)printf("\nstr1的長度%dstr2的長度%d",strlen(str1),strlen(str2));if(strlen(str1)>=strlen(str2)){returnstr1;}else{returnstr2;}}intmain(){charstr1[30],str2[30],*str;printf("\n請輸入第1個(gè)字符串");gets(str1);printf("\n請輸入第2個(gè)字符串");gets(str2);str=strlong(str1,str2);printf("\nLongerstring:%s\n",str);getchar();return0;}拓展案例案例1-2寫出下面問題的算法問題描述本題是一個(gè)經(jīng)典的數(shù)學(xué)問題。對于一個(gè)大于2的正整數(shù),判斷它是不是一個(gè)素?cái)?shù)。。說明:1)本例中定義了一個(gè)返回類型為char*的strlong()指針函數(shù),通過strlen()求出兩個(gè)字符串的長度,將長度長的字符串返回。2)在main()函數(shù)中通過gets方法輸入兩個(gè)字符串,調(diào)用strlong()指針函數(shù)求出結(jié)果。注意:1)用指針作為函數(shù)返回值時(shí)需要注意,函數(shù)運(yùn)行結(jié)束后會(huì)銷毀在它內(nèi)部定義的所有局部數(shù)據(jù),包括局部變量、局部數(shù)組和形式參數(shù),函數(shù)返回的指針不能指向這些數(shù)據(jù)。2)函數(shù)運(yùn)行結(jié)束后會(huì)銷毀該函數(shù)所有的局部數(shù)據(jù),這里所謂的銷毀并不是將局部數(shù)據(jù)所占用的內(nèi)存全部清零,而是程序放棄對它的使用權(quán)限,后面的代碼可以使用這塊內(nèi)存。拓展案例
執(zhí)行結(jié)果拓展案例案例9-2寫出下面問題的算法問題描述使用指針修改學(xué)生成績管理系統(tǒng)的記錄查找、修改、刪除模塊。拓展案例
#include<stdio.h>#include<string.h>intn;charc;//全局變量structstudent//結(jié)構(gòu)體類型{charnum[10];charname[10];floatmath;floatchinese;floatenglish;};voidinput(structstudent*p)//基本信息輸入{scanf("%s%s%f%f%f",(*p).num,p->name,&p->math,&p->chinese,&p->english);}voidoutput(structstudent*p)//基本信息輸出{printf("%-8s%-8s%-8.0f%-8.0f%-8.0f\n",p->num,p->name,p->math,p->chinese,p->english);
}//增加voidinsert(structstudent*p)//在數(shù)組尾部插入信息,實(shí)際就是對第n個(gè)數(shù)組元素的5個(gè)成員分別賦值{printf("~~~~~~~~~~~~~增加學(xué)生信息~~~~~~~~~~~~~~\n\n");printf("請輸入新同學(xué)的相關(guān)信息:\n");while(1){fflush(stdin);
拓展案例
printf("請輸入新同學(xué)的學(xué)號:");gets((p+n)->num);printf("請輸入新同學(xué)的姓名:");gets((p+n)->name);printf("請輸入新同學(xué)的數(shù)學(xué)成績:");scanf("%f",&(p+n)->math);printf("請輸入新同學(xué)的語文成績:");scanf("%f",&(p+n)->chinese);printf("請輸入新同學(xué)的英語成績:");scanf("%f",&(p+n)->english);n++;//人數(shù)+1printf("增加成功!\n\n");printf("是否繼續(xù):是請輸入'Y'或'y',否請輸入'N'或'n':");getchar();c=getchar();if(c=='Y'||c=='y')continue;elseif(c=='N'||c=='n')break;}}voidshow(structstudent*stu){inti;printf("\n\n所有學(xué)生的相關(guān)信息有:\n");printf("*************************************\n\n");printf("%-8s%-8s%-8s%-8s%-8s\n","學(xué)號","姓名","數(shù)學(xué)","語文","英語");for(i=0;i<n;i++)output(&stu[i]);printf("\n*************************************\n\n");}//刪除intdel(structstudent*a){chard_num[10];inti,j,r=0;//r是返回值,默認(rèn)值是0,i是查找的循環(huán)變量,j是刪除的循環(huán)變量拓展案例
getchar();printf("請輸入要?jiǎng)h除的同學(xué)的學(xué)號:");gets(d_num);for(i=0;i<n;i++)if(strcmp(d_num,a[i].num)==0)//查找d_num是否和學(xué)生數(shù)組中的學(xué)號匹配{for(j=i;j<n;j++)a[j]=a[j+1];//從第i+1個(gè)元素開始到最后一個(gè),每個(gè)元素前移一位n=n-1;//元素個(gè)數(shù)減1r=1;i--;}returnr;//返回r}//修改voidmodify(structstudent*a)//根據(jù)姓名修改學(xué)生信息.
{charname[10];//1用來保存從鍵盤上輸入的名字,c作為一個(gè)開關(guān)變量inti;printf("~~~~~~~~~~~~~修改學(xué)生信息~~~~~~~~~~~~~~\n\n");while(1){fflush(stdin);//清空緩存printf("請輸入要修改的同學(xué)的姓名:");gets(name);for(i=0;i<n;i++)if(strcmp(name,a[i].name)==0)//查找nane是否和學(xué)生數(shù)組中的姓名匹配{//修改,實(shí)際就是用新內(nèi)容覆蓋舊內(nèi)容printf("請輸入新的學(xué)號:");gets(a[i].num);printf("請輸入新的姓名:");gets(a[i].name);拓展案例
printf("請輸入新的數(shù)學(xué)成績:");scanf("%f",&a[i].math);printf("請輸入新的語文成績:");scanf("%f",&a[i].chinese);printf("請輸入新的英語成績:");scanf("%f",&a[i].english);printf("修改成功!\n\n");break;}if(i==n)printf("找不到該同學(xué)!\n");printf("是否繼續(xù):是請輸入'Y'或'y',否請輸入'N'或'n':");getchar();c=getchar();if(c=='Y'||c=='y')continue;elseif(c=='N'||c=='n')break;}}//查找
voidfind(structstudent*a){charname[10]; intr=0,i; printf("~~~~~~~~~~~~~查找學(xué)生信息~~~~~~~~~~~~~~\n\n"); while(1){ fflush(stdin);
printf("請輸入要查找學(xué)生的姓名:"); gets(name); for(i=0;i<n;i++){ if(strcmp(name,a[i].name)==0) {printf("已找到,相關(guān)信息為:\n");拓展案例
printf("學(xué)號:%s\n姓名:%4s\n數(shù)學(xué):%2.0f\n語文:%2.0f\n英語:%2.0f\n",a[i].num,a[i].name,a[i].math,a[i].chinese,a[i].english); r=1; } }if(r==0)printf("NotFound!\n");printf("是否繼續(xù):是請輸入'Y'或'y',否請輸入'N'或'n':");c=getchar();if(c=='Y'||c=='y')continue;elseif(c=='N'||c=='n')break; }}voidmain(){structstudentstu[50];//定義結(jié)構(gòu)體變量stu,用來保存學(xué)生信息
inti;printf("請輸入學(xué)生個(gè)數(shù):");scanf("%d",&n);//從健盤上輸入初始人數(shù)for(i=0;i<n;i++){printf("請輸入第%d學(xué)生的相關(guān)信息:(學(xué)號、姓名、數(shù)語英)\n",i+1);input(stu+i);//stu+i===>&stu[i]}show(stu);//顯示所有學(xué)生信息.insert(stu);show(stu);printf("~~~~~~~~~~~~~刪除學(xué)生信息~~~~~~~~~~~~~~\n\n");while(1){if(del(stu)==1)
拓展案例
{printf("刪除成功!\n");
}elseprintf("\n找不到該同學(xué)相關(guān)信息");printf("\n是否繼續(xù):是請輸入'Y'或'y',否請輸入'N'或'n':");c=getchar();if(c=='Y'||c
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能智能語音翻譯系統(tǒng)在智能翻譯行業(yè)發(fā)展趨勢中的應(yīng)用開發(fā)可行性研究報(bào)告
- 2025年制造業(yè)工業(yè)互聯(lián)網(wǎng)發(fā)展現(xiàn)狀與創(chuàng)新趨勢報(bào)告
- 咳喘門診應(yīng)急預(yù)案(3篇)
- 戲劇表演在心理輔導(dǎo)中的應(yīng)用劇本
- 早餐店施工方案(3篇)
- 地坪恢復(fù)施工方案(3篇)
- 水面屏障施工方案(3篇)
- 天河花園施工方案(3篇)
- 醫(yī)院急診室管理規(guī)范及操作流程
- 爬山秋游活動(dòng)策劃方案(3篇)
- DB32-T 4111-2021 預(yù)應(yīng)力混凝土實(shí)心方樁基礎(chǔ)技術(shù)規(guī)程
- 不同時(shí)代的流行音樂
- 醫(yī)療衛(wèi)生機(jī)構(gòu)6S常態(tài)化管理打分表
- 幾種常用潛流人工濕地剖面圖
- vpap iv st說明總體操作界面
- 2023人事年度工作計(jì)劃七篇
- LY/T 1692-2007轉(zhuǎn)基因森林植物及其產(chǎn)品安全性評價(jià)技術(shù)規(guī)程
- GB/T 20145-2006燈和燈系統(tǒng)的光生物安全性
- 長興中學(xué)提前招生試卷
- 螺紋的基礎(chǔ)知識(shí)
- 蜂窩煤成型機(jī)課程設(shè)計(jì)說明書
評論
0/150
提交評論