函數在C語言是實現特定功能的一系列語句。當程序代碼達到一定規模之後,如果所有的功能還使用一個main函數中完成,那麼必将會出現代碼的冗餘和功能劃分不清晰等問題,極其不利于項目的管理。函數本身可以是獨立的功能,将相關的語句“彙集”到一起完成特定的功能,如果用戶在多個地方都需要使用這個功能,那麼直接調用這個已經現成的代碼就可以了,這樣的好處是:1.不需要将同一份代碼複制到不同的地方,這樣可以減少錯誤的發生;2.複用了已有開發成果,提高開發效率。本文将從函數的定義開始介紹函數的基本用法。
如何自己定義一個函數呢?首先明确下函數的構成要素,定義一個函數需要以下4個要素:
我們以下面的代碼為例,說明下函數的各個構成要素
圖1
圖1定義了一個名稱為sum的函數,它含有一個類型為int的參數,其返回值類型也為int,函數體實現了從0-n的數值相加,最後将這個相加的結果作為返回值。代碼第10行指定了函數的名稱為sum,函數名稱與其它的标識符命名規則相同。函數的參數個數可以根據實際需求指定,本例中隻使用了一個參數,對應圖1中代碼第10行,類型為int型,名稱為n。函數體位于第10-17行花括号内,其内的語句實現了這個函數的功能,經過代碼第11-14行運算後,第16行代碼将運算的結果使用return關鍵字返回,即這個函數運行完成之後會像其它的表達式一樣生成一個數值,這個數值的類型就是由函數的返回值類型所決定,本例中第10行代碼中的最左側的關鍵字int指明了這個函數的返回值類型為一個整型數值。
函數的4個要素在一些場景下可以進行“退化”或者說是說省略,比如,有的函數可以不使用參數(或稱為使用void型參數),有的函數可以返回值(也可以說是使用void型返回值),比如下面的代碼定義了一個顯示菜單功能的函數,它既沒有參數也沒有返回值,在函數體中隻是輸出一些内容至屏幕上的語句。
圖2
圖2中的函數定義中,參數列表(圓括号中的内容為空)也可以使用一個關鍵字void表示,就像返回值類型一樣,參數列表中的void關鍵字是可以省略的。但是對于函數的返回值類型void來說,它是必須存在的,一定不可以省略。
函數中的參數列表的功能是什麼?函數一個很重要的特性就是封裝了一些功能,但這些功能并非完全獨立工作,想要這些功能正常地運行,它需要“外界”提供給這個函數一些信息,這些信息就是通過函數列表來進行“通信”,函數獲得這些信息之後會根據這些信息計算出的對應的結果。就像圖1中定義的函數sum一樣,如果我們提供給這個函數的參數為3,那麼這個函數運行後的返回值就是6,而如果提供給這個函數的參數為5,那麼這個函數的返回值變為了15。這個參數就像是輸入的内容,函數的返回值就像是輸出的内容,函數本身就像一個執行運算的盒子。
函數體是整個函數的中心,它具體負責實現這個函數的功能,函數體定義了一系列的語句,或者是進行賦值,或者是進行判斷,或者是進行數學運算等待,這所有的操作就是為了完成這個函數所有實現的功能,比如圖1中的函數中的每一行代碼都是為了計算這n 1個數字之和而服務的。在函數體中,我們可以定義一些變量,構造一些表達式,也可以使用條件語句,循環語句等,當然也可以調用函數。需要注意的是函數的參數對于函數體來說可以認為是定義在函數體最前面的變量,這些變量的值被初始化為用戶調用這個函數時所指定的數值了,這些參數在函數的整個執行期間都是可以使用的。
函數的調用。如果隻是定義了一個函數,那麼這個函數是不會自動執行的,需要通過語句來調用這個函數,比如定義了圖1中的函數,使用下圖3中的方法調回用這個函數。
圖3
函數sum既包含參數列表,又有一個整型的返回值,那麼我們在調用這個函數的時候,就可以指定這個函數的名稱sum和參數10來執行這個函數,但是調用函數的時候需要将調用者傳遞參數(稱為實參,函數定義中的參數稱為形參)放置到圓括号内,如:sum(10);就可以完成函數的調用了,需要注意的是,對于sum這個函數而言,它是含有返回值的,如果調用這個函數時隻是讓其計算n 1個數值的和,而不去存儲這個數值其實沒有實際作用,返回值就是将運算後的結果交給調用者的數值,就像圖3中第32行代碼所示,通過一個賦值語句将sum(10)函數的返回值作為total變量的初始值,這個total的值就存放了0-10所有數字之和。
函數不僅僅是做一些數學計算,它還可以進行一些數據查找、排序或分析等操作,下面的代碼,我們定義一個數據查找功能的函數,名稱設置為find;形式參數(形參)設置為3個,第一個參數類型為int型,為待查找的數值,名稱為n,第二個參數為int型數組,為存放int數值的數組名稱,第三個參數為第二個參數數組大小,類型為int型;函數的返回值為一個int型,表示待查找的數值位于數組中的下标位置,-1表示在數組中沒有找到對應的數值。
圖4
圖4代碼定義了一個find函數,函數體主要代碼是一個for語句,它從數組的索引0開始,依次訪問數組中的每一個元素,通過數組中的元素與第一個參數n進行比較,如果二者相同,那麼就返回這個元素所對應的下标值,如果在整個數組中沒有找到對應的數值,那麼,代碼執行到第26行代碼,将返回數值-1。
這個函數定義,使用了三個參數,其中第二個參數為一個數組類型,它的寫法與數組的定義不同,數組定義時要麼提供數組元素個數,要麼提供初始化數組的值列表。而函數參數中的數組類型隻需要提供方括号即可表示這是一個數組,它的大小是通過另外一個參數額外指定。
這個函數的調用方式和圖1中sum函數的調用方式相類似,隻是二者的參數類型和個數有所區别,在測試代碼中我們首先創建了兩個變量,一個是待查找的數值v變量,另外一個是整型數組,數組初始化時設置一些整型數,之後調用find函數進行查找數值40是否存在于數組之中,如下:
圖5
函數調用的第三個參數,我們使用了數組大小操作符sizeof,它給出了數組a中整型數字的個數,這三個參數都按照find參數的要求傳入了正确的實參,調用這個函數之後,其返回值7就賦值到int型變量index中,這樣就完成了函數的調用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!