房地產(chǎn)網(wǎng)站建設(shè)與優(yōu)化分析北京seo專業(yè)團(tuán)隊(duì)
系列文章目錄
?第一章?“C“滸傳——初識(shí)C語(yǔ)言(更適合初學(xué)者體質(zhì)哦!)
?第二章?詳細(xì)認(rèn)識(shí)分支語(yǔ)句和循環(huán)語(yǔ)句以及他們的易錯(cuò)點(diǎn)?
?第三章??初階C語(yǔ)言——特別詳細(xì)地介紹函數(shù)
目錄
系列文章目錄
前言
一、函數(shù)是個(gè)什么鬼東西?
?二、C語(yǔ)言中函數(shù)的分類:
2.1 庫(kù)函數(shù)
2.1.1 如何學(xué)會(huì)使用庫(kù)函數(shù)?
2.1.2 來(lái)通過(guò)學(xué)幾個(gè)庫(kù)函數(shù)進(jìn)行如何學(xué)會(huì)庫(kù)函數(shù)
pow(pow函數(shù)詳解)
?strcpy(strcpy函數(shù)詳解)
memset(memset函數(shù)詳解?)
?2.2 自定義函數(shù)
三、函數(shù)的參數(shù)
3.1 實(shí)際參數(shù)(實(shí)參):
3.2 形式參數(shù)(形參)?:
四、函數(shù)的調(diào)用
?4.1 傳值調(diào)用
?4.2 傳址調(diào)用
五、函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)
5.1 嵌套調(diào)用
5.2 鏈?zhǔn)皆L問(wèn)
六、函數(shù)的聲明和定義
6.1 函數(shù)聲明:
6.2 函數(shù)定義:
七、函數(shù)遞歸
7.1 什么是遞歸
7.2 遞歸的兩個(gè)必要條件
總結(jié)
前言
???????在第一章內(nèi),我們學(xué)習(xí)了C語(yǔ)言究竟是什么以及到底講了什么;而在第二章內(nèi),我們?cè)敿?xì)地學(xué)習(xí)了分支語(yǔ)句與循環(huán)語(yǔ)句,了解了C語(yǔ)言的一部分語(yǔ)句,而在這一章,小編我要帶大家進(jìn)行函數(shù)的學(xué)習(xí),因?yàn)楹瘮?shù)這一部分在C語(yǔ)言中也是及其重要的一部分。
???????從標(biāo)題也能看出來(lái),我們有要進(jìn)行超詳細(xì)地介紹函數(shù),那么我就開始了我的表演。
一、函數(shù)是個(gè)什么鬼東西?
???????在數(shù)學(xué)中,我們也總是在學(xué)習(xí)函數(shù),而數(shù)學(xué)中的函數(shù)是反映的是自變量與因變量的一一對(duì)應(yīng)關(guān)系;雖然你們可能知道數(shù)學(xué)中的函數(shù),但你們了解C語(yǔ)言中的函數(shù)嗎?在C語(yǔ)言中,對(duì)函數(shù)的概念是子程序。
在維基百科中對(duì)函數(shù)的定義:子程序:
?二、C語(yǔ)言中函數(shù)的分類:
1)庫(kù)函數(shù)
2)自定義函數(shù)
????????在小編看來(lái),每一種函數(shù)都很重要,所以要學(xué)好每一種函數(shù),那么接下來(lái),就跟隨小編我的步伐進(jìn)行學(xué)習(xí)吧!
2.1 庫(kù)函數(shù)
為什么會(huì)有庫(kù)函數(shù)呢?
???????像上面我們描述的基礎(chǔ)功能,他們不是業(yè)務(wù)性的代碼。我們?cè)陂_發(fā)過(guò)程中每個(gè)程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語(yǔ)言的基礎(chǔ)庫(kù)中提供了一系列類似的庫(kù)函數(shù),方便程序員進(jìn)行軟件開發(fā)。?
在上面畫橫線的語(yǔ)句,小編提出一個(gè)問(wèn)題:庫(kù)函數(shù)是由誰(shuí)編寫的?
??????
?庫(kù)函數(shù)真的是由C語(yǔ)言提供的嗎?答案是不是的。庫(kù)函數(shù)是C語(yǔ)言標(biāo)準(zhǔn)中約定好,然后由編譯器的廠商提供實(shí)現(xiàn)的。?
???????如果這段話,讀者不理解的話,下面,小編我給大家舉個(gè)例子:
C語(yǔ)言標(biāo)準(zhǔn)規(guī)定:
1)函數(shù)的功能——求字符串的長(zhǎng)度;
2)函數(shù)的名字——strlen;
3)函數(shù)的參數(shù)——const char* str;
4)函數(shù)的返回類型——size_t。
???????A編譯器廠商與B編譯器廠商都會(huì)按照C語(yǔ)言標(biāo)準(zhǔn)規(guī)定去制作功能,名字,參數(shù),返回類型相同的函數(shù)去完成這個(gè)功能,但是函數(shù)內(nèi)部如何實(shí)現(xiàn)的是不完全相同的,這就是庫(kù)函數(shù)的產(chǎn)生。?
?在了解完庫(kù)函數(shù)的由來(lái)后,小編進(jìn)行簡(jiǎn)單的總結(jié)一下C語(yǔ)言常用的庫(kù)函數(shù)都有:
IO函數(shù)(輸入/輸出函數(shù)):scanf,printf
字符串操作函數(shù):strlen,strcmp,strcpy
字符操作函數(shù):tolower,toupper
內(nèi)存操作函數(shù):malloc,calloc,realloc,free
時(shí)間/日期函數(shù):time,srand,rand
數(shù)字函數(shù):cos,pow,sin其他庫(kù)函數(shù):.......
???????將庫(kù)函數(shù)分類,是一個(gè)主題一個(gè)主題的,一個(gè)主題的一系列的庫(kù)函數(shù)都會(huì)放在一個(gè)頭文件中。?
注釋:但是庫(kù)函數(shù)必須知道的一個(gè)秘密就是:使用庫(kù)函數(shù),必須包含#include對(duì)應(yīng)的頭文件。?
2.1.1 如何學(xué)會(huì)使用庫(kù)函數(shù)?
這些庫(kù)函數(shù)不需要全部記住,需要學(xué)會(huì)查詢工具的使用:
MSDN(Microsoft Developer Network)
?http://www.cplusplus.com
?http://en.cppreference.com?(英文版)
?http://zh.cpprefrrence.com? (中文版)
2.1.2 來(lái)通過(guò)學(xué)幾個(gè)庫(kù)函數(shù)進(jìn)行如何學(xué)會(huì)庫(kù)函數(shù)
???????學(xué)習(xí)一個(gè)函數(shù),先看函數(shù)名字,再看函數(shù)功能,接著看函數(shù)參數(shù),最后看函數(shù)返回類型。接下來(lái),基本都是這樣進(jìn)行學(xué)習(xí)庫(kù)函數(shù)的。
pow(pow函數(shù)詳解)
?第一個(gè),首先學(xué)一個(gè)pow函數(shù)。從名字上,我們可以看出這是一個(gè)求次方的函數(shù)。
???????這個(gè)函數(shù)的參數(shù)類型都是double類型,說(shuō)明int類型,float類型都可以使用;而要注意一下這個(gè)函數(shù)的返回值為double類型,如果不想讓編譯器警告的話,就進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
?
?
?千萬(wàn)別忘了這個(gè)要引用這個(gè)庫(kù)函數(shù)的頭文件。?
下面進(jìn)行代碼學(xué)習(xí):
#include <stdio.h>
#include <math.h>
int main()
{int a = 2;int b = (int) pow(a, 6);printf("%d\n", b);return 0;
}
?strcpy(strcpy函數(shù)詳解)
?第二個(gè),學(xué)習(xí)一個(gè)字符串函數(shù),從名字上,我們可以看出這個(gè)一個(gè)拷貝字符串的函數(shù)。
?
???????這個(gè)函數(shù)主要就是將一個(gè)字符串拷貝到另一個(gè)字符數(shù)組中,還是比較簡(jiǎn)單的,要記住的一點(diǎn)是這個(gè)函數(shù)會(huì)把‘\0'一起拷貝過(guò)去。?
?下面進(jìn)行代碼學(xué)習(xí):
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "xxxxxxxxxxxxxxx";char arr2[] = "hello c";strcpy(arr1, arr2);printf("%s\n", arr1); //printf("%s\n", strcpy(arr1, arr2));return 0;
}
memset(memset函數(shù)詳解?)
第三個(gè),學(xué)習(xí)一個(gè)內(nèi)存函數(shù),從名字上看,這個(gè)函數(shù)是用于內(nèi)存設(shè)置的函數(shù)。
?
??下面進(jìn)行代碼學(xué)習(xí):
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "hello C";memset(arr, 'c', 5);printf("%s\n", arr);return 0;
}
?2.2 自定義函數(shù)
???????如果庫(kù)函數(shù)能干所有的事情的話,那還要程序員干什么?所以更加重要的是自定義函數(shù)。在前面,我們已經(jīng)詳細(xì)地學(xué)習(xí)了庫(kù)函數(shù)是什么以及如何使用庫(kù)函數(shù)。
???????那么自定義函數(shù)與庫(kù)函數(shù)一樣,有函數(shù)名,返回值類型和函數(shù)參數(shù)。但是不一樣的是,這些函數(shù)都是我們自己來(lái)設(shè)計(jì)的,這就給程序員一個(gè)很大的發(fā)展空間。
函數(shù)的組成:
ret_type fun_name(para1, * ) {statement; //語(yǔ)句項(xiàng) }
ret_type? ? ? ?返回類型
fun_name? ? 函數(shù)名
para1? ? ? ? ? ?函數(shù)參數(shù)
舉個(gè)例子吧!這個(gè)例子還是比較簡(jiǎn)單的!
寫一個(gè)函數(shù)可以找出兩個(gè)整數(shù)中的最大值
#include <stdio.h> int Get_max(int num1, int num2) {return num1 > num2 ? num1 : num2; } int main() {int num1 = 0;int num2 = 0;scanf("%d %d", &num1, &num2);int max = Get_max(num1, num2);printf("max = %d", max);return 0; }
再舉一個(gè)例子!
寫一個(gè)函數(shù)可以交換兩個(gè)整形變量的內(nèi)容
#include <stdio.h> //實(shí)現(xiàn)成函數(shù),但是不能完成任務(wù) void Swap1(int x, int y) {int temp = x;x = y;y = temp; } //正確的版本 void Swap2(int* ptr1, int* ptr2) {int temp = *ptr1;*ptr1 = *ptr2;*ptr2 = temp; } int main() {int num1 = 1;int num2 = 2;Swap1(num1, num2);printf("Swap1: num1 = %d num2 = %d\n", num1, num2);Swap2(&num1, &num2);printf("Swap2: num1 = %d num2 = %d\n", num1, num2);return 0; }
???????這個(gè)例子就有點(diǎn)意思了,在Swap1函數(shù)中,x,y自己獨(dú)立的空間,不會(huì)影響num1,num2的值,函數(shù)在調(diào)用的時(shí)候,將實(shí)參傳遞給形參,形參實(shí)際上是實(shí)參的一份臨時(shí)拷貝,對(duì)形參的修改是不會(huì)改變實(shí)參的。這個(gè)例子就引入了下面小編要講的函數(shù)的參數(shù)。?
三、函數(shù)的參數(shù)
3.1 實(shí)際參數(shù)(實(shí)參):
實(shí)參的概念:真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。
實(shí)參的分類:實(shí)參可以是:常量,變量,表達(dá)式,函數(shù)等。
注意:無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值。以便把這些值傳送給形參。
3.2 形式參數(shù)(形參)?:
形式參數(shù)的概念:形式參數(shù)地址函數(shù)名后括號(hào)中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過(guò)程中才實(shí)例化(分配內(nèi)存單元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。因此形式參數(shù)只有在函數(shù)中有效。
???????在介紹完這兩個(gè)概念,重新回頭去看上面第二個(gè)例子。Swap1函數(shù)和Swap2函數(shù)中的參數(shù)x,y,ptr1,ptr2都是形式參數(shù);在main函數(shù)中傳給Swap1的num1,num2和傳給Swap2的&num1,&num2是實(shí)際參數(shù)。
下面,我們來(lái)進(jìn)行函數(shù)的實(shí)參和形參進(jìn)行分析:
實(shí)參num1和num2,形參x,y,使用的不是同一個(gè)空間:
而實(shí)參&num1和&num2,形參ptr1,ptr2,使用的空間是一樣的:
?
總結(jié):形參實(shí)例化之后其實(shí)相當(dāng)于實(shí)參的一份臨時(shí)拷貝。
四、函數(shù)的調(diào)用
?4.1 傳值調(diào)用
- 函數(shù)的形參和實(shí)參分別占用不同的內(nèi)存塊,對(duì)形參的修改不會(huì)影響實(shí)參。
?4.2 傳址調(diào)用
- 傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
- 這種傳參方式可以讓函數(shù)和函數(shù)外面的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。
???????要切記這兩種傳參方式的適用場(chǎng)景不同,如果不想改變實(shí)參,就用傳值調(diào)用;如果想通過(guò)形參改變實(shí)參,就用傳址調(diào)用。?
五、函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)
???????函數(shù)和函數(shù)之間可以根據(jù)實(shí)際的需求進(jìn)行組合的,也就是互相調(diào)用的。
5.1 嵌套調(diào)用
函數(shù)可以嵌套調(diào)用,但是不能嵌套定義。
5.2 鏈?zhǔn)皆L問(wèn)
把一個(gè)函數(shù)的返回值作為另外一個(gè)函數(shù)的參數(shù)。
#include <stdio.h> int main() {printf("%d", printf("%d", printf("%d", 43)));return 0; }
注意:printf函數(shù)的返回值值打印在屏幕上字符的個(gè)數(shù)?
在對(duì)這道題進(jìn)行一個(gè)變式:(在%d后面加上‘\n’)
#include <stdio.h> int main() {printf("%d\n", printf("%d\n", printf("%d\n", 43)));return 0; }
六、函數(shù)的聲明和定義
6.1 函數(shù)聲明:
- 告訴編譯器有一個(gè)函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,函數(shù)聲明解決不了。
- 函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前,要滿足先聲明后使用。
- 函數(shù)的聲明一般要放在頭文件中。
6.2 函數(shù)定義:
函數(shù)的定義是指函數(shù)的具體實(shí)現(xiàn),交代函數(shù)的功能實(shí)現(xiàn)。
下面,小編舉一個(gè)例子。
test.h的內(nèi)容
放置函數(shù)的聲明
#ifndef __TEST_H__ #define __TEST_H__ //函數(shù)的聲明 int Add(int x, int y);#endif //__TEST_H__
test.c的內(nèi)容
放置函數(shù)的實(shí)現(xiàn)?
#include "test.h" //函數(shù)Add的實(shí)現(xiàn) int Add(int x, int y) {return x+y; }
之后,小編我會(huì)分模塊寫兩個(gè)小游戲的。
七、函數(shù)遞歸
7.1 什么是遞歸
程序調(diào)用自身的編程技巧稱為遞歸。
???????遞歸作為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用。一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,遞歸策略只需少量的程序就可以描述出解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
遞歸的主要思考方式在于:把大事化小。
7.2 遞歸的兩個(gè)必要條件
- 存在限制條件,當(dāng)滿足這個(gè)限制條件的時(shí)候,遞歸便不再繼續(xù)。
- 每次遞歸調(diào)用之后越來(lái)越接近這個(gè)限制條件。
總結(jié)
???????在這一部分,小編詳細(xì)地編寫了有關(guān)函數(shù)的一篇博客。希望大家看完以后,進(jìn)行點(diǎn)評(píng),謝謝大家!