版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
會計(jì)學(xué)1CC程序設(shè)計(jì)復(fù)合數(shù)據(jù)類型
[例]
交換兩數(shù)。voidswap();main(){inta,b;scanf(%d%d”,&a,&b);swap(&a,&b);printf(“%d,%d”,a,b);}voidswap(int*p1,int*p2){intt;t=*p1,*p1=*p2,*p2=t;}
2000H2001H2EA0H2EA1Ha=10b=8內(nèi)存
地址變量108指針變量p2=&b=2EA0H:::3100H3101H3802H3803H2000H2EA0Hp1=&a=2000H第1頁/共62頁變量的指針變量
1)指針變量的定義
<類型標(biāo)示符>
*<變量名>;[例]int*p1,*p2;
2)指針變量的賦值指針變量=&變量[例]
先定義后賦值:p1=&a;p2=&b;
定義時(shí)賦初值:inta,*prt=&a;
其中:&是取指針(地址)運(yùn)算符。賦初值問題:一個指針變量被定義后,在賦予某一變量的指針以前,其值是隨機(jī)的,這個隨機(jī)數(shù)可能恰好是系統(tǒng)區(qū)的某單元的地址。在系統(tǒng)不知和不受系統(tǒng)管理的情形下改寫其中內(nèi)容是危險(xiǎn)的。變量的地址是由系統(tǒng)分配和管理的,因而是安全的。
3)指針變量的使用
p1=&a;p2=&b;scanf(“%d%d”,p1,p2);t=*p1;*p1=*p2;*p2=t;
第2頁/共62頁其中:*號是取值運(yùn)算符。*與&是一對互逆運(yùn)算。例如:*(&a)<=>a;&(*p)<=>p*指針變量<=>變量例如:p=&a;*p就是a;
定義時(shí)的*與使用時(shí)的*含義不同,前者表示定義的是指針變量;后者是對變量的取值運(yùn)算。定義了一個某類型的指針變量后,它可以指向任意一個同類型變量。
4)指針變量作函數(shù)參數(shù)主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參
&appp
第3頁/共62頁6.2數(shù)組類型數(shù)組的特點(diǎn):
(1)數(shù)組中的每一個元素均屬于同一類型,我們稱這種類型為數(shù)組的基類型;
(2)每個數(shù)組中的元素個數(shù)一經(jīng)確定后就保持不變,我們稱它為數(shù)組的長度;
(3)數(shù)組中的每個元素均為變量,我們用數(shù)組下標(biāo)來直接訪問數(shù)組的元素;
(4)數(shù)組中的元素還允許是數(shù)組類型,從而產(chǎn)生二維數(shù)組、多維數(shù)組等結(jié)構(gòu);
(5)在數(shù)組定義中,常量表達(dá)式的值雖然指出了數(shù)組元素的個數(shù),但C編譯器不做越界檢查;
(6)數(shù)組名表示數(shù)組所用空間的首地址,也就是數(shù)組第0個元素的地址。是一個常量地址。一、一維數(shù)組的聲明格式:類型數(shù)組名[常量表達(dá)式];二、一維數(shù)組的引用與初始化第4頁/共62頁引用形式:數(shù)組名[下標(biāo)]初始化形式:存儲類別數(shù)據(jù)類型數(shù)組名[數(shù)組長度]={初始化值};例:staticinta[5]={10,20,30,40,50};一般要求:只有定義為靜態(tài)或外部存儲的才能初始化。三、數(shù)組作為函數(shù)的參數(shù)(傳遞地址)例:對一字符串反序輸出。(exinver.c)四、二維數(shù)組的聲明形式:類型數(shù)組名[常量表達(dá)式][常量表達(dá)式];如:intscores[50][3];說明:編譯程序?yàn)槎S數(shù)組分配存儲空間時(shí)是按行進(jìn)行的,即先按順序存放第一行的所有數(shù)據(jù),然后接著按順序存放第二行的所有數(shù)據(jù),如此類推。二維數(shù)組scores的存儲空間分配如下圖所示:第5頁/共62頁┃...┣━━━━━━━25000┃scores[0][0]┠───────25002┃scores[0][1]┠───────25004┃scores[0][2]┣━━━━━━━25006┃scores[1][0]┠───────25008┃scores[1][1]┠───────25010┃scores[1][2]┣━━━━━━━.┃.┃....┃┠───────25298┃scores[49][2]┣━━━━━━━┃...第6頁/共62頁五、二維數(shù)組元素的引用與初始化引用形式:數(shù)組名[行下標(biāo)][列下標(biāo)]//下標(biāo)為整數(shù)類型的表達(dá)式如:scores[20][1]=100;初始化形式:存儲類別數(shù)據(jù)類型數(shù)組名[常量1][常量2]={初值};如:staticints[3][4]={50,60,80,20,40,90,70,100,10};[例]矩陣行列互換。Exmatrix.c123415956782610910111237114812
六、指針與數(shù)組在C語言中,指針與數(shù)組之間的關(guān)系是十分密切的。指針類型變量可以當(dāng)作數(shù)組使用,數(shù)組類型變量也可以當(dāng)作指針使用,即在C語第7頁/共62頁言中,我們可以象訪問指針一樣訪問數(shù)組,也可以象訪問數(shù)組一樣訪問指針。其區(qū)別為:數(shù)組名不能自加、自減,但指針變量可以。例如:inta[10],*p;p=a;p++或p--都是成立的,而a++或a--是不成立的。而*(a+I)、a[I]、*(p+I)、p[I]是等價(jià)的。七、指針數(shù)組與數(shù)組指針指針數(shù)組:指基類型為指針類型的數(shù)組,即該數(shù)組的每個元素均為一個指針。如果我們需要保留許多指針的值,也就是要保存多個變量的地址,就可以使用指針數(shù)組。定義形式:數(shù)據(jù)類型*數(shù)組名[數(shù)組長度];如:int*p[10];
//在此聲明了一個包含10個整數(shù)類型指針變量的數(shù)組p。這里"*"并不是數(shù)組名字的組成部分,它只是告訴編譯程序p是一個整數(shù)類型的指針數(shù)組,而不是簡單的整數(shù)類型數(shù)組。
第8頁/共62頁例:建立如下距陣并輸出
1000101010001000101010001程序?yàn)椋?/p>
main(){inta[5][5]={0},*p[5],i,j;for(i=0;i<5;i++)p[i]=&a[i][0];//指針數(shù)組p指向a數(shù)組的每行起始地址for(i=0;i<5;i++){*(p[i]+i)=1;//對主對角線賦值*(p[i]+4-i)=1;//對副對角線賦值
}for(i=0;i<5;i++)//用二層循環(huán)打印二維數(shù)組
{for(j=0;j<5;j++)printf(“%2d”,*(p[i]+j));//每個指針數(shù)組指向每列的表示
printf("\n");}}第9頁/共62頁數(shù)組指針:定義形式:數(shù)據(jù)類型(*指針變量名)[長度];如:int(*array_ptr)[10];//申明了一個指針類型的變量array_ptr,它指向一個長度為10的整數(shù)數(shù)組。數(shù)組指針可以看成是二維的,此時(shí)與二維數(shù)組在存儲上相同,但變量名是指針變量,可以進(jìn)行指針運(yùn)算。引用方式:若有:int(*p)[4],a[3][4];p=a;引用:*(*(p+I)+j)a[I][j]例:exarrp.c第10頁/共62頁6.3字符串一、字符串常量與變量:字符串變量是一個基類型為字符類型的數(shù)組變量,同樣遵循“先聲明、后使用”的原則,我們在聲明字符串變量時(shí),可用字符串常量作初始化。如:charname[10]=“l(fā)imeixue”;初始化方式有三種。也可以定義指針變量指向字符串。如:char*name=“l(fā)imeixue”;二、字符串?dāng)?shù)組定義:char*name[12];例:按姓名查詢。Exsearch.c第11頁/共62頁三、字符串庫函數(shù)(string.h)1.
char*strcat(char*str1,constchar*str2);
作用:將字符串str2連接到字符串str1后,形成一個新字符串,原先str1的結(jié)束標(biāo)記‘\0’被取消。函數(shù)返回值為str1。注意為字符串變量str1分配的存儲空間一定要足夠大,能夠容納兩個字符串連接后的新字符串。
如:chars1[]=“good”,s2[]=“evening!”;
strcat(s1,s2);2.char*strchr(constchar*str,intch);
作用:尋找字符串str中第一次出現(xiàn)字符ch的位置。如果找到ch,則返回指向該位置的指針;否則返回空指針。3.intstrcmp(constchar*str1,constchar*str2);
作用:比較字符串str1和str2的內(nèi)容是否相同。如果str1小于str2則返回負(fù)數(shù);如果str1等于str2則返回零;如果str1大于str2則返回正數(shù)。4.char*strcpy(char*str1,constchar*str2);
作用:將str2指向的字符串復(fù)制到str1指向的位置中并返回str1。注意為str1分配的存儲空間必須能放得下str2指向的字符串。
注:char*str;strcpy(str,“Becareful”);引起的問題。第12頁/共62頁5.unsignedintstrlen(constchar*str);作用:返回字符串str中的字符個數(shù),包括其中的空格與轉(zhuǎn)義字符,但不包括字符串結(jié)束標(biāo)記‘\0’。6.char*strstr(const*str1,constchar*str2);作用:尋找字符串str2在字符串str1中第一次出現(xiàn)的位置,不包括str2的結(jié)束標(biāo)記‘\0’。如果找到str2,則返回指向該位置的指針;否則返回空指針。四、字符串應(yīng)用例1:按姓名排序。(exnsort.c)冒泡法排序(從小到大):n個數(shù)參與排序,每趟找出最大數(shù)存與最后,共n-1趟。每一趟中對相鄰的兩個元素進(jìn)行比較,不符合次序的立即交換。例2:打印出全班每個學(xué)生姓名的長度。Exlen.c第13頁/共62頁6.4結(jié)構(gòu)體類型
一、概述記錄型數(shù)據(jù)與結(jié)構(gòu)體一組相關(guān)的不同數(shù)據(jù)類型的數(shù)據(jù)項(xiàng),可作一個整體來處理。PASCAL中稱“記錄型”數(shù)據(jù),C中稱結(jié)構(gòu)體類型數(shù)據(jù)。與數(shù)組有明顯不同,數(shù)組要求其所有成員的類型、長短一樣結(jié)構(gòu)體類型和結(jié)構(gòu)體變量。structstudent{intnum;charname[20];charsex;structdatebirthday;floatscore;}stu1,stu2;
structdate{intmonth;intday;intyear;};
什么情形時(shí)適用結(jié)構(gòu)體或數(shù)組?第14頁/共62頁二、定義結(jié)構(gòu)體的類型和變量定義結(jié)構(gòu)體類型一般形式:
[例]參見上頁struct結(jié)構(gòu)體類型名{分量1;分量2;分量3;
:}分量:<類型標(biāo)示符><變量|復(fù)合數(shù)據(jù)結(jié)構(gòu)>
分量又稱域或成員。當(dāng)分量是結(jié)構(gòu)體時(shí),形成定義時(shí)的嵌套。第15頁/共62頁定義結(jié)構(gòu)體類型的變量定義結(jié)構(gòu)體變量三種形式:1.定義結(jié)構(gòu)體的同時(shí)定義例如前頁例。2.先定義結(jié)構(gòu)體,后定義結(jié)構(gòu)體變量例:structstu{….};….structstust1,st2;3.直接定義例:struct
{….}變量名表;
在struct后不出現(xiàn)結(jié)構(gòu)體類型名第16頁/共62頁三、結(jié)構(gòu)體變量的引用結(jié)構(gòu)體類型不是存儲數(shù)據(jù)的實(shí)體,即系統(tǒng)并不是給它分配內(nèi)存,它僅是一種數(shù)據(jù)類型,與int,char類似,用來定義一種數(shù)據(jù)類型的變量;結(jié)構(gòu)體類型變量才是存儲數(shù)據(jù)的實(shí)體,結(jié)構(gòu)體變量的分量具體分配存儲單元,等價(jià)于一組變量。因此我們引用的是結(jié)構(gòu)體變量。引用結(jié)構(gòu)體變量只能通過引用結(jié)構(gòu)體變量的分量(成員)實(shí)現(xiàn)(在I/O時(shí),賦值時(shí)等)。用“.”或“->”引用。例如:sum=st1.score+st2.score;成員運(yùn)算符(多級)例如:age=1999-st1.birthday.year;_QC允許將一結(jié)構(gòu)體變量的所有分量賦予同類的另一變量。例如:st2=st1;[例]ex2stu1.c第17頁/共62頁四、結(jié)構(gòu)體數(shù)組以某結(jié)構(gòu)體類型也可以定義數(shù)組[例]按姓名查詢。ex2stuarr.cstructstudent{intnum;charname[30];charsex;floatscore;}stu[30];
每個下標(biāo)變量stu[i]都有結(jié)構(gòu)體類型student的各個分量;下標(biāo)變量的引用同變量。第18頁/共62頁五、結(jié)構(gòu)體類型的指針指向結(jié)構(gòu)體類型變量的指針
指向結(jié)構(gòu)體類變量的指針就是該變量所占用的內(nèi)存區(qū)段的首址。[例]structstudent{intnum;charname[3];charsex;floatscore;}st1,st2,st3;
structstudent*p=&st1;printf(“%d,%s”,st1.num,);printf(“%d,%s”,(*p).num,(*p).name);printf(“%d,%s”,p->num,p->name);numnamesexscore::2A00Hst1p第19頁/共62頁
指向結(jié)構(gòu)體類型數(shù)組的指針
指向結(jié)構(gòu)體類數(shù)組的指針就是該數(shù)組所占用的內(nèi)存區(qū)段的首址。[例]structstudent{intnum;charname[3];charsex;floatscore;}st[30]={……};
structstudent*p=st;for(p=st;p<st+30;p++)printf(“%d,%s,%c,%5.1f\n”,p->num,p->name,p->sex,p->score);::2A00Hst[0]st[1]st[2]st[3]:2A0AH2A14H2AE0Hp第20頁/共62頁例:若干個學(xué)生的信息包括:學(xué)號、姓名、三門可課的成績(c語言、電子技術(shù)、控制理論)、總分,要求打印一份名次表。分析:總分是需要計(jì)算的。按總分從小到大排序(bubble)。按行輸出。Ex2table.c第21頁/共62頁指向結(jié)構(gòu)體類型數(shù)據(jù)的指針一、指向結(jié)構(gòu)體類型變量的指針[例]打印通訊錄。(excommu.c)二、指向結(jié)構(gòu)體數(shù)組的指針[例]用結(jié)構(gòu)指針建立一個圖書檢索系統(tǒng)。按書名檢索。(exsearch.c)三、結(jié)構(gòu)指針的使用[例]鏈表。鏈表的建立、遍歷、查找、插入、刪除操作。第22頁/共62頁2023/1/17鏈表什么是鏈表?線性表:有限個元素的有序集合??捎脭?shù)組或鏈表表示。數(shù)組和鏈表兩者都邏輯連續(xù),但后者可以在空間不連續(xù)。動態(tài)數(shù)據(jù)結(jié)構(gòu):其大小可變;動態(tài)分配存儲空間。鏈表是最簡單的一種,屬于線性動態(tài)數(shù)據(jù)結(jié)構(gòu),樹是非線性動態(tài)數(shù)據(jù)結(jié)構(gòu)。鏈表:鏈表中的一個元素稱為一個結(jié)點(diǎn)或節(jié)點(diǎn)。每個結(jié)點(diǎn)由兩部分組成:數(shù)據(jù)部分、指向上下結(jié)點(diǎn)的指針??窟@樣的指針把各個結(jié)點(diǎn)串聯(lián)起來構(gòu)成鏈表。分單向、雙向鏈表,后者可以兩方向連接。
00單向鏈表雙向鏈表0數(shù)據(jù)部分第23頁/共62頁2023/1/17鏈表為什么使用鏈表?1)不需要連續(xù)存儲空間,可利用內(nèi)存碎片;2)插入刪除元素不需移動其它元素,處理速度快;3)動態(tài)分配存儲空間,不必以最大可能長度預(yù)定存儲空間,
且可以隨意擴(kuò)充表的容量。動態(tài)分配存儲空間(使用函數(shù))void*malloc(unsignedsize)函數(shù)(memoryallocation):在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間,size為結(jié)點(diǎn)元素各成員項(xiàng)的總字節(jié)數(shù),可以用sizeof(數(shù)據(jù)類型名)運(yùn)算符獲得。該函數(shù)的返回值是一個指針,它的值是所分配存儲區(qū)的起始地址,當(dāng)該函數(shù)未成功執(zhí)行時(shí),返回值為0。如:structstudent{intnum;floatscore;structstudent*next;}*p1;p1=(structstudent*)malloc(sizeof(structstudent));第24頁/共62頁voidfree(ptr)函數(shù):該函數(shù)釋放由ptr指向的內(nèi)存區(qū)。Ptr是最近一次調(diào)用calloc或malloc函數(shù)時(shí)返回的值。用結(jié)構(gòu)體及結(jié)構(gòu)體指針構(gòu)造鏈表和鏈表操作(1)建立鏈表。鏈表的建立過程可以描述如下:
假設(shè)結(jié)構(gòu)體定義如下:
structnode
{intnum;
floats;
structnode*next;
};
1.為了建立鏈表,在程序中需要使用兩個指向結(jié)構(gòu)的指針。
例如:structnode*p1,*p2;
建立鏈表時(shí),首先使用malloc函數(shù)為第一個元素分配存儲
空間,并把該空間的地址賦予p1,使p1指向該存儲空間:
p1=(structnode*)malloc(sizeof(structnode));第25頁/共62頁2.把p1的值賦予p2,從而使p2也指向該存儲空間,便于連接
后面的結(jié)點(diǎn)元素。3.通過p1訪問成員num和s,并對其賦值:
p1->num=1;scanf(“%f”,&(*p1).s);
至此,鏈表中的第一個元素在內(nèi)存中已建立,并且其數(shù)據(jù)部
分已被賦值。4.建立鏈表的第二個元素時(shí),再次使用malloc函數(shù):
p1=(structnode*)maloc(sizeof(structnode));
這時(shí)p1指向第二個元素的存儲空間,通過p1訪問num和s:
p1->num=2;scanf(“%f”,&(*P).s);p1->next=p2;
從而第二個元素指向第一個元素,將兩個元素鏈接在一起。
最后調(diào)整指針為:p2=p1;使指針p2指向第二個(始終指向最
后一個)元素。反復(fù)執(zhí)行上面的四個語句,就可以不斷地把
元素加入到鏈表中去。這種建立鏈表的方法是從表頭插入的
過程,指針p2總是指向最后出現(xiàn)的那個元素。第26頁/共62頁鏈表建立函數(shù):#defineNULL0/*定義空指針,作為表尾結(jié)點(diǎn)的next域*/structnode/*結(jié)點(diǎn)元素的數(shù)據(jù)結(jié)構(gòu)類型*/{intnum;structnode*next;};intn=0;/*定義外部變量n,用來記錄結(jié)點(diǎn)的個數(shù)*/structnode*creat()/*函數(shù)的返回值為指向頭結(jié)點(diǎn)的指針*/{structnode*p1,*p2,*head;p2=NULL;/*最先加入的為表尾結(jié)點(diǎn),將其next域置為NULL*/printf("\npleaseinputnum:\n");do{p1=(structnode*)malloc(sizeof(structnode));/*申請一個結(jié)點(diǎn)空間*/
第27頁/共62頁scanf("%d",&p1->num);/*輸入結(jié)點(diǎn)元素的數(shù)據(jù)部分*/scanf(“%f”,&p1->s);p1->next=p2;/*使新生成的結(jié)點(diǎn)元素指向前一結(jié)點(diǎn)*/p2=p1;/*調(diào)整p2,使其始終指向最后出現(xiàn)的那個元素*/n++;/*結(jié)點(diǎn)數(shù)加1*/}while(p1->num!=-1);n--;/*結(jié)點(diǎn)數(shù)應(yīng)減去最后輸入的作為結(jié)束標(biāo)志的結(jié)點(diǎn)*/p2=p2->next;/*最后一次生成的結(jié)點(diǎn)不作為鏈表的一部分,應(yīng)跳過該結(jié)點(diǎn)*/head=p2;/*用head作頭指針,指向表頭元素*/return(head);/*返回鏈表頭指針*/}第28頁/共62頁
(2)
鏈表的遍歷(輸出)
函數(shù)如下:voidprint(head)structnode*head;{structnode*p;printf("\nThetableis:\n");p=head;/*以表尾結(jié)點(diǎn)中指針為NULL做為遍歷結(jié)束的標(biāo)志*/while(p!=NULL){printf("%4d--%7.2f",p->num,p->s);p=p->next;/*移向下一個結(jié)點(diǎn)*/}}(link_t.c)第29頁/共62頁2023/1/17鏈表插入結(jié)點(diǎn)刪除結(jié)點(diǎn)0單向鏈表2100h2100h2180h2010h2050h2050h2a02h2a02h2100h2180h0單向鏈表2100h2050h2a02h2010h2050h2100h2a02h2a02h第30頁/共62頁指針在函數(shù)中的應(yīng)用一、指針作為函數(shù)的參數(shù)用指針作為函數(shù)的參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義指針變量;在函數(shù)調(diào)用中實(shí)參指針和形參指針類型應(yīng)一致。[例]分析結(jié)果。(expoint.c)#include"stdio.h”sub(int*s,inty){staticintt=3;y=s[t];s[t]=s[t]+4;t--;}main(){inta[]={1,2,3,4},i,x=0;printf("xa[i]\n");for(i=3;i>=0;i--){sub(a,x);printf("%d%d\n",x,a[i]);}}
Xa[i]08070605第31頁/共62頁二、函數(shù)的指針及函數(shù)的指針變量概念
函數(shù)的指針就是函數(shù)代碼在內(nèi)存中所占存儲區(qū)的首地址。函數(shù)的指針變量(指向函數(shù)的指針變量)存放函數(shù)的指針,用來指向某函數(shù)。p++,p+n無意義??梢栽诓煌瑫r(shí)間用同一個指針變量調(diào)用不同函數(shù)。
指向函數(shù)的指針變量的定義
類型標(biāo)示符(*變量名)();
例如:float(*p)();
表示p是一個指向返回值為float型的函數(shù)的指針變量。
運(yùn)用[例]求n!。
賦值形式:<指向函數(shù)的指針變量名>=<函數(shù)名>;
調(diào)用形式:(*指向函數(shù)的指針變量)(實(shí)參表);
(expfun.c)第32頁/共62頁#include"stdio.h"intadd(n)intn;{intsum=1,i;for(i=1;i<=n;i++)sum=sum*i;return(sum);}main(){intn,m,(*p)();printf("inputn:\n");scanf("%d",&n);p=add;m=(*p)(n);printf("n!=%d\n",m);}賦值調(diào)用第33頁/共62頁用指向函數(shù)的指針變量作函數(shù)的參數(shù)
在C語言中可以把指向函數(shù)的指針變量作為參數(shù)傳遞到其他函數(shù)。例如在有些程序中,用戶可以從各種可供選擇的選擇項(xiàng)中選用他所需的操作,而各選項(xiàng)又是由一個獨(dú)立的函數(shù)來實(shí)現(xiàn)的,在程序?qū)崿F(xiàn)中就可以采用函數(shù)指針作參數(shù)的方式完成。第34頁/共62頁[例]
編寫一個簡單的帳單系統(tǒng),包括:錄入、刪除、顯示
帳目、退出功能,各功能項(xiàng)所對應(yīng)的實(shí)現(xiàn)函數(shù)分別為
enter()、delete()、review()、quit()。#include"stdio.h”intenter(),delete(),review(),quit();main(){inti;int(*p)();i=menu();switch(i){case1:p=enter;break;case2:p=delete;break;case3:p=review;break;case4:p=quit;break;}process(p);}第35頁/共62頁menu(){charch;do{printf("1.enter\n");printf("2.Delete\n");printf("3.Review\n");printf("4.Quit\n");printf("Selectanumber:");ch=getche();printf("\n");}while(!strchr("1234",ch));return(ch-48);}第36頁/共62頁process(int(*f)()){(*f)();}enter(){printf("Inenter!\n");}delete(){printf("Indelete\n");}review(){printf("Inreview!\n");}quit(){printf("Inquit!\n");}第37頁/共62頁
返回指針值的函數(shù)定義
類型標(biāo)示符*函數(shù)名(參數(shù)表);例如:
char*person(charname[],charsex);
函數(shù)person()返回的指針指向char型量。[例]
編寫一個strchr()函數(shù),它的作用是在一個字符串中找一個
指定的字符,返回該字符的地址。#include"stdio.h"char*strch(char*str,charch){while(*str!=ch)str++;/*查找指定字符的位置*/return(str);/*返回找到字符的地址*/}第38頁/共62頁main(){char*strchr();char*pt,ch,line[]="Ilovechina.";printf("pleaseinputchar:\n");scanf("%c",&ch);/*輸入要查找的字符*/pt=strchr(line,ch);/*調(diào)用函數(shù)查找指定字符,將返回的地址值賦給指針變量pt*/printf("\nstringstartsataddress%x.\n",line);/*輸出本字符串的首地址*/printf("Firstoccurrenceofchar%cisaddress%x.\n",ch,pt);/*輸出找到字符的地址,地址都用十六進(jìn)制表示*/printf("Thisisposition%d(startingfrom0)\n",pt-line);/*輸出找到字符的相對于首地址的偏移位置*/}第39頁/共62頁指針數(shù)組和二級指針概念:
數(shù)組的元素是指針變量。定義:類型標(biāo)示符*數(shù)組名[數(shù)組長度];例如:char*p[20];
定義了p[0]--p[19]計(jì)20個帶下標(biāo)的指針變量,都指向char型量。
適合于處理字串。指針數(shù)組namename[0]name[1]name[2]name[3]“TurboC”“MSC”“QuickC”:“ANSIC”字符串第40頁/共62頁二級指針
二次間接。定義:<數(shù)據(jù)類型表示符>**<指針變量名>;例如:int**p;引用方式為:**<指針變量名>[例1]main(){staticchar*name[]={“TurboC”,“ANSIC”,“MSC”,“VisualC”,….);char**p=name;inti;for(i=0;i<10;i++)printf(“%s\n”,*p++);/*?**p*/}
&p&a25二級指針變量pp一級指針變量p變量a第41頁/共62頁[例2]#include"stdio.h”main(){int**k,*j,i=100;j=&i;k=&j;printf("%d\n",**k);getch();}結(jié)果:100第42頁/共62頁main函數(shù)中的參數(shù)main函數(shù)也可以有參數(shù),它可以帶兩個參數(shù)。其一般形式為:
main(argc,argv)intargc;char*argv[];
其中第一個形參argc是一個整型變量,第二個形參argv是一個指針數(shù)組,其元素指向字符型數(shù)據(jù)。這兩個參數(shù)的值從那里傳遞而來呢?main()函數(shù)是主函數(shù),它不能被程序中其它函數(shù)調(diào)用,因此顯然不可能從其它函數(shù)向它傳遞所需的參數(shù)值,只能從程序以外傳遞而來。
main函數(shù)的參數(shù)傳遞是在命令行中,除了給出應(yīng)執(zhí)行的文件名外,再給出一個或多個字符串,作為傳遞該main函數(shù)的參數(shù)值。例如,從鍵盤輸入以下命令行:filecomputerenginish<Enter>第43頁/共62頁
main函數(shù)的參數(shù)傳遞規(guī)律與其它函數(shù)有所不同,并不是將file(文件名)傳遞給argc,將后面的computer和enginish傳遞給argv[]。而是將命令行中總的字符串的個數(shù)(包括文件名)傳遞給參數(shù)argc,上面的命令行中有三個字符串,即傳遞給argc的值為3;將命令行中第一個字符串(如file)的地址傳遞給指針數(shù)組argv中第0個元素argv[0],第二個字符串的地址傳給argv[1],依次類推。[例1]有如下main函數(shù)(其所在文件的源文件名為file1.c):#include"stdio.h”main(intargc,char*argv[]){inti=1;while(argc>1){printf("%s\n",argv[i]);--argc;i++;}}(file1.c)如果從鍵盤輸入的命令行為:file1Thisisaexample.則輸出為:(argc=5argv[0])Thisfile1isaexample.第44頁/共62頁[例2]編寫一個ren(換名)程序。#include"dir.h”#include"string.h”intmain(intargc,char*argv[]){charoldname[MAXPATH],newname[MAXPATH];if(argc>2){strcpy(oldname,argv[1]);strcpy(newname,argv[2]);}else{printf("use:jc12oldnamenewname\n");exit(1);}if(rename(oldname,newname)==0){puts("successful\n");exit(0);}else{printf("\nerror\n");exit(2);}return(0);}exren.c定義在dir.h中系統(tǒng)函數(shù)第45頁/共62頁指向結(jié)構(gòu)體類型數(shù)據(jù)的指針一、指向結(jié)構(gòu)體類型變量的指針[例]打印通訊錄。(excommu.c)二、指向結(jié)構(gòu)體數(shù)組的指針[例]用結(jié)構(gòu)指針建立一個圖書檢索系統(tǒng)。按書名檢索。(exsearch.c)三、結(jié)構(gòu)指針的使用[例]鏈表。鏈表的建立、遍歷、查找、插入、刪除操作。第46頁/共62頁2023/1/17枚舉類型Madebylut共用體類型位域類型別名第47頁/共62頁2023/1/17共用體(聯(lián)合)類型什么是共用體
結(jié)構(gòu)型數(shù)據(jù)類型;存儲形態(tài):共用體類型變量的若干分量分時(shí)共占同一存儲空間。例如:uniondata{inti;charc;longl;}com;com.i=10;com.c=‘A’;com.l=65535;
c
il00000000000000000000000000000000
00000000000010100000000000000000111111111111111101000001第48頁/共62頁2023/1/17共用體類型共用體類型及其變量的定義和引用
共用體類型及其變量的定義和引用與結(jié)構(gòu)體類似,本質(zhì)的不同在于使用內(nèi)存的方式。類型定義:union類型名
{數(shù)據(jù)類型變量名;數(shù)據(jù)類型變量名;
……}聯(lián)合變量名表;(或;結(jié)束)變量的定義:三種方式(同結(jié)構(gòu)提變量的定義方式)共用體變量的引用方式:(.或->)如前所示:com.I、com.c、com.l第49頁/共62頁[例1]
main()
{union{unsignedcharc;unsignedintI[4];}z;z.I[0]=65;
z.I[1]=66;printf(“%c\n”,z.c);
}結(jié)果:A第50頁/共62頁[例2]
main(){union{intI[2];longk;charc[4];}r,*s=&r;s->I[0]=0x39;s->[1]=0x38;printf(“%c\n”,s->c[0]);}
結(jié)果:9570560012398S->I[0]S->I[1]S->c[0]第51頁/共62頁2023/1/17
枚舉類型
什么是枚舉類型
枚舉是一組命名的整數(shù)常量,用以說明可能類型變量的所有合法值。定義類型形式:enum名字{枚舉列表}變量表;定義變量形式(三種方式)
枚舉類型的變量僅有幾個確定的值。例如:enumweekday{sun,mon,tue,wed,thu,fri,sat}workday;枚舉元素是常量,具有數(shù)值。按順序默認(rèn)為0,1,2,….;也可以在定義時(shí)按需求指定。如:enumcolor{red,green,blue=8,blank,white};第52頁/共62頁應(yīng)用舉例[例1]main(){enumlanguage{basic=3,assembly,ada=100,cobel,fortran97};
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人住宅裝修竣工驗(yàn)收合同7篇
- 2025年度物流行業(yè)農(nóng)民工勞動合同標(biāo)準(zhǔn)匯編3篇
- 2025年電梯設(shè)計(jì)與安裝一體化服務(wù)合同4篇
- 2025年度智能家居燈光系統(tǒng)承攬房屋裝修合同3篇
- 二零二四年度新員工培養(yǎng)計(jì)劃實(shí)施與監(jiān)督合同2篇
- 二零二五年度瓷磚產(chǎn)品研發(fā)與生產(chǎn)合作協(xié)議書3篇
- 2025年度鏟車租賃安全操作規(guī)范修訂合同4篇
- 2025年度家庭農(nóng)場土地流轉(zhuǎn)承包經(jīng)營合同樣本2篇
- 23年-24年項(xiàng)目安全培訓(xùn)考試題及參考答案【完整版】
- 2024項(xiàng)目部安全管理人員安全培訓(xùn)考試題附參考答案(精練)
- 2024年江西生物科技職業(yè)學(xué)院單招職業(yè)技能測試題庫帶解析答案
- 橋本甲狀腺炎-90天治療方案
- 《量化交易之門》連載27:風(fēng)險(xiǎn)的角度談收益MAR和夏普比率
- (2024年)安全注射培訓(xùn)課件
- 2024版《建設(shè)工程開工、停工、復(fù)工安全管理臺賬表格(流程圖、申請表、報(bào)審表、考核表、通知單等)》模版
- 部編版《道德與法治》六年級下冊教材分析萬永霞
- 粘液腺肺癌病理報(bào)告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語詞匯手冊列表
- 移動商務(wù)內(nèi)容運(yùn)營(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
評論
0/150
提交評論