#函數 對於函數咱們能夠理解爲:函數其實就是實現某一功能的程序代碼塊;而一個完整的程序由不少函數構成; ##1、函數的基礎使用、定義 ###一、函數的基本定義 其實從咱們接觸語言開始咱們就已經在開始使用函數了,只是咱們一直不知道,每個程序的起始位置都是main函數,也就是咱們所謂了主函數;程序員
int main(int argc, char * argv[]) { }
這個就是每個程序的起始主函數,全部函數中最強的存在,若是你不信,你能夠去試試將任何一個程序的main函數刪除,看看會出現什麼問題呢!數組
###二、自定義函數 其實不少人在這個時候都會在腦海中浮現出一個問題,那就是爲何不少應用程序咱們找不到main函數呢?這個是由於通常來講,一個合格的程序員都會將在本身的程序寫在main函數當中的。那麼下邊咱們就來看看自定義的函數該怎麼定義:函數
int funtion (int a, int b){ return a + b; }
這是一個自定義的函數,咱們來分析下這個函數的結構:code
返回值類型 函數名稱(參數,參數……) { 函數體; return 返回值; }
經過上述分析咱們能夠得出,其實自定義的一個函數仍是很簡單的。在這些數據返回值類型
和參數
是視狀況而定的,也就是說若是你不須要有返回值那就將返回值類型改成void
,若是不須要參數那就直接將參數欄的()
中什麼也不寫便可。內存
注意:io
全部函數的建立都是建立在main函數的外部的,函數內部不能建立其餘函數;在建立函數時須要注意,建立函數的返回值類型和參數類型以及調用的變量類型必須爲一致的。
###三、外部函數和內部 其實在在程序中按照函數的使用權限咱們還將函數分爲了兩種,一種叫作外部函數,一種是內部函數,那麼什麼是外部函數,什麼是內部函數呢?下面咱們一塊兒來看看他們之間的區別和聯繫呢! ####3.1外部函數基礎
exeter
來修飾,只是通常咱們會將其關鍵詞省略掉!int sumFun (int a, int b) { return a + b; }
####3.2內部函數變量
static
來修飾。static int sumFun (int a ,int b) { return a + b; }
換一種方式理解,在使用函數時,只有在前面添加了修飾詞static
的就是內部函數,其他沒有添加任何修飾詞的都是外部函數,由於通常建立函數都是直接建立外部函數。權限
##2、函數的使用 ###一、基本使用 如今咱們已經自定義建好了一個本身想要使用的函數了,可是如何讓程序去執行這個自定義的函數{}
中的代碼塊呢? 函數本⾝的功能要達到就必須經過調⽤來實現,也就是說函數的代碼要執⾏就必須得調⽤這個函數,函數的調⽤通常直接或間接在main()函數中調⽤。 以前咱們也已經說了全部程序的啓動都必須從main函數開始,因此要想使用函數中的代碼塊,咱們就須要去main函數中調用了。那麼如何調用了,直接用代碼解釋:數據類型
int main () { float x = 3 ,y = 5 ; float sum = sumFunction(x, y); printf("%f + %f = %.2f\n", x, y, sum); return 0; } // 自定義的函數(也稱之爲函數的實現) float sumFunction(float a, float b) { float sum = a + b; return sum; }
經過上述代碼咱們能夠看出來,其實想要調用一個函數仍是比較簡單的,只須要在main函數中去用函數名直接調用就行了,可是若是你是像我這樣定義的函數,那麼即便你在main函數中調用了也不會直接實現的,由於你是將函數定義在main函數以後的,這樣程序從main函數中開始執行,卻找不到你本身自定義的這個函數。這個時候,咱們須要在main函數以前對咱們自定義的函數進行一個聲明。 ###二、函數的聲明
//聲明函數 float sumFunction(float a, float b);
將上述這串代碼放在Main函數以前,包函數以後,這樣就對咱們本身寫的函數進行了聲明,雖然咱們也能夠將本身的寫的函數放在main函數以前來書寫,可是一個合格的程序員通常都是不會將本身寫的函數放在main函數以前的。 注意:在調用函數時調用的變量名類型須要與函數中的返回值類型爲一致;
##3、數組做爲函數參數 當咱們在使用函數時,有時單一的一個參數沒法知足咱們的需求時,咱們每每會將多個數據放在數組中,用數組替代參數進行傳值,用數組替代參數進行傳值的建立其實與單一的數值參數傳值是同樣的。
void printfArray(int tempArray[], int len); int main () { // 值傳遞(相似克隆) 和 址傳遞(相似於影子) int array[] = {1, 3, 5, 7, 9}; int len = sizeof(array) / sizeof(int); //傳值參數 printfArray(array, len); printfArray(array, len); return 0; } void printfArray(int tempArray[], int len) { for (int i = 0; i < len; ++i) { printf("---%d---", rand()%900+100); printf("array[%d] = %d\n", i, tempArray[i]); tempArray[i] = 0; } }
數組名定義爲參數,將數組做爲實參時,在後面做爲函數的參數時填寫的都是形參,其調用只是爲了調用該數組;其在傳遞元素的過程當中傳遞的只是實參數組的地址符;其實質爲形參數組、實參數組共用同一數組的內存空間,將實參數組的首地址符傳給形參數組;
##4、系統中自帶的函數
咱們在本身自定義書寫函數時,也不要忘記,其實系統給咱們提供了不少強大的函數,下面咱們一塊兒來看看系統中給咱們提供的函數有哪些呢!
###一、求絕對值,abs()、fabs(),得導⼊<math.h>和<stdlib.h>
//abs(x)求整數的絕對值 int x = 10; int v = abs(x); //fabs(f)求浮點數的絕對值 double f = -34.234; double af = fabs(f);
###二、求次⽅方pow(x,y)、求平⽅方根sqrt(x),得導⼊<math.h>
//pow(x,y),求x的y次方 int value = pow(2,10); //sqrt(x)求x的平方根 int value_1 = sqrt(4);
###三、求正弦sin(x)、餘弦cos(x),導入<math.h>; rand()隨機整數,導⼊<stdlib.h>;在C語言中正弦,餘弦是不多使用的
//求正弦值sin(x);x爲弧度值 float value_2 = sin(x); //求餘弦值cos(x);x爲弧度值 float volue_3 = cos(x); //隨機生成一個0~MAX_RAND的整數 int ru = rand(); //隨機產生10之內的正整數 int tv = rand() % 10