疑難解答四PPT課件_第1頁
疑難解答四PPT課件_第2頁
疑難解答四PPT課件_第3頁
疑難解答四PPT課件_第4頁
疑難解答四PPT課件_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Hu Zhiwen, Ph.D, IEEE member疑難解答疑難解答(四四)Question Answer Insight溫州大學溫州大學 甌江學院甌江學院Copyright 2012, All rights reserved. Hu Zhiwen, 2021-12-62疑難解答疑難解答盤點知識點,舉一反三盤點知識點,舉一反三地址與指針地址與指針參數(shù)傳遞參數(shù)傳遞變量的存儲類別變量的存儲類別函數(shù)調(diào)用和宏調(diào)用函數(shù)調(diào)用和宏調(diào)用共用體共用體文件操作函數(shù)文件操作函數(shù)Hu Zhiwen, 2021-12-63地址與指針地址與指針地地 址址 2001 20022003 3000 內(nèi)存單元的內(nèi)容內(nèi)存單元的

2、內(nèi)容00100011 00100011 0001110100011101110011001100110000110011 00110011 CPUCPUBUSHu Zhiwen, 2021-12-64指針指針嚴格地說,一個指針是一個地址,是一嚴格地說,一個指針是一個地址,是一個常量。而一個指針變量卻可以被賦予個常量。而一個指針變量卻可以被賦予不同的指針值,是變量。但常把指針變不同的指針值,是變量。但常把指針變量簡稱為指針。量簡稱為指針。為了避免混淆,我們中約定:為了避免混淆,我們中約定:“指針指針”是指地址,是是指地址,是常量常量,“指針變量指針變量”是指是指取值為地址的取值為地址的變量變量。

3、定義指針的目的是為了通過指針去訪問定義指針的目的是為了通過指針去訪問內(nèi)存單元。內(nèi)存單元。Hu Zhiwen, 2021-12-65指針指針定定 義義含含 義義int i;定義整型變量定義整型變量iint *p;p為指向整型數(shù)據(jù)的指針變量為指向整型數(shù)據(jù)的指針變量int an;定義整型數(shù)組定義整型數(shù)組a,它有,它有n個元素個元素int *pn;指針數(shù)組指針數(shù)組p,由,由n個指向整型數(shù)據(jù)的指針元素組成個指向整型數(shù)據(jù)的指針元素組成int (*p)n;p為指向含為指向含n個元素的一維數(shù)組的指針變量個元素的一維數(shù)組的指針變量int f();f為帶回整型函數(shù)值的函數(shù)為帶回整型函數(shù)值的函數(shù)int *p();p

4、為帶回一個指針的函數(shù),該指針指向整型數(shù)據(jù)為帶回一個指針的函數(shù),該指針指向整型數(shù)據(jù)int (*p)();p為指向函數(shù)的指針,該函數(shù)返回一個整型值為指向函數(shù)的指針,該函數(shù)返回一個整型值int *p;p是一個指向一個指向整型數(shù)據(jù)的指針變量是一個指向一個指向整型數(shù)據(jù)的指針變量Hu Zhiwen, 2021-12-66指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)void main()void swap(int *p1,int *p2);int a,b;int *pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2

5、=&b;printf(n%d,%dn,*pointer_1,*pointer_2);if(ab) swap(pointer_1,pointer_2);printf(n%d,%dn,*pointer_1,*pointer_2);printf(n%d,%dn,a,b);getch();void swap(int *p1,int *p2)int temp; temp=*p1;*p1=*p2;*p2=temp;Hu Zhiwen, 2021-12-67指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)調(diào)用函數(shù)調(diào)用函數(shù):swap(x, y); 被調(diào)用函數(shù):被調(diào)用函數(shù):swap(int *a, int *b

6、)實參實參形參形參 x y 5 9 a b x y 5 9 a b 5 9 x y 5 9 swap(x,y)swap(a,b)調(diào)用前調(diào)用前 調(diào)用時調(diào)用時 調(diào)用后調(diào)用后 a b Hu Zhiwen, 2021-12-68小結小結指針變量作形參時,對應實參為數(shù)據(jù)類型與指針變量作形參時,對應實參為數(shù)據(jù)類型與該指針變量基類型相同的變量的地址。該指針變量基類型相同的變量的地址。指針變量作形參時,參數(shù)傳遞的形式仍然為指針變量作形參時,參數(shù)傳遞的形式仍然為值傳遞。調(diào)用函數(shù)時,形參與對應實參占據(jù)值傳遞。調(diào)用函數(shù)時,形參與對應實參占據(jù)著不同的存儲空間,形參存儲空間中存放的著不同的存儲空間,形參存儲空間中存放的

7、是對應實參的地址。是對應實參的地址。在函數(shù)調(diào)用過程中,通過對實參變量的間接在函數(shù)調(diào)用過程中,通過對實參變量的間接訪問,改變了對應實參的值。當函數(shù)調(diào)用完訪問,改變了對應實參的值。當函數(shù)調(diào)用完畢后,形參的存儲空間仍然被收回,但此時畢后,形參的存儲空間仍然被收回,但此時實參存儲空間中已經(jīng)保留了改變后的值,從實參存儲空間中已經(jīng)保留了改變后的值,從而解決了在被調(diào)用函數(shù)中改變調(diào)用函數(shù)中變而解決了在被調(diào)用函數(shù)中改變調(diào)用函數(shù)中變量的問題。量的問題。 Hu Zhiwen, 2021-12-69參數(shù)傳遞參數(shù)傳遞形式參數(shù)形式參數(shù)又稱為形參或虛參,它表示一個函數(shù)被調(diào)又稱為形參或虛參,它表示一個函數(shù)被調(diào)用時所需的一些必

8、要信息。事實上,形參是一種局用時所需的一些必要信息。事實上,形參是一種局部變量,它在函數(shù)被調(diào)用前并沒有被分配存儲空間,部變量,它在函數(shù)被調(diào)用前并沒有被分配存儲空間,也沒有具體的值。形參僅僅是一個也沒有具體的值。形參僅僅是一個“符號符號”。 實際參數(shù)實際參數(shù)又稱為實參,它是調(diào)用函數(shù)向被調(diào)用函數(shù)又稱為實參,它是調(diào)用函數(shù)向被調(diào)用函數(shù)提供的一些具體信息,可以是常量、變量或表達式,提供的一些具體信息,可以是常量、變量或表達式,它有具體的值。對于實參變量而言,它已經(jīng)被分配它有具體的值。對于實參變量而言,它已經(jīng)被分配了相應的存儲空間。了相應的存儲空間。 調(diào)用有參函數(shù)時,必須要提供與形參調(diào)用有參函數(shù)時,必須要

9、提供與形參相匹配相匹配的實參。的實參。所謂匹配是指實參與形參的個數(shù)相等,對應實參與所謂匹配是指實參與形參的個數(shù)相等,對應實參與形參的類型相同或賦值兼容。形參的類型相同或賦值兼容。 Hu Zhiwen, 2021-12-610參數(shù)傳遞參數(shù)傳遞在調(diào)用有參函數(shù)時,系統(tǒng)將會根據(jù)在調(diào)用有參函數(shù)時,系統(tǒng)將會根據(jù)形參的類型形參的類型為其為其分配存儲空間,而存儲空間中的內(nèi)容即分配存儲空間,而存儲空間中的內(nèi)容即形參的值形參的值,則來自調(diào)用函數(shù)所提供的則來自調(diào)用函數(shù)所提供的實參實參。當被調(diào)用函數(shù)執(zhí)行完畢返回調(diào)用函數(shù)時,當被調(diào)用函數(shù)執(zhí)行完畢返回調(diào)用函數(shù)時,形參形參的存的存儲空間又被系統(tǒng)收回,儲空間又被系統(tǒng)收回,形參

10、的值形參的值也就不復存在了。也就不復存在了。C語言中的參數(shù)傳遞通常是一種語言中的參數(shù)傳遞通常是一種單向的單向的“值傳遞值傳遞”。當實參為變量時,函數(shù)調(diào)用時僅僅是將當實參為變量時,函數(shù)調(diào)用時僅僅是將實參變量的值實參變量的值復制復制了一份交給了一份交給形參形參形參與對應實參的存儲空間完全不同,在函數(shù)調(diào)用過程中形參與對應實參的存儲空間完全不同,在函數(shù)調(diào)用過程中對形參的改變,根本不會影響到實參的值。對形參的改變,根本不會影響到實參的值。 Hu Zhiwen, 2021-12-611函數(shù)調(diào)用與參數(shù)傳遞函數(shù)調(diào)用與參數(shù)傳遞#includevoid swap(int a,int b); /*聲明函數(shù)原型聲明函

11、數(shù)原型*/void main() int x,y; x=10; y=20; printf(Before swapping: x=%d y=%dn,x,y); swap(x,y); /*調(diào)用函數(shù)調(diào)用函數(shù)*/ printf(After swapping:x=%d y=%dn,x,y);void swap(int a,int b) /*定義子函數(shù)定義子函數(shù)*/ int t; t=a; a=b; b=t; Hu Zhiwen, 2021-12-612函數(shù)調(diào)用與參數(shù)傳遞函數(shù)調(diào)用與參數(shù)傳遞調(diào)用函數(shù)調(diào)用函數(shù):swap(x, y); 被調(diào)用函數(shù):被調(diào)用函數(shù):swap(int a, int b)實參實參形參形參

12、 x y 10 20 a b x y 10 20 a b 10 20 x y 10 20 a b swap(x,y)swap(a,b)調(diào)用前調(diào)用前 調(diào)用時調(diào)用時 調(diào)用后調(diào)用后Hu Zhiwen, 2021-12-613數(shù)值傳遞方式數(shù)值傳遞方式特點:實參通過復制的方式傳遞給形參(占用不特點:實參通過復制的方式傳遞給形參(占用不同的內(nèi)存空間)同的內(nèi)存空間)調(diào)用函數(shù)的實參:給出具體數(shù)據(jù)調(diào)用函數(shù)的實參:給出具體數(shù)據(jù)地址傳遞方式地址傳遞方式特點:參數(shù)傳遞不是數(shù)據(jù)本身,而是數(shù)據(jù)的地址特點:參數(shù)傳遞不是數(shù)據(jù)本身,而是數(shù)據(jù)的地址(使用同一地址空間)(使用同一地址空間)調(diào)用函數(shù)的實參:一般是數(shù)組名或指針變量調(diào)用

13、函數(shù)的實參:一般是數(shù)組名或指針變量數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)實參地址實參地址 形參地址形參地址實參地址實參地址 20 形參地址形參地址20 20 Hu Zhiwen, 2021-12-614數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)數(shù)組可以作為函數(shù)的參數(shù)使用,進行數(shù)據(jù)傳數(shù)組可以作為函數(shù)的參數(shù)使用,進行數(shù)據(jù)傳送。數(shù)組用作函數(shù)參數(shù)有兩種形式送。數(shù)組用作函數(shù)參數(shù)有兩種形式:一種是把數(shù)組元素一種是把數(shù)組元素(下標變量下標變量)作為實參使用;作為實參使用;一種是把數(shù)組名作為函數(shù)的形參和實參使用。一種是把數(shù)組名作為函數(shù)的形參和實參使用。數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參數(shù)組元素:一個數(shù)組元素相當于一個變量,

14、數(shù)組元素:一個數(shù)組元素相當于一個變量,所以,數(shù)組元素可以用于函數(shù)參數(shù),用法與所以,數(shù)組元素可以用于函數(shù)參數(shù),用法與變量相同。采用傳遞數(shù)據(jù)方式。變量相同。采用傳遞數(shù)據(jù)方式。數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-615數(shù)組元素就是下標變量,它與普通變量并無數(shù)組元素就是下標變量,它與普通變量并無區(qū)別。區(qū)別。 因此它作為函數(shù)實參使用與普通變量因此它作為函數(shù)實參使用與普通變量是完全相同的。在發(fā)生函數(shù)調(diào)用時,把作為是完全相同的。在發(fā)生函數(shù)調(diào)用時,把作為實參的數(shù)組元素的值傳送給形參,實現(xiàn)單向?qū)崊⒌臄?shù)組元素的值傳送給形參,實現(xiàn)單向的值傳送。的值傳送。將數(shù)組元素當作變量來作為實參

15、使用將數(shù)組元素當作變量來作為實參使用傳值調(diào)用最多返回一個值傳值調(diào)用最多返回一個值數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)(contd)Hu Zhiwen, 2021-12-616判別一個整數(shù)數(shù)組中各元素的值,若大于判別一個整數(shù)數(shù)組中各元素的值,若大于0 則則輸出該值,若小于等于輸出該值,若小于等于0 則輸出則輸出0值。值。void nzp(int v) if(v0) printf(%d ,v); else printf(0); main()int a5,i;printf(Input 5 numbers:n);for(i=0;i5;i+) scanf(%d,&ai); nzp(ai);數(shù)組作為函

16、數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-617用用數(shù)組元素數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的作實參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,那么作為下標變量的數(shù)形參變量的類型一致,那么作為下標變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致組元素的類型也和函數(shù)形參變量的類型是一致的。因此,并不要求函數(shù)的形參也是下標變量。的。因此,并不要求函數(shù)的形參也是下標變量。換句話說,對數(shù)組元素的處理是按普通變量對換句話說,對數(shù)組元素的處理是按普通變量對待的。待的。用用數(shù)組名數(shù)組名作函數(shù)參數(shù)時,則要求形參和相對應作函數(shù)參數(shù)時,則要求形參和相對應的實參都必須是類型相同的數(shù)組,都必須有

17、明的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當形參和實參二者不一致時,確的數(shù)組說明。當形參和實參二者不一致時,即會發(fā)生錯誤。即會發(fā)生錯誤。數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-618在普通變量或下標變量作函數(shù)參數(shù)時,形參變在普通變量或下標變量作函數(shù)參數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的值傳送值傳送是把實是把實參變量的值賦予形參變量。參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,在用數(shù)組名作函數(shù)參數(shù)時,不是進行值的傳送不是進行值的傳送,

18、即不是把實參數(shù)組的每一個元素的值都賦予形即不是把實參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-619數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)main()void fun(float x3); float a5=3.5, 6.1, 0.2, 7.9; int i; fun(&a1); /*從第從第2個元素開始的連續(xù)個元素開始的連續(xù)3個地址個地址*/ for (i=0; i=4; i+)

19、printf(%4.1f, ai); getch();void fun(float x3)x0+=1; x1+=1; x2+=1; a0 a1 3.5 6.1 a2 a3 0.2 7.9 a4 0.0 x0 x1 x2 兩個數(shù)組共享內(nèi)存空間兩個數(shù)組共享內(nèi)存空間7.1 8.9 1.2 Hu Zhiwen, 2021-12-620數(shù)組名就是數(shù)組的首地址數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作。因此在數(shù)組名作函數(shù)參數(shù)時所進行的傳送只是地址的傳送,函數(shù)參數(shù)時所進行的傳送只是地址的傳送,也就是說把實參數(shù)組的首地址賦予形參數(shù)組也就是說把實參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地址之后,也就等名。形

20、參數(shù)組名取得該首地址之后,也就等于有了實在的數(shù)組。實際上是形參數(shù)組和實于有了實在的數(shù)組。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。在變量作函數(shù)參數(shù)時,所進行的在變量作函數(shù)參數(shù)時,所進行的值傳送是單值傳送是單向的向的。即只能從實參傳向形參,不能從形參。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參傳回實參。形參的初值和實參相同,而形參的值發(fā)生改變后,實參并不變化,兩者的終的值發(fā)生改變后,實參并不變化,兩者的終值是不同的。值是不同的。數(shù)據(jù)的傳送是如何實現(xiàn)的呢數(shù)據(jù)的傳送是如何實現(xiàn)的呢? ?Hu Zhiwen, 2021

21、-12-621而當用而當用數(shù)組名數(shù)組名作函數(shù)參數(shù)時,情況則不同。作函數(shù)參數(shù)時,情況則不同。由于實際上形參和實參為同一數(shù)組,因此當由于實際上形參和實參為同一數(shù)組,因此當形參數(shù)組發(fā)生變化時,實參數(shù)組也隨之變化。形參數(shù)組發(fā)生變化時,實參數(shù)組也隨之變化。當然這種情況不能理解為發(fā)生了當然這種情況不能理解為發(fā)生了“雙向雙向”的的值傳遞。但從實際情況來看,調(diào)用函數(shù)之后值傳遞。但從實際情況來看,調(diào)用函數(shù)之后實參數(shù)組的值將由于形參數(shù)組值的變化而變實參數(shù)組的值將由于形參數(shù)組值的變化而變化?;?。數(shù)據(jù)的傳送是如何實現(xiàn)的呢數(shù)據(jù)的傳送是如何實現(xiàn)的呢? ?Hu Zhiwen, 2021-12-622void nzp(int

22、 a5)int i; printf(nValues of array a are:n);for(i=0;i5;i+) if(ai0) ai=0; printf(%2d ,ai);main()int b5=1,-1,1,-1,1,i;printf(Initial values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);nzp(b);printf(nLast values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-62

23、3形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯誤。誤。在函數(shù)形參表中,允許不給出形參數(shù)組的長度,或用在函數(shù)形參表中,允許不給出形參數(shù)組的長度,或用一個變量來表示數(shù)組元素的個數(shù)。一個變量來表示數(shù)組元素的個數(shù)。多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時對形多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時對形參數(shù)組可以指定每一維的長度,也可省去第一維的長參數(shù)組可以指定每一維的長度,也可省去第一維的長度。度。形參數(shù)組和實參數(shù)組的長度可以不相同,因為在調(diào)用形參數(shù)組和實參數(shù)組的長度可以不相同,因為在調(diào)用時,只傳送首地址而不檢查形參數(shù)組的長度。當形參時,只傳送首地址

24、而不檢查形參數(shù)組的長度。當形參數(shù)組的長度與實參數(shù)組不一致時,雖不至于出現(xiàn)語法數(shù)組的長度與實參數(shù)組不一致時,雖不至于出現(xiàn)語法錯誤錯誤(編譯能通過編譯能通過),但程序執(zhí)行結果將與實際不符,但程序執(zhí)行結果將與實際不符,這是應予以注意的。這是應予以注意的。數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-624void nzp(int a, int n)int i; printf(nValues of array a are:n);for(i=0;in;i+) if(ai0) ai=0; printf(%2d ,ai);main()int b5=1,-1,1,-1,1,i;prin

25、tf(Initial values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);nzp(b,5);printf(nLast values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)Hu Zhiwen, 2021-12-625void nzp(int a8)int i; printf(nValues of array a are:n);for(i=0;i8;i+) if(ai0) ai=0; printf(%2d ,ai);main()int b5=1,-

26、1,1,-1,1,i;printf(Initial values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);nzp(b);printf(nLast values of array b are:n);for(i=0;i5;i+) printf(%2d ,bi);形參數(shù)組的長度與實參數(shù)組不一致形參數(shù)組的長度與實參數(shù)組不一致數(shù)組數(shù)組a中的中的a5、a6、a7值沒有意義值沒有意義思考:若將形參數(shù)組長度由思考:若將形參數(shù)組長度由8改為改為4呢?呢?Hu Zhiwen, 2021-12-626變量的存儲類別變量的存儲類別用戶存儲空間可以分為三個部分:

27、用戶存儲空間可以分為三個部分:動態(tài)存儲區(qū)動態(tài)存儲區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序區(qū)程序區(qū)Hu Zhiwen, 2021-12-627變量的存儲類別變量的存儲類別動態(tài)存儲區(qū)動態(tài)存儲區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序區(qū)程序區(qū) 在程序執(zhí)行過程中,靜在程序執(zhí)行過程中,靜態(tài)變量占據(jù)固定的存儲單態(tài)變量占據(jù)固定的存儲單元,而不動態(tài)地進行分配元,而不動態(tài)地進行分配和釋放。和釋放。 全局變量全部存放在靜全局變量全部存放在靜態(tài)存儲區(qū),在程序開始執(zhí)態(tài)存儲區(qū),在程序開始執(zhí)行時給全局變量分配存儲行時給全局變量分配存儲區(qū),程序行完畢就釋放。區(qū),程序行完畢就釋放。Hu Zhiwen, 2021-12-628變量的存儲類別變量的存儲類別動

28、態(tài)存儲區(qū)動態(tài)存儲區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序區(qū)程序區(qū)在函數(shù)開始調(diào)用時分配動在函數(shù)開始調(diào)用時分配動態(tài)存儲空間,函數(shù)結束時態(tài)存儲空間,函數(shù)結束時釋放這些空間。釋放這些空間。 函數(shù)形式參數(shù);函數(shù)形式參數(shù); 自動變量(未加自動變量(未加static 聲明的局部變量);聲明的局部變量); 函數(shù)調(diào)用時的現(xiàn)場保護函數(shù)調(diào)用時的現(xiàn)場保護和返回地址;和返回地址;Hu Zhiwen, 2021-12-629靜態(tài)變量靜態(tài)變量打印打印1 到到5 的階乘值。的階乘值。int fac(int n)static int f=1;f=f*n;return(f);main()int i;for(i=1;i=5;i+) printf

29、(%d!=%dn,i,fac(i);int fac(int n)int f=1;f=f*n;return(f);main()int i;for(i=1;i=5;i+) printf(%d!=%dn,i,fac(i);Hu Zhiwen, 2021-12-630register 變量變量局部靜態(tài)變量不能定義為寄存器變量。局部靜態(tài)變量不能定義為寄存器變量。int fac(int n)register int f=1;f=f*n;return(f);main()int i;for(i=1;i=5;i+) printf(%d!=%dn,i,fac(i);Hu Zhiwen, 2021-12-631小結

30、小結參數(shù)傳遞是一種單向的參數(shù)傳遞是一種單向的“值傳遞值傳遞”。當實參。當實參為變量時,函數(shù)調(diào)用時僅僅是將實參變量的為變量時,函數(shù)調(diào)用時僅僅是將實參變量的值復制了一份交給形參,形參與對應實參的值復制了一份交給形參,形參與對應實參的存儲空間完全不同,在函數(shù)調(diào)用過程中對形存儲空間完全不同,在函數(shù)調(diào)用過程中對形參的改變,根本不會影響到實參的值。但是參的改變,根本不會影響到實參的值。但是在函數(shù)中對形參數(shù)組所做改變,將間接改變在函數(shù)中對形參數(shù)組所做改變,將間接改變對應實參數(shù)組。對應實參數(shù)組。調(diào)用函數(shù)可能得到一個返回值外,當需要返調(diào)用函數(shù)可能得到一個返回值外,當需要返回多個數(shù)據(jù)時,可以考慮使用數(shù)組參數(shù),或回

31、多個數(shù)據(jù)時,可以考慮使用數(shù)組參數(shù),或者通過全局變量在函數(shù)之間共享數(shù)據(jù),此外,者通過全局變量在函數(shù)之間共享數(shù)據(jù),此外,通過靜態(tài)局部變量可以在同一函數(shù)前后兩次通過靜態(tài)局部變量可以在同一函數(shù)前后兩次調(diào)用之間傳遞數(shù)據(jù)。調(diào)用之間傳遞數(shù)據(jù)。Hu Zhiwen, 2021-12-632帶參的宏與帶參函數(shù)不同帶參的宏與帶參函數(shù)不同SQ(int y)return(y)*(y); main()int i=1;while(i=5) printf(%dn,SQ(i+);#define SQ(y) (y)*(y)main()int i=1;while(i=5) printf(%dn,SQ(i+);Hu Zhiwen,

32、2021-12-633函數(shù)調(diào)用和宏調(diào)用函數(shù)調(diào)用和宏調(diào)用輸入一個圓的半徑,輸出圓的面積。定義帶輸入一個圓的半徑,輸出圓的面積。定義帶參數(shù)的宏參數(shù)的宏S(r),程序如下,程序如下:#define PI 3.1415926535#define S(r) PI*r*rvoid main()float a=5.0, area;area = S(a); printf(r=%f area=%fn,a,area); 可解決無參數(shù)宏定義中,替換字符串中含有其他字可解決無參數(shù)宏定義中,替換字符串中含有其他字符,編譯時出現(xiàn)標識符(變量)未定義錯誤的情況。符,編譯時出現(xiàn)標識符(變量)未定義錯誤的情況。Hu Zhiwe

33、n, 2021-12-634函數(shù)調(diào)用和宏調(diào)用函數(shù)調(diào)用和宏調(diào)用函數(shù)調(diào)用函數(shù)調(diào)用宏調(diào)用宏調(diào)用 信息傳遞信息傳遞 實參的值或地址傳送實參的值或地址傳送給形參。給形參。 用實參的字符串替換形參。用實參的字符串替換形參。 內(nèi)存分配內(nèi)存分配程序運行時處理,分程序運行時處理,分配臨時內(nèi)存單元。配臨時內(nèi)存單元。 宏展開在預編譯時處理,宏展開在預編譯時處理,不存在分配內(nèi)存的問題。不存在分配內(nèi)存的問題。 參數(shù)類型參數(shù)類型 實參和形參類型一致。實參和形參類型一致。如不一致,編譯器進如不一致,編譯器進行類型轉換。行類型轉換。 作字符串替換,不存在參作字符串替換,不存在參數(shù)類型問題。數(shù)類型問題。 返回值返回值 可以有一

34、個返回值??梢杂幸粋€返回值。 作字符串替換,不存在返作字符串替換,不存在返回值問題?;刂祮栴}。 對源程序?qū)υ闯绦驘o影響。無影響。 宏展開后使程序加長。宏展開后使程序加長。 時間占用時間占用 占用程序運行時間。占用程序運行時間。 占用編譯時間。占用編譯時間。 Hu Zhiwen, 2021-12-635共用體應用舉例共用體應用舉例#include stdio.hunion Exstruct int x; int y; in; int a; int b;e;main()e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(%dn,e.in.x);

35、 printf(%dn,e.in.y); getch();Hu Zhiwen, 2021-12-636共用體應用舉例共用體應用舉例union Ex struct int x; int y; in; int a; int b;e;Hu Zhiwen, 2021-12-637共用體應用舉例共用體應用舉例union Ex struct int x; int y; in; int a; int b;e;e.in.xe.in.yHu Zhiwen, 2021-12-638共用體應用舉例共用體應用舉例union Ex struct int x; int y; in; int a; int b;e;e.in

36、.xe.in.ye.ae.b共同體共同體e占多少個字節(jié)?占多少個字節(jié)?Hu Zhiwen, 2021-12-639共用體應用舉例共用體應用舉例main() e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(%dn,e.in.x); printf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.bHu Zhiwen, 2021-12-640共用體應用舉例共用體應用舉例main() e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(%dn,e.in.x); p

37、rintf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.b111Hu Zhiwen, 2021-12-6412共用體應用舉例共用體應用舉例main() e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(%dn,e.in.x); printf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.b22Hu Zhiwen, 2021-12-6424共用體應用舉例共用體應用舉例main() e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; prin

38、tf(%dn,e.in.x); printf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.b44Hu Zhiwen, 2021-12-6434共用體應用舉例共用體應用舉例main() e.a=1; e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(%dn,e.in.x); printf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.b484Hu Zhiwen, 2021-12-644?共用體應用舉例共用體應用舉例main() e.b=2; e.a=1; e.in.x=e.a*e.b; e.i

39、n.y=e.a+e.b; printf(%dn,e.in.x); printf(%dn,e.in.y); getch();e.in.xe.in.ye.ae.b?Hu Zhiwen, 2021-12-645數(shù)據(jù)輸入數(shù)據(jù)輸入/輸出的概念輸出的概念數(shù)據(jù)輸入數(shù)據(jù)輸入/輸出是相對計算機內(nèi)存輸出是相對計算機內(nèi)存從鍵盤將數(shù)據(jù)輸入從鍵盤將數(shù)據(jù)輸入從數(shù)據(jù)文件讀入從數(shù)據(jù)文件讀入將數(shù)據(jù)輸出到屏幕將數(shù)據(jù)輸出到屏幕將數(shù)據(jù)輸出到將數(shù)據(jù)輸出到文件文件CON: 鍵盤或顯示器鍵盤或顯示器PRN: 打印機打印機設備文件設備文件Hu Zhiwen, 2021-12-646文件操作函數(shù)綜合示例文件操作函數(shù)綜合示例函數(shù)原型函數(shù)原型功能

40、功能返回值返回值int mkdir(const char *path) 建立名稱由建立名稱由path指定指定的目錄的目錄0:操作成功;操作成功;-1:操作失操作失敗敗FILE *fopen(char *fname,char *mode);以以mode指定的方式打指定的方式打開指定文件開指定文件成功,返回一個文件指成功,返回一個文件指針(文件信息區(qū)的起始針(文件信息區(qū)的起始地址);否則返回地址);否則返回0int fputs(char *str,FILE *fp);將將str指向的字符串輸指向的字符串輸出到出到fp指定文件中指定文件中0:操作成功;非操作成功;非0:操作操作失敗失敗int fclose(FILE *fp);關閉關閉fp指定的文件,指定的文件,釋放文件緩沖區(qū)釋放文件緩沖區(qū)0:操作成功;非操作成功;非0:操作操作失敗失敗int rename(char *oldname,char *newname);更改文件名更改文件名0:操作成功;操作成功;-1:操作失操作失敗敗int rmdir(char *path);刪除刪除path所指的目錄所指的目錄0:操作成功;操作成功;-1:操作失操作失敗敗Hu Zhiwen, 2021-12-647文件操作函數(shù)綜合示例文件操作函數(shù)綜合示例#include void main() FILE *fp

溫馨提示

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

評論

0/150

提交評論