- ??個人主頁:庫庫的里昂
- ??CSDN新晉作者
- ??歡迎 ??點(diǎn)贊?評論?收藏
- ?系列專欄C語言初階、代碼小游戲
- ??希望作者的文章能對你有所幫助,有不足的地方請?jiān)谠u論區(qū)留言指正,大家一起學(xué)習(xí)交流!??
【前言】
函數(shù)是指將一組能完成一個功能或多個功能的語句放在一起的代碼結(jié)構(gòu)。在C語言程序中,至少會包含一個函數(shù),及主函數(shù)main()。本章將詳細(xì)講解關(guān)于函數(shù)的相關(guān)內(nèi)容。
一、函數(shù)概述
我們都知道函數(shù)是數(shù)學(xué)里的重要組成部分,數(shù)學(xué)中我們常見到函數(shù)的概念,但是你了解C語言中的函數(shù)嗎?
其實(shí)函數(shù)就相當(dāng)于一個子程序,那什么是子程序呢?
- 在計(jì)算機(jī)科學(xué)中,子程序是一個大型程序中的某部分代碼, 由一個或多個語句塊組成。它負(fù)責(zé)完成某項(xiàng)特定任務(wù),而且相較于其他代 碼,具備相對的獨(dú)立性。
- 一般會有輸入?yún)?shù)并有返回值,提供對過程的封裝和細(xì)節(jié)的隱藏。這些代碼通常被集成為軟件庫。
二、C語言中函數(shù)的分類
1.庫函數(shù)
1.1什么是庫函數(shù)?
其實(shí)庫函數(shù)就是存放在函數(shù)庫中的函數(shù),具有明確的功能、入口調(diào)用參數(shù)和返回值。下面舉一些例子:
- 我們知道在我們學(xué)習(xí)C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結(jié)果,想把這個結(jié)果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格式打印到屏幕上(printf)。
- 在編程的過程中我們會頻繁的做一些字符串的拷貝工作(strcpy)。
- 在編程是我們也計(jì)算,總是會計(jì)算n的k次方這樣的運(yùn)算(pow)。
1.2庫函數(shù)是C語言提供的嗎?
不是,C語言標(biāo)準(zhǔn)中約定好,由編譯器的廠商提供實(shí)現(xiàn)。
1.3為什么會有庫函數(shù)呢?
像上面我們描述的基礎(chǔ)功能,它們不是業(yè)務(wù)性的代碼。我們在開發(fā)的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員
進(jìn)行軟件開發(fā)。
1.4那怎么學(xué)習(xí)庫函數(shù)呢?
我們在開發(fā)的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員進(jìn)行軟件開發(fā)。
這里我給大家推薦一個可以很好查到有關(guān)庫函數(shù)的網(wǎng)站鏈接:可查到庫函數(shù)資料
簡單的總結(jié),C語言常用的庫函數(shù)都有:
- IO函數(shù)
- 字符串操作函數(shù)
- 字符操作函數(shù)
- 內(nèi)存操作函數(shù)
- 時間/日期函數(shù)
- 數(shù)學(xué)函數(shù)
- 其他庫函數(shù)
注!?。?br>庫函數(shù)必須知道的一個秘密就是:使用庫函數(shù),必須包含 #include 對應(yīng)的頭文件。
2.自定義函數(shù)
如果庫函數(shù)能干所有的事情,那還要程序員干什么?
所有更加重要的是自定義函數(shù)?。?!
自定義函數(shù)和庫函數(shù)一樣,有函數(shù)名,返回值類型和函數(shù)參數(shù)。
所謂自定義就是這些都是我們自己來設(shè)計(jì)。這給我們自己一個很大的發(fā)揮空間!?。?/font>
函數(shù)的組成:
我們舉一個例子:寫一個函數(shù)可以找出兩個整數(shù)中的最大值。
#include <stdio.h>
//get_max函數(shù)的設(shè)計(jì)
int get_max(int x, int y)
{
return (x > y) ? (x) : (y);//三目運(yùn)算符:x大于y返回x,x小于y返回y
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
這里我們輸入a=10 b=20結(jié)果是
正確的,說明我們自己定義的函數(shù)還是比較成功的哈??
上面可以看到,我們定義的一個函數(shù)get_max()是為了得到一個最大值,而get max也能理解為這個意思,由此可以看出咱們在定義函數(shù)的時候取的名字盡量要有意義,不然別人讀你的代碼根本不知道你這寫的什么函數(shù),你要知道,我們寫代碼是要給別人看的,你總不能寫個亂七八糟的函數(shù),讓你寫東你寫個西在上面,你讓別人怎么看呀,是不是。所以還是要考慮別人的感受!??!
扯遠(yuǎn)了哈,咱們繼續(xù)
三、函數(shù)的參數(shù)
1.實(shí)際參數(shù)(實(shí)參)
- 真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。
比如上面的例子:
get_max(num1, num2)
中num1和num2就是實(shí)參
- 實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。
get_max(3, 5)
get_max(num1, 8)
get_max(num1, 8+2)
get_max(num1, get_max(3,5))//鏈?zhǔn)浇Y(jié)構(gòu),后面我們會講到
- 無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。
就是實(shí)參不能是變量
2.形式參數(shù)(形參)
形式參數(shù)是指函數(shù)名后括號中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過程中才實(shí)例化(分配內(nèi)存單元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有效。
比如上面中的get_max(int x, int y),其中x和y就是形式參數(shù)。
我們可以簡單的認(rèn)為:形參實(shí)例化之后其實(shí)相當(dāng)于實(shí)參的一份臨時拷貝。
四、函數(shù)的調(diào)用
1.傳值調(diào)用
函數(shù)的形參和實(shí)參分別占有不同內(nèi)存塊,對形參的修改不會影響實(shí)參。
比如get_max()函數(shù),它只是求出兩個數(shù)中的最大值,沒有改變參數(shù)內(nèi)部的數(shù)值,所以用的是傳值調(diào)用。
2.傳址調(diào)用
- 傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
- 這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。
舉個例子:交換兩個數(shù)的值
void Swap2(int*p1, int*p2)
{
int tmp = 0;
tmp = *p1;//tmp = a;
*p1 = *p2;//a = b;
*p2 = tmp;//b = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交換前:a = %d b = %d\n", a, b);
Swap2(&a, &b);
printf("交換后:a = %d b= %d\n", a, b);
return 0;
}
這里我們輸入a=10 b=20
說明我們定義的函數(shù)是對的,但是我們看上面Swap(&a,&b)中使用的是取地址a和取地址b,這是為什么呢?為什么不用Swap(a,b)呢?
好好好,這么問是吧,那我就只好回答你了!
因?yàn)槲覀冃枰氖墙粨Qa、b的值,僅僅使用傳值調(diào)用的話只能改變實(shí)參的表面數(shù)值,而實(shí)參內(nèi)部沒有被傳到形參,當(dāng)形參執(zhí)行函數(shù)時只帶上了實(shí)參的數(shù)值,而形參內(nèi)部還是形參本身,那么雖然輸出的結(jié)果是符合要求的,但是內(nèi)部功能可能會有差異。所以我們采用傳址調(diào)用,這樣我們把a(bǔ)、b的地址傳到形參里面,形參就能根據(jù)地址輸出我們想要的效果。這么說,你該懂了吧!那么能否奉上閣下的一件三連呢!不要辜負(fù)我的一番苦心?。。?!
五、函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問
1.嵌套調(diào)用
假如我們需要定義兩個函數(shù),分別為x函數(shù)和y函數(shù)
void x()
{
}
void y()
{
x();
}
int main()
{
y();
}
我只是舉個例子來表示嵌套調(diào)用,你們可不要這么寫哈。
注意?。。?br> 函數(shù)可以嵌套調(diào)用,但是不能嵌套定義。
2.鏈?zhǔn)皆L問
把一個函數(shù)的返回值作為另外一個函數(shù)的參數(shù)
回到我們上面講到的一個例子:get_max(num1, get_max(3,5)),這就是鏈?zhǔn)浇Y(jié)構(gòu),以此類推可以放很多個函數(shù)在另一個函數(shù)的參數(shù)上面。
六、函數(shù)的聲明和定義
1.函數(shù)聲明
- 告訴編譯器有一個函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,函數(shù)
聲明決定不了。- 函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。
- 函數(shù)的聲明一般要放在頭文件中的。
其實(shí)就是在使用函數(shù)前應(yīng)該加上函數(shù)聲明
例:
int get_max(int x, int y);//<font color = green>函數(shù)聲明
int main()
{
get_max(a,b);
}
加在最上面或者get_max(a,b)上面都可以。
2. 函數(shù)定義
函數(shù)的定義是指函數(shù)的具體實(shí)現(xiàn),交待函數(shù)的功能實(shí)現(xiàn)。
例:
int get_max(int x, int y)
{
return (x > y) ? (x) : (y);//三目運(yùn)算符:x大于y返回x,x小于y返回y
}
這就是函數(shù)定義。
學(xué)習(xí)了函數(shù)聲明和函數(shù)定義以后,我們是不是就知道怎么使用函數(shù)了,好,那我們就來寫一道題:寫一個函數(shù),完成2個整數(shù)的相加
這里我們可以創(chuàng)建一個函數(shù)Add(),它要完成兩個數(shù)相加,那么函數(shù)就可已定義為:
int Add(int x, int y)
{
return x + y;
}
函數(shù)聲明為:
int Add(int x, int y);
那么我們就可以開始寫這個程序,代碼就是
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Add(int x, int y);
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = Add(a, b);
printf("%d\n", ret);
return 0;
}
輸入a=10 b=20
運(yùn)行結(jié)果:
到這里你是不是覺得沒什么問題,確實(shí)沒什么問題哈。
但事實(shí)上,在工程里面是這樣用的嗎?
如果你只是寫一個文件的話,這樣寫是沒有任何問題的。
但是我們未來在工程中,代碼是比較多的,如果還是用我們上面這種方法的話,那可就太繁瑣了,所以,我們的函數(shù)一般是放在.h文件中聲明,在.c文件中實(shí)現(xiàn)的!
下面我給大家來演示一遍(VS2019)
-
新建一個頭文件add.h
因?yàn)轭^文件是進(jìn)行函數(shù)的聲明,所以在頭文件中輸入函數(shù)聲明
-
新建兩個源文件add.c和test.c
add.c里面用來定義我們的函數(shù)
test.c是我們自己輸入跑程序要用的代碼
當(dāng)我們需要用到Add()函數(shù)時,只要在前面加上一個#include"add.h"
程序跑起來就是這個樣子
- 這樣看著很復(fù)雜的樣子,但在一個較大的工程里面是需要多人協(xié)作的,而我們這樣是合理分配了各自的工作。
- 比如三個人來做一個工程,總不可能一個做累了另一個接著做吧,這時就應(yīng)該三個人分別來做add.h、add.c、test.c,這樣是不是就能加快咱們的效率。
七、函數(shù)遞歸
對于初學(xué)者而言函數(shù)遞歸是比較難啃的一塊,所以本庫打算后面單獨(dú)發(fā)一篇文章來教大家學(xué)習(xí)遞歸。文章來源:http://www.zghlxwxcb.cn/news/detail-608715.html
今天超級詳細(xì)的C語言中的函數(shù)就分享到這里啦!希望各位多多點(diǎn)贊收藏評論??!你的支持是我最大的動力?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-608715.html
到了這里,關(guān)于C語言中的函數(shù)(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!