首頁  >  文章  >  後端開發  >  C語言自訂函數(圖文詳解)

C語言自訂函數(圖文詳解)

烟雨青岚
烟雨青岚轉載
2020-06-19 13:18:2517197瀏覽

C語言自訂函數(圖文詳解)

 函數的概念

#每個C程式至少有一個函數,即主函數 main() ,如果程式的任務比較簡單,全部的程式碼都寫在main()函數中,但是,在實際開發中,程式的任務往往比較複雜,如果全部的程式碼都寫在main()函數中,main()函數將非常龐大臃腫,結構複雜,程式碼重複。

我們可以根據程式的邏輯和任務的分工把程式碼分割到不同的自訂函數中,main()更關心業務邏輯和處理流程,需要執行具體任務的時候,呼叫這些自訂的函數就可以了。

為了方使理解,我們把函數分成兩種:一種是函式庫函數,一種是自訂函數。

函式是C語言提供的,或系統提供的,實作了某些基本的功能,例如scanf、printf,在程式中可以直接使用。

自訂函數是程式設計師為了完成某項任務而寫的函數,目的是為了實現某項的功能或讓主程式更簡潔。程式設計師在使用自訂函數之前,必須先聲明和定義。

 自訂函數的宣告

自訂函數宣告就是告訴編譯器函數名稱及如何呼叫函數,包含函數傳回值的數據類型、函數名稱、參數列表。

有些程式設計師也將函數宣告說成是函數原型,只是用字不同,意思是一樣的。

C語言中的宣告函數的語法如下:

       

傳回值的資料類型return_type:函數執行完任務後,可以傳回一個值,return_type是函數傳回的值的資料型別,可以是int、char、double或其它自訂的資料型別。有些函數只執行任務而不回傳值,在這種情況下,return_type用是關鍵字 void表示。

無傳回值的函數的宣告語法如下:

##       

函數名稱function_name: 函數名稱是標識符,命名規則與變數名稱的命名規則相同。

函數的參數清單parameter list:當函數被呼叫時,呼叫者需要傳遞值給函數的參數。參數清單包括參數的類型、順序。參數列表是可選的,也就是說,函數可以沒有參數。

無參數的函數的宣告語法如下:##       

##函數宣告範例:

       

#宣告了一個函數,回傳值是int類型,函數名稱是checksc,函數只有一個參數int height,注意,函數的聲明語句最後的分號不能少。

如果把自訂函數比喻成工具,函數的宣告就是這個工具的設計圖。

 自訂函數的定義

自訂函數是工具,如果想讓這個工具能被使用,光有設計圖還不行,要把工具製造出來,函數的定義就是這個工具的實體,提供了函數的實際主體,為了實現函數的功能,程式設計師為需要函數編寫程式碼。

C語言中的函數定義的語法如下:

 

函數定義的return_type、function_name和parameter list必須與函數宣告一致。

函數主體包含為了完成任務而需要執行語句的集合,放在花括號內。

範例:

  C語言自訂函數(圖文詳解)

 注意,不要在函數定義後面加分號,以下是錯誤的,初學者容易犯這種錯誤。

 C語言自訂函數(圖文詳解)

 自訂函數宣告和定義的方式

如果自訂函數只在呼叫者程式中使用,可以在呼叫者程式中聲明和定義,聲明一般為呼叫者程式的上部,定義一般在呼叫者程式的下部,這並不是C語言的規定,而是為了讓程式更方便閱讀,程式設計師約定的寫法。

自訂函數在呼叫者程式中宣告與定義的範例(book45.c):

 C語言自訂函數(圖文詳解)

在book45.c中,判斷超女身材的函數checksc不是公共的功能,只是選秀程式使用,所以宣告和定義在book45.c。

如果自訂函數是一個公共的函數模組,例如比較兩個數字的大小,就可以在其它的頭檔中宣告(如_public.h),呼叫者程式需要用#include預處理指令包含該函數宣告的頭檔。

如果自訂函數是一個公共的功能模組,就可以在其它的程式檔案中定義(如_public.c),編譯的時候,要把呼叫者程式和自訂函數的程式檔案一起編譯。

在以下的範例中,函數max在_public.h頭檔中聲明,在_public.c程式檔案中定義,在book46.c程式中被呼叫。

自訂函數的頭檔(_public.h):

 自訂函數的程式檔案(_public.c):

 C語言自訂函數(圖文詳解)

 呼叫者程式檔案(book46. c)

 C語言自訂函數(圖文詳解)

## 

 

###注意:#########1)###在book46.c的第6行######

這裡包含頭檔是用雙引號,不是尖括號。一般來說 #include 用來包含C語言提供的函式庫函數的頭文件,#include ""用來包含程式設計師自訂的頭檔。

2)編譯呼叫者程式的時候,把呼叫者程式和自定函數的程式檔案一起編譯。否則編譯的時候會出現以下錯誤。

 

 

正確的編譯指示應該是gcc -o book46 book46.c _public.c

#3)自訂函數的頭檔_public.h和_public.c的命名沒有規定,由程式設計師自己命名,就像變數的命名一樣,為了增加程式的可讀性,盡可能採用一些有意義的名稱。

函式庫函數

C語言提供了一些已宣告和定義的函數,呼叫這些函數可以完成一些基本的功能,我們把這些函數稱為C 標準函數(C standard library),簡稱函式庫函數,例如printf、scanf、memset、strcpy等。 CC語言的函式庫函數有幾百個,常用的不過十分之二三,不需要記住,在以後的章節中我將詳細介紹一些常用函式庫函數的使用,用多了就熟了。

C語言標準函式庫函數的宣告的頭檔存放在/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>

C語言函式庫函數的定義的文件是/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc.a(不同編譯器的版本目錄名有所不同),這是一個打包好的靜態連結庫文件,靜態連結庫的知識我們以後再介紹。

我們在用gcc編譯程式的時候並沒有把libgcc.a包含進來,那是因為gcc編譯器缺省會包含它,但是,程式設計師自訂函數的頭文件和程序文件就沒有這種待遇,需要手工的包含進來。

 需要包含哪些頭檔

我們在使用函式庫函數的時候,如果不包含它的頭文件,編譯時會出現警告,如下:

該包含哪些頭檔呢?有兩種方法,一是上百度上查資料,二是使用Linux系統提供的幫助,以strcpy函數為例,在命令列下輸入man strcpy回車,如下:  

C語言自訂函數(圖文詳解)

#man顯示了函數的宣告的頭檔(第5行),函數的參數、使用方法和傳回值。

注意了,如果程式中使用的沒有包含它頭檔的函式庫函數,編譯的時候不一定是警告,也可能是報錯,函數無法辨識等,這個要看編譯器,不同C語言的編譯器不一樣。

 呼叫函數的方法

#庫函數是系統宣告和定義的,是現成的工具。自訂函數是程式設計師自己聲明和定義的,是程式設計師補充的工具,不管是現成工具的還是補充的工具,都是工具,對使用者來說都一樣,沒有差別。

在C語言中,函數的呼叫非常靈活,可以獨佔一行語句,也可以當成常數賦值給變量,也可以當成函數的參數。

如果函數的回傳值是void,表示函數的任務以完成某項功能為主,一般用單行書寫,獨佔一條語句。

如果函数的返回值不是void,如果单行书写,表示不关心它的返回值,也可以当成常量用于任何表达式中。

例如:

 C語言自訂函數(圖文詳解)

 函数调用的过程

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行函数体的代码,当函数的返回语句被执行时,或到达函数的结束括号时,就把程序控制权交还给调用者程序。

示例(book47.c)

 C語言自訂函數(圖文詳解)

运行结果

 C語言自訂函數(圖文詳解)

 函数参数的传递

关于函数的参数,在很多教程中有很多说法,如“形参”、“实参”、“值传递”、“地址传递”、“引用”等,这些说法把简单的概念复杂化了,大家不必理会。

函数的参数可以理解为函数的局部变量,参数传递就是调用者程序把变量(或常量)的值复制一份给函数的参数,简单说来就是复制的过程。一旦完成数据的复制,调用者程序的变量和函数的参数就再也没有瓜葛了,所以,在函数调用的过程中,函数的参数的值发生改变并不会影响调用者程序的变量的值。

我们在调用函数的时候,不关心函数参数的名称,函数参数的名称是函数自己的事情,只在函数内部使用,与调用者无关。

示例(book48.c)

  C語言自訂函數(圖文詳解)

运行结果

  

 const约束

const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:

const  int  a = 10;

那么用 const 修饰后和未修饰前有什么区别呢?它们不都等于 10 吗?

用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

在变量前加const约束,主要用于定义函数的参数,表示该参数在函数中是只读取,不允许改变,如果函数中试图改变它的值,编译的时候就会报错。

例如:

   

函数max在声明的时候,参数a和b都加了const约束,在函数中,a=10;和b=20;这两代码试图改变a和b的值。编译的时候如下:

  

 编译无法通过。

 应用经验

在我的课程中,会介绍常用的库函数,但也有漏掉的。查资料是程序员的基本技能。

例如要查找C语言复制字符串功能的函数,在百度上输入“C语言复制字符串”搜索就可以了,你想查什么就输入什么。

       C語言自訂函數(圖文詳解)

然后,打开多几个网页看看,基本上就差不多了。

注意一个问题,网上的内容太多太杂乱,重点关注百度百科的文章。

1)测试函数的功能

要使用函数,只需要关注它需要包含的头文件、函数名、返回值、参数的数据类型和参数的顺序,不必关心参数的名称。

以strcpy函数为例,函数的声明如下。

    
char *strcpy(char *dest, const char *src);

函数名:strcpy

返回值:返回dest,一般没用,不理它。

第一个参数是目标字符串;第二个参数是源字符串,有const约束。

写代码测试一下:

char strname[50];
         strcpy(strname,"西施");
         printf("=%s=\n",strname);

然后,看看输出的结果是不是“=西施=”,用=号夹住输出的内容是为了看清楚有没有其它的字符。

感谢大家的阅读,希望大家收益多多。

本文转自:https://blog.csdn.net/wucz122140729/article/details/98369860

推荐教程:《C语言

以上是C語言自訂函數(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除