C语言自定义函数(图文详解)(循环队列及假溢出的现象图文详解)
函數(shù)的概念
每個(gè)C程序都至少有一個(gè)函數(shù),即主函數(shù) main() ,如果程序的任務(wù)比較簡(jiǎn)單,全部的代碼都寫在main()函數(shù)中,但是,在實(shí)際開(kāi)發(fā)中,程序的任務(wù)往往比較復(fù)雜,如果全部的代碼都寫在main()函數(shù)中,main()函數(shù)將非常龐大臃腫,結(jié)構(gòu)復(fù)雜,代碼重復(fù)。
我們可以根據(jù)程序的邏輯和任務(wù)的分工把代碼劃分到不同的自定義函數(shù)中,main()更關(guān)心業(yè)務(wù)邏輯和處理流程,需要執(zhí)行具體任務(wù)的時(shí)候,調(diào)用這些自定義的函數(shù)就可以了。
為了方使理解,我們把函數(shù)分為兩種:一種是庫(kù)函數(shù),一種是自定義函數(shù)。
庫(kù)函數(shù)是C語(yǔ)言提供的,或系統(tǒng)提供的,實(shí)現(xiàn)了某些基本的功能,例如scanf、printf,在程序中可以直接使用。
自定義函數(shù)是程序員為了完成某項(xiàng)任務(wù)而編寫的函數(shù),目的是為了實(shí)現(xiàn)某項(xiàng)的功能或讓主程序更簡(jiǎn)潔。程序員在使用自定義函數(shù)之前,必須先聲明和定義。
自定義函數(shù)的聲明
自定義函數(shù)聲明就是告訴編譯器函數(shù)名稱及如何調(diào)用函數(shù),包括函數(shù)返回值的數(shù)據(jù)類型、函數(shù)名稱、參數(shù)列表。
有些程序員也將函數(shù)聲明說(shuō)成是函數(shù)原型,只是用詞不同,意思是一樣的。
C語(yǔ)言中的聲明函數(shù)的語(yǔ)法如下:
返回值的數(shù)據(jù)類型return_type:函數(shù)執(zhí)行完任務(wù)后,可以返回一個(gè)值,return_type是函數(shù)返回的值的數(shù)據(jù)類型,可以是int、char、double或其它自定義的數(shù)據(jù)類型。有些函數(shù)只執(zhí)行任務(wù)而不返回值,在這種情況下,return_type用是關(guān)鍵字 void表示。
無(wú)返回值的函數(shù)的聲明語(yǔ)法如下:
函數(shù)名稱function_name:函數(shù)名稱是標(biāo)識(shí)符,命名規(guī)則與變量名稱的命名規(guī)則相同。
函數(shù)的參數(shù)列表parameter list:當(dāng)函數(shù)被調(diào)用時(shí),調(diào)用者需要向函數(shù)的參數(shù)傳遞值。參數(shù)列表包括參數(shù)的類型、順序。參數(shù)列表是可選的,也就是說(shuō),函數(shù)可以沒(méi)有參數(shù)。
無(wú)參數(shù)的函數(shù)的聲明語(yǔ)法如下:
函數(shù)聲明示例:
聲明了一個(gè)函數(shù),返回值是int類型,函數(shù)名是checksc,函數(shù)只有一個(gè)參數(shù)int height,注意,函數(shù)的聲明語(yǔ)句最后的分號(hào)不能少。
如果把自定義函數(shù)比喻成工具,函數(shù)的聲明就是這個(gè)工具的設(shè)計(jì)圖紙。
自定義函數(shù)的定義
自定義函數(shù)是工具,如果想讓這個(gè)工具能被使用,光有設(shè)計(jì)圖紙還不行,要把工具制造出來(lái),函數(shù)的定義就是這個(gè)工具的實(shí)體,提供了函數(shù)的實(shí)際主體,為了實(shí)現(xiàn)函數(shù)的功能,程序員為需要函數(shù)編寫代碼。
C語(yǔ)言中的函數(shù)定義的語(yǔ)法如下:
函數(shù)定義的return_type、function_name和parameter list必須與函數(shù)聲明一致。
函數(shù)主體包含為了完成任務(wù)需要執(zhí)行語(yǔ)句的集合,放在花括號(hào)內(nèi)。
示例:
注意,不要在函數(shù)定義后面加分號(hào),以下是錯(cuò)誤的,初學(xué)者容易犯這種錯(cuò)誤。
自定義函數(shù)聲明和定義的方式
如果自定義函數(shù)只在調(diào)用者程序中使用,可以在調(diào)用者程序中聲明和定義,聲明一般為調(diào)用者程序的上部,定義一般在調(diào)用者程序的下部,這并不是C語(yǔ)言的規(guī)定,而是為了讓程序更方便閱讀,程序員約定的寫法。
自定義函數(shù)在調(diào)用者程序中聲明和定義的示例(book45.c):
在book45.c中,判斷超女身材的函數(shù)checksc不是公共的功能,只是選秀程序使用,所以聲明和定義在book45.c中。
如果自定義函數(shù)是一個(gè)公共的功能模塊,例如比較兩個(gè)數(shù)的大小,就可以在其它的頭文件中聲明(如_public.h),調(diào)用者程序需要用#include預(yù)處理指令包含該函數(shù)聲明的頭文件。
如果自定義函數(shù)是一個(gè)公共的功能模塊,就可以在其它的程序文件中定義(如_public.c),編譯的時(shí)候,要把調(diào)用者程序和自定義函數(shù)的程序文件一起編譯。
在以下的示例中,函數(shù)max在_public.h頭文件中聲明,在_public.c程序文件中定義,在book46.c程序中被調(diào)用。
自定義函數(shù)的頭文件(_public.h):
自定義函數(shù)的程序文件(_public.c):
調(diào)用者程序文件(book46.c)
編譯命令如下:
注意:
1)在book46.c的第6行
,
這里包含頭文件是用雙引號(hào),不是尖括號(hào)<>。一般來(lái)說(shuō) #include <> 用于包含C語(yǔ)言提供的庫(kù)函數(shù)的頭文件,#include ""用于包含程序員自定義的頭文件。
2)編譯調(diào)用者程序的時(shí)候,把調(diào)用者程序和自定函數(shù)的程序文件一起編譯。否則編譯的時(shí)候會(huì)出現(xiàn)以下錯(cuò)誤。
正確的編譯指令應(yīng)該是gcc -o book46 book46.c _public.c
3)自定義函數(shù)的頭文件_public.h和_public.c的命名沒(méi)有規(guī)定,由程序員自己命名,就像變量的命名一樣,為了增加程序的可讀性,盡可能采用一些有意義的名稱。
庫(kù)函數(shù)
C語(yǔ)言提供了一些已聲明和定義的函數(shù),調(diào)用這些函數(shù)可以完成一些基本的功能,我們把這些函數(shù)稱為C 標(biāo)準(zhǔn)函數(shù)(C standard library),簡(jiǎn)稱庫(kù)函數(shù),例如printf、scanf、memset、strcpy等。CC語(yǔ)言的庫(kù)函數(shù)有幾百個(gè),常用的不過(guò)十分之二三,不需要記住,在以后的章節(jié)中我將詳細(xì)介紹一些常用庫(kù)函數(shù)的使用,用多了就熟了。
C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)的聲明的頭文件存放在/usr/include目錄中,如下:
<asset.h> <ctype.h> <errno.h> <float.h> <limits.h>
<locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h>
<stddef.h> <stdlib.h> <stdio.h> <string.h> <time.h>
登錄后復(fù)制
C語(yǔ)言庫(kù)函數(shù)的定義的文件是/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc.a(不同編譯器的版本目錄名有所不同),這是一個(gè)打包好的靜態(tài)鏈接庫(kù)文件,靜態(tài)鏈接庫(kù)的知識(shí)我們以后再介紹。
我們?cè)谟胓cc編譯程序的時(shí)候并沒(méi)有把libgcc.a包含進(jìn)來(lái),那是因?yàn)間cc編譯器缺省會(huì)包含它,但是,程序員自定義函數(shù)的頭文件和程序文件就沒(méi)有這種待遇,需要手工的包含進(jìn)來(lái)。
需要包含哪些頭文件
我們?cè)谑褂脦?kù)函數(shù)的時(shí)候,如果不包含它的頭文件,編譯時(shí)會(huì)出現(xiàn)警告,如下:
該包含哪些頭文件呢?有兩種方法,一是上百度上查資料,二是使用Linux系統(tǒng)提供的幫助,以strcpy函數(shù)為例,在命令行下輸入man strcpy回車,如下:
man顯示了函數(shù)的聲明的頭文件(第5行),函數(shù)的參數(shù)、使用方法和返回值。
注意了,如果程序中使用的沒(méi)有包含它頭文件的庫(kù)函數(shù),編譯的時(shí)候不一定是警告,也可能是報(bào)錯(cuò),函數(shù)無(wú)法識(shí)別等,這個(gè)要看編譯器,不同C語(yǔ)言的編譯器不一樣。
調(diào)用函數(shù)的方法
庫(kù)函數(shù)是系統(tǒng)聲明和定義的,是現(xiàn)成的工具。自定義函數(shù)是程序員自己聲明和定義的,是程序員補(bǔ)充的工具,不管是現(xiàn)成工具的還是補(bǔ)充的工具,都是工具,對(duì)使用者來(lái)說(shuō)都一樣,沒(méi)有區(qū)別。
在C語(yǔ)言中,函數(shù)的調(diào)用非常靈活,可以獨(dú)占一行語(yǔ)句,也可以當(dāng)成常量賦值給變量,也可以當(dāng)成函數(shù)的參數(shù)。
如果函數(shù)的返回值是void,表示該函數(shù)的的任務(wù)以完成某項(xiàng)功能為主,一般用單行書寫,獨(dú)占一條語(yǔ)句。
如果函數(shù)的返回值不是void,如果單行書寫,表示不關(guān)心它的返回值,也可以當(dāng)成常量用于任何表達(dá)式中。
例如:
函數(shù)調(diào)用的過(guò)程
當(dāng)程序調(diào)用函數(shù)時(shí),程序控制權(quán)會(huì)轉(zhuǎn)移給被調(diào)用的函數(shù)。被調(diào)用的函數(shù)執(zhí)行函數(shù)體的代碼,當(dāng)函數(shù)的返回語(yǔ)句被執(zhí)行時(shí),或到達(dá)函數(shù)的結(jié)束括號(hào)時(shí),就把程序控制權(quán)交還給調(diào)用者程序。
示例(book47.c)
運(yùn)行結(jié)果
函數(shù)參數(shù)的傳遞
關(guān)于函數(shù)的參數(shù),在很多教程中有很多說(shuō)法,如“形參”、“實(shí)參”、“值傳遞”、“地址傳遞”、“引用”等,這些說(shuō)法把簡(jiǎn)單的概念復(fù)雜化了,大家不必理會(huì)。
函數(shù)的參數(shù)可以理解為函數(shù)的局部變量,參數(shù)傳遞就是調(diào)用者程序把變量(或常量)的值復(fù)制一份給函數(shù)的參數(shù),簡(jiǎn)單說(shuō)來(lái)就是復(fù)制的過(guò)程。一旦完成數(shù)據(jù)的復(fù)制,調(diào)用者程序的變量和函數(shù)的參數(shù)就再也沒(méi)有瓜葛了,所以,在函數(shù)調(diào)用的過(guò)程中,函數(shù)的參數(shù)的值發(fā)生改變并不會(huì)影響調(diào)用者程序的變量的值。
我們?cè)谡{(diào)用函數(shù)的時(shí)候,不關(guān)心函數(shù)參數(shù)的名稱,函數(shù)參數(shù)的名稱是函數(shù)自己的事情,只在函數(shù)內(nèi)部使用,與調(diào)用者無(wú)關(guān)。
示例(book48.c)
運(yùn)行結(jié)果
const約束
const 是 constant 的縮寫,意思是“恒定不變的”!它是定義只讀變量的關(guān)鍵字,或者說(shuō) const 是定義常變量的關(guān)鍵字。用 const 定義常變量的方法很簡(jiǎn)單,就在通常定義變量時(shí)前面加 const 即可,如:
const int a = 10;
登錄后復(fù)制
那么用 const 修飾后和未修飾前有什么區(qū)別呢?它們不都等于 10 嗎?
用 const 定義的變量的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。所以說(shuō)它定義的是只讀變量。這也就意味著必須在定義的時(shí)候就給它賦初值。
在變量前加const約束,主要用于定義函數(shù)的參數(shù),表示該參數(shù)在函數(shù)中是只讀取,不允許改變,如果函數(shù)中試圖改變它的值,編譯的時(shí)候就會(huì)報(bào)錯(cuò)。
例如:
函數(shù)max在聲明的時(shí)候,參數(shù)a和b都加了const約束,在函數(shù)中,a=10;和b=20;這兩代碼試圖改變a和b的值。編譯的時(shí)候如下:
編譯無(wú)法通過(guò)。
應(yīng)用經(jīng)驗(yàn)
在我的課程中,會(huì)介紹常用的庫(kù)函數(shù),但也有漏掉的。查資料是程序員的基本技能。
例如要查找C語(yǔ)言復(fù)制字符串功能的函數(shù),在百度上輸入“C語(yǔ)言復(fù)制字符串”搜索就可以了,你想查什么就輸入什么。
然后,打開(kāi)多幾個(gè)網(wǎng)頁(yè)看看,基本上就差不多了。
注意一個(gè)問(wèn)題,網(wǎng)上的內(nèi)容太多太雜亂,重點(diǎn)關(guān)注百度百科的文章。
1)測(cè)試函數(shù)的功能
要使用函數(shù),只需要關(guān)注它需要包含的頭文件、函數(shù)名、返回值、參數(shù)的數(shù)據(jù)類型和參數(shù)的順序,不必關(guān)心參數(shù)的名稱。
以strcpy函數(shù)為例,函數(shù)的聲明如下。
char *strcpy(char *dest, const char *src);
登錄后復(fù)制
函數(shù)名:strcpy
返回值:返回dest,一般沒(méi)用,不理它。
第一個(gè)參數(shù)是目標(biāo)字符串;第二個(gè)參數(shù)是源字符串,有const約束。
寫代碼測(cè)試一下:
char strname[50];
strcpy(strname,"西施");
printf("=%s=\n",strname);
登錄后復(fù)制
然后,看看輸出的結(jié)果是不是“=西施=”,用=號(hào)夾住輸出的內(nèi)容是為了看清楚有沒(méi)有其它的字符。
感謝大家的閱讀,希望大家收益多多。
本文轉(zhuǎn)自:https://blog.csdn.net/wucz122140729/article/details/98369860
推薦教程:《C語(yǔ)言》
以上就是C語(yǔ)言自定義函數(shù)(圖文詳解)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注風(fēng)君子博客其它相關(guān)文章!
總結(jié)
以上是生活随笔為你收集整理的C语言自定义函数(图文详解)(循环队列及假溢出的现象图文详解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python七段数码管绘制单个数字_#P
- 下一篇: 手机8g128g是什么意思(手机大全手机