第四講函數(shù)和指針_第1頁
第四講函數(shù)和指針_第2頁
第四講函數(shù)和指針_第3頁
第四講函數(shù)和指針_第4頁
第四講函數(shù)和指針_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四講函數(shù)和指針第一頁,共三十九頁,2022年,8月28日函數(shù)考點(diǎn)考核幾率分值函數(shù)的定義與返回值80%1~3庫函數(shù)60%1~2函數(shù)調(diào)用及形參與實(shí)參之間的數(shù)據(jù)傳遞(難點(diǎn))100%2~4函數(shù)的聲明60%0~1第二頁,共三十九頁,2022年,8月28日一、函數(shù)的定義1、函數(shù)定義功能單一且獨(dú)立的程序模塊,用于完成特定的任務(wù)并根據(jù)需要返回一個(gè)確定的值。2、函數(shù)定義的格式

返回值類型

函數(shù)名(類型1 形參名1,類型2形參名2,…){

說明部分

語句部分}首部+函數(shù)體第三頁,共三十九頁,2022年,8月28日3、注意事項(xiàng)(1)函數(shù)返回值類型名缺省時(shí),返回值類型默認(rèn)為int,無返回值時(shí)類型是void。(2)函數(shù)名和形參名是用戶標(biāo)識(shí)符。主函數(shù)的函數(shù)名必須為main。(3)函數(shù)名后面的括號(hào)“()”不能省。形參用于數(shù)據(jù)傳遞,可以缺省。(4)一對花括號(hào)中的內(nèi)容為函數(shù)體,包含兩部分:說明部分和語句部分。(5)函數(shù)不能嵌套定義。第四頁,共三十九頁,2022年,8月28日二、函數(shù)返回值return語句格式為:return(表達(dá)式);注意:(1)表達(dá)式可以不加括號(hào)。(2)表達(dá)式的值就是函數(shù)的返回值,類型應(yīng)和函數(shù)定義返回值的類型一致,否則系統(tǒng)強(qiáng)制轉(zhuǎn)換。(3)如果有多個(gè)return語句,則只有第一個(gè)起作用,因?yàn)橐坏┯龅絩eturn語句就會(huì)結(jié)束當(dāng)前函數(shù)的運(yùn)行。第五頁,共三十九頁,2022年,8月28日doublearea(doublea,doubleb){doubles;s=a*b;returns;}第六頁,共三十九頁,2022年,8月28日intmax(inta,intb){intc;if(a>b)c=a;else c=b;returnc;}第七頁,共三十九頁,2022年,8月28日例1intisprime(inta){inti;for(i=2;i<=a/2;i++)if(a%i==0);

;}第八頁,共三十九頁,2022年,8月28日三、庫函數(shù)C語言自己提供的函數(shù)稱為庫函數(shù)。在使用某一類庫函數(shù)的時(shí)候,需要在程序的開頭使用include命令包含頭文件。如,使用printf和scanf函數(shù)時(shí),開頭要加上#include<stdio.h>

使用數(shù)學(xué)函數(shù)類里的函數(shù)時(shí)開頭要加上#include“math.h”“”可以換成<>附錄五P190

第九頁,共三十九頁,2022年,8月28日四、函數(shù)調(diào)用1、函數(shù)調(diào)用的形式函數(shù)名(實(shí)參);說明:(1)不寫返回值類型和實(shí)參類型。(2)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)調(diào)用。(3)參數(shù)傳遞方向:實(shí)參→形參(單向)。(4)若函數(shù)返回值類型是void,則函數(shù)調(diào)用不能出現(xiàn)在表達(dá)式中,不能賦值給變量。(5)函數(shù)可以直接或間接的調(diào)用自己,稱為遞歸調(diào)用。第十頁,共三十九頁,2022年,8月28日函數(shù)數(shù)據(jù)的傳遞注意:(1)數(shù)據(jù)只能從實(shí)參單向傳到形參,無論形參值如何改變,都不會(huì)影響到對應(yīng)實(shí)參的值;(2)函數(shù)最多只能返回一個(gè)函數(shù)值。

形參在函數(shù)被調(diào)用時(shí)臨時(shí)分配存儲(chǔ)空間,一旦函數(shù)使用完畢,這些空間馬上被釋放。第十一頁,共三十九頁,2022年,8月28日voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d %d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d %d",a,b);}第十二頁,共三十九頁,2022年,8月28日2008年4月(12)以下程序的輸出結(jié)果是:

#include<stdio.h>voidfun(intx){if(x/2>0)fun(x/2);printf(“%d”,x);}main(){fun(3);printf(“\n”);}第十三頁,共三十九頁,2022年,8月28日五、函數(shù)的聲明1、函數(shù)聲明的形式返回值類型

函數(shù)名(類型1形參1,類型2 形參2,…);即在函數(shù)的首部加上分號(hào)。2、函數(shù)聲明的注意事項(xiàng)(1)可省略形參名,不可省略形參的類型。

如,doublearea(double,double);第十四頁,共三十九頁,2022年,8月28日(2)聲明時(shí)的參數(shù)名可與定義時(shí)的形參名相同,也可不同。

如,doublearea(doublex,doubley);(3)聲明的位置:在函數(shù)的內(nèi)部,該函數(shù)屬于私有函數(shù);如果在所有函數(shù)的外部,則屬于公有函數(shù)。3、函數(shù)的兩種使用方式(1)先定義,后調(diào)用。(2)先聲明,后調(diào)用,最后定義。第十五頁,共三十九頁,2022年,8月28日voidswap(intx,inty){intt; t=x;x=y;y=t; printf("%d%d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d%d",a,b);}main(){inta=3,b=4;voidswap(int,int); swap(a,b); printf("%d%d",a,b);}voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d%d",x,y);}第十六頁,共三十九頁,2022年,8月28日2008年4月(34)有以下程序

#include<stdio.h>intf(intx){inty;if(x==0||x==1)return(3);y=x*x-f(x-2);returny;}main(){intz;z=f(3);printf(“%d\n”,z);}程序的運(yùn)行結(jié)果是:A)0B)9C)6D)8第十七頁,共三十九頁,2022年,8月28日2007年9月試題分析(25)若函數(shù)調(diào)用時(shí)的實(shí)參為變量時(shí),以下關(guān)于函數(shù)形參和實(shí)參的敘述中正確的是 A)函數(shù)的實(shí)參和其對應(yīng)的形參共占同一存儲(chǔ)單元 B)形參只是形式上的存在,不占用具體存儲(chǔ)單元 C)同名的實(shí)參和形參占同一存儲(chǔ)單元 D)函數(shù)的形參和實(shí)參分別占用不同的存儲(chǔ)單元第十八頁,共三十九頁,2022年,8月28日(8)以下程序的運(yùn)行結(jié)果是

int

k=0;

voidfun(int

m)

{

m+=k;k+=m;printf(“m=%d\nk=%d

”,m,k++);}

main()

{inti=4;

fun(i++);printf(“i=%d

k=%d\n”,i,k);

}第十九頁,共三十九頁,2022年,8月28日指針考點(diǎn)考核幾率分值變量的地址和指針(難點(diǎn))60%2~4指針變量的定義、賦值和運(yùn)算等操作(難點(diǎn))100%4~8函數(shù)之間地址值的傳遞(難點(diǎn))70%2~5第二十頁,共三十九頁,2022年,8月28日一、指針變量的定義1.引言(1)變量的存儲(chǔ)過程:①在程序中定義一個(gè)變量;編譯時(shí),系統(tǒng)根據(jù)變量的類型,為變量分配一定的存儲(chǔ)空間;②內(nèi)存中每個(gè)字節(jié)都有唯一的一個(gè)編號(hào),這個(gè)編號(hào)就叫做這個(gè)字節(jié)的地址;相當(dāng)于旅館的房間號(hào);③每個(gè)變量在內(nèi)存中的第一個(gè)字節(jié)的編號(hào)就是該變量的地址;④

該空間中存放著變量的值,相當(dāng)于是旅客;第二十一頁,共三十九頁,2022年,8月28日eg:inta=5;則其內(nèi)存結(jié)構(gòu)圖為:變量a的地址為2001,對應(yīng)于“總統(tǒng)套房的”房間號(hào)是“401”;變量a的值為5,對應(yīng)于“總統(tǒng)套房”里的“值”是旅客;變量a的存儲(chǔ)空間數(shù)為4個(gè)字節(jié),對應(yīng)于“總統(tǒng)套房”有四個(gè)單間;a20012002200320045總統(tǒng)套房401402403404旅客第二十二頁,共三十九頁,2022年,8月28日(2)對內(nèi)存單元的訪問:1)直接訪問:已知變量a的地址,根據(jù)此地址直接對變量a的存儲(chǔ)空間進(jìn)行操作;2)間接訪問:事先不知道a的地址,知道a的地址放在存儲(chǔ)單元b中,而且已知存儲(chǔ)單元b的地址:①訪問存儲(chǔ)單元b,得到存儲(chǔ)單元a的地址;②由得到的地址,訪問存儲(chǔ)單元a,對a的值進(jìn)行操作;52001a直接訪問52001a20012008b間接訪問第二十三頁,共三十九頁,2022年,8月28日一個(gè)例子:我們要打開抽屜A有兩種方法:①.拿出A抽屜的鑰匙,直接打開抽屜A,拿出所需東西;②.拿出抽屜B的鑰匙,打開抽屜B,取出抽屜A的鑰匙;用抽屜A的鑰匙,打開抽屜A,取出所需東西;keyAA直接訪問keyAAKeyAkeyBB間接訪問第二十四頁,共三十九頁,2022年,8月28日2.指針變量的定義指針:用來存放地址的變量稱為指針變量。

指針就是地址。因此,一個(gè)指針變量的值就是某個(gè)變量的地址或稱為某變量的指針。格式:類型名*變量名;說明:*表示這是一個(gè)指針變量,變量名即為定義的指針變量名,類型名表示本指針變量只能用于存儲(chǔ)該數(shù)據(jù)類型的變量。eg:int*p,*q;char*ch;第二十五頁,共三十九頁,2022年,8月28日二級(jí)指針變量:類型名 **指針變量名;eg:int**p,*q;3.指針變量的賦值通過“&”運(yùn)算符給指針變量賦初值,“&”用于求變量的地址;inta=3,*p;p=&a;/*將變量a的地址賦給p,也說p指向變量a*/注:單目運(yùn)算符“&”只能和變量結(jié)合,不能放在表達(dá)式或常量的前面。3a2001P2001第二十六頁,共三十九頁,2022年,8月28日通過其他指針變量獲得地址值int*p,*q,a;p=&a;q=p;/*指針變量p和q都指向了a*/給指針變量賦空值

表示該指針變量不指向任何變量。p=NULL;

使用NULL時(shí),應(yīng)在程序前面先預(yù)定義:#include<stdio.h>注:不能通過空指針訪問一個(gè)存儲(chǔ)單元。

第二十七頁,共三十九頁,2022年,8月28日(真題)以下敘述中錯(cuò)誤的是 A)改變函數(shù)形參的值,不會(huì)改變對應(yīng)實(shí)參的值 B)函數(shù)可以返回地址值 C)可以給指針變量賦一個(gè)整數(shù)作為地址值

D)當(dāng)在程序的開頭包含頭文件stdio.h時(shí),可以給指針變量賦NULL第二十八頁,共三十九頁,2022年,8月28日4.引用存儲(chǔ)單元間接訪問運(yùn)算符:*含義:*p表示訪問p所指向變量的值。inta=3,*p;p=&a;*p=a;注意:第一行中的*p和第三行中的*p的區(qū)別*(&a)=*p=*&a.*與&優(yōu)先級(jí)相同,自右向左等價(jià)關(guān)系:

a,*p,*(&a)相等價(jià);&a,p,&(*p)相等價(jià);第二十九頁,共三十九頁,2022年,8月28日例1main(){inta=7,b=8,*p,*q,*r;p=&a;q=&b;r=p;p=q;q=r;printf(“%d,%d,%d\n”,*p,*q,a,b);}第三十頁,共三十九頁,2022年,8月28日5.指針的移動(dòng)移動(dòng)指針就是通過賦值運(yùn)算,使指針變量加上或減去一個(gè)整數(shù),使指針變量指向相鄰的存儲(chǔ)單元。eg:int*p;p=p+1;p

P+1……10001001100210031004100510061007第三十一頁,共三十九頁,2022年,8月28日5.指針的比較p>q:p所指單元在q之后;p<q:p所指單元在q之前。

pq

……a[0]a[1]a[2]a[3]a[4]……第三十二頁,共三十九頁,2022年,8月28日二、函數(shù)之間地址值的傳遞1、傳值調(diào)用與傳址調(diào)用(1)傳值:前面學(xué)習(xí)的普通變量作實(shí)參的函數(shù)調(diào)用便是傳值調(diào)用。形參改變時(shí)實(shí)參不變。(2)傳址:當(dāng)函數(shù)的形參為指針變量時(shí),則調(diào)用該函數(shù)時(shí),對應(yīng)的實(shí)參也必須是與形參基類型相同的地址值或指針變量,這種函數(shù)調(diào)用即傳址調(diào)用。形參變化時(shí),實(shí)參也會(huì)改變。第三十三頁,共三十九頁,2022年,8月28日voidswap(intx,inty){ intt; t=x;x=y;y=t; printf("%d %d",x,y);}main(){ inta=3,b=4; swap(a,b); printf("%d %d",a,b);}第三十四頁,共三十九頁,2022年,8月28日voidswap(int*a,int*b){ intt; t=*a;*a=*b;*b=t;}

main(){

inta=3,b=4; printf("(1)a=%d b=%d\n",a

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論