日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言初阶函数讲解

發(fā)布時(shí)間:2024/1/1 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言初阶函数讲解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天,我來(lái)分享一下我對(duì)函數(shù)的見解,前兩次的博客代碼太少,這次代碼會(huì)很多,注意哦!

說(shuō)到函數(shù),大家一定很熟悉,數(shù)學(xué)里的函數(shù)想必大家并不陌生,而計(jì)算機(jī)語(yǔ)言的函數(shù)和數(shù)學(xué)函數(shù)一樣各式各樣的。C語(yǔ)言函數(shù)是由返回值,函數(shù)名,函數(shù)參數(shù),函數(shù)體構(gòu)成。函數(shù)的參數(shù)傳參是從右往左,函數(shù)調(diào)用后需要將占用的內(nèi)存釋放,這兩點(diǎn)很重要。C語(yǔ)言的函數(shù)又分為自定義函數(shù)和庫(kù)函數(shù),下面我將一一講解。

自定義函數(shù)

說(shuō)到自定義函數(shù),相信大家一定聽過(guò)先聲明,后調(diào)用的經(jīng)典吧。其實(shí)我們的main函數(shù)也是我們自定義的一個(gè)函數(shù)。下面我先介紹一下main函數(shù),main函數(shù)是程序的入口,并且有且只能有一個(gè)。

這三種定義主函數(shù)的形式相信大家或多都見過(guò),但main函數(shù)實(shí)際上是可以有參數(shù)的,

int main(int argc,char*argv[]) {

?? ?return 0;
}這個(gè)形式的函數(shù)就是有參數(shù)的main函數(shù),但main函數(shù)的參數(shù)是規(guī)定的,第一個(gè)參數(shù)argc記錄了輸入控制臺(tái)的字符串個(gè)數(shù),而argv是字符指針數(shù)組,存放了每個(gè)字符串的首地址,并且長(zhǎng)度是根據(jù)輸入的個(gè)數(shù)來(lái)規(guī)定的,有參數(shù)的main函數(shù)的使用環(huán)境是在操作系統(tǒng)下進(jìn)行的,操作系統(tǒng)方面的內(nèi)容,我接觸很少,這里就不分享操作了,感興趣的小伙伴們可以自行查閱資料。

自定義函數(shù)是我們?yōu)榱藢?shí)現(xiàn)某些功能而創(chuàng)建的,當(dāng)有很多重復(fù)復(fù)雜的操作時(shí),可以使用自定義函數(shù)來(lái)進(jìn)行優(yōu)化。理論上來(lái)說(shuō),只要是能運(yùn)行的正常主函數(shù),都可以用自定義的調(diào)用函數(shù)來(lái)實(shí)現(xiàn)。出開始學(xué)習(xí)C語(yǔ)言開始,設(shè)計(jì)了很多簡(jiǎn)單的程序,但一開始都是為了解決特定問(wèn)題而設(shè)計(jì)的程序,缺少普遍規(guī)律,在學(xué)習(xí)了自定義函數(shù)之后,我希望大家喜歡上設(shè)計(jì)調(diào)用函數(shù)來(lái)解決普遍問(wèn)題。隨著C語(yǔ)言的發(fā)展,我們也有了很多設(shè)計(jì)好的并且可以引用頭文件后直接使用的自定義函數(shù),這些函數(shù)被稱為庫(kù)函數(shù),下文會(huì)介紹一些常見的庫(kù)函數(shù)。

在使用自定義函數(shù)之前,我們需要先進(jìn)行聲明。那什么是函數(shù)的聲明呢?簡(jiǎn)單來(lái)說(shuō),就是告訴編譯器有一個(gè)函數(shù),它叫什么,參數(shù)是什么,返回值是什么類型的,但是這個(gè)函數(shù)是否存在,這個(gè)函數(shù)是否有具體內(nèi)容并不重要。“先聲明,后調(diào)用”希望大家一定要銘記。在使用一個(gè)庫(kù)函數(shù)之前我們往往需要引用一些頭文件,這些頭文件里就包含了函數(shù)的聲明,在做一個(gè)大項(xiàng)目的時(shí)候,自己寫自己的main函數(shù)顯然不合適,這個(gè)時(shí)候我們需要將函數(shù)聲明放在一個(gè)自定義的頭文件中。

這就是創(chuàng)建頭文件的一種格式,至于為什么會(huì)需要這樣以后再做探討。

函數(shù)的定義是指函數(shù)的具體實(shí)現(xiàn),交代了函數(shù)的功能,我一般是定義函數(shù)和函數(shù)聲明一起進(jìn)行。?

?圖1是我比較喜歡的形式,圖二中的int Add(int x,int y);也被稱為預(yù)聲明語(yǔ)句,里面的x和y是可以省略的,至于為什么將函數(shù)主體定義在main函數(shù)之后需要使用預(yù)聲明語(yǔ)句,你需要了解編譯的過(guò)程。

接下來(lái)是函數(shù)的參數(shù),函數(shù)參數(shù)分為實(shí)際參數(shù)和形式參數(shù)。

實(shí)際參數(shù)

傳給函數(shù)的參數(shù),實(shí)參可以是表達(dá)式,常量,甚至可以是函數(shù)等等,但無(wú)論是怎樣的形式,實(shí)參都必須有真實(shí)的值傳給形參。

形式參數(shù)

值的是函數(shù)名括號(hào)里中的變量,如前面兩個(gè)圖中的x和y,形式參數(shù)只有在函數(shù)調(diào)用的時(shí)候才會(huì)向內(nèi)存訪問(wèn)一塊空間,并且在調(diào)用結(jié)束后,這塊空間會(huì)還給內(nèi)存,所以形式參數(shù)只在函數(shù)內(nèi)部有效。舉個(gè)例子,就是一個(gè)在外漂泊流浪想要回到故鄉(xiāng)的人,只有在遇到村莊的時(shí)候才能找個(gè)地方住,其他時(shí)候都是風(fēng)餐露宿,但他想要回到故鄉(xiāng),所以在待了一段時(shí)間后終究會(huì)離開村莊。在外漂泊流浪的人就是形式參數(shù),路上的村莊就是內(nèi)存,村民們給他的住處就是訪問(wèn)到的空間,而離開了村莊就代表調(diào)用結(jié)束,他要繼續(xù)漂泊流浪尋找故鄉(xiāng)了。

接下來(lái)看一段?

?根據(jù)結(jié)果我們可以發(fā)現(xiàn),swap1沒(méi)有實(shí)現(xiàn)交換目的,但swap2實(shí)現(xiàn)了交換的目的。

這就是傳值調(diào)用和傳址調(diào)用的區(qū)別,swap1為典型的傳值調(diào)用,傳值調(diào)用是,形參只是實(shí)參的臨時(shí)拷貝,形參的改變并不會(huì)影響實(shí)參。而swap2為傳址調(diào)用,將a和b的地址傳給實(shí)參,形參指向的地方是實(shí)參,這時(shí)使用形參可以對(duì)實(shí)參進(jìn)行改變。

函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)

函數(shù)的嵌套使用,指一個(gè)函數(shù)調(diào)用了另一個(gè)函數(shù),在main函數(shù)中使用了printf函數(shù)就是一種函數(shù)的嵌套使用哦。函數(shù)的嵌套使用也有兩種比較難的情況,回調(diào)函數(shù)和遞歸函數(shù),遞歸函數(shù)在下文會(huì)進(jìn)行介紹,回調(diào)函數(shù)現(xiàn)在介紹還為之過(guò)早。

函數(shù)的鏈?zhǔn)皆L問(wèn),指把一個(gè)函數(shù)的返回值作為另一個(gè)函數(shù)的參數(shù)。

?

?上面的代碼就是典型的實(shí)例,printf函數(shù)也有返回值,它的返回值其實(shí)是printf函數(shù)“”中的字符串長(zhǎng)度,當(dāng)然,不包括\0。

函數(shù)遞歸

遞歸是程序設(shè)計(jì)語(yǔ)言中的一種算法,被廣泛應(yīng)用。遞歸是一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)用自身的一種方法,通常是將一個(gè)復(fù)雜的大型程序?qū)訉愚D(zhuǎn)化為一個(gè)規(guī)模較小的問(wèn)題,用少量的程序完成了多次的重復(fù)計(jì)算,大大減少了代碼量。這其實(shí)和我們高中學(xué)過(guò)的遞推數(shù)列的通項(xiàng)公式很類似。下面舉兩個(gè)例子

?我們都知道,在數(shù)學(xué)中,乘法其實(shí)是進(jìn)行了多次同樣的加法,次方其實(shí)是進(jìn)行了多次同樣的乘法,C語(yǔ)言中的^是按位異或,并不是次方,而我們想要直接求a的b次方需要引用<math.h>然后使用pow函數(shù),但我們可以通過(guò)一個(gè)簡(jiǎn)單的遞歸來(lái)實(shí)現(xiàn)。這兩個(gè)遞歸比較簡(jiǎn)單,相信大家很快就能理解,只需要多培養(yǎng)用程序的思維理解代碼,相信遞推很快就能基本掌握的。但我們會(huì)發(fā)現(xiàn)這兩個(gè)遞歸都有限制條件,且每一次遞歸都越來(lái)越接近這個(gè)限制條件,這邊是遞歸的兩個(gè)必要條件:

1.存在限制條件,當(dāng)滿足限制條件時(shí),遞歸調(diào)用停止。

2.每次遞歸調(diào)用之后都會(huì)越來(lái)越接近這個(gè)限制條件。

如果沒(méi)有這兩個(gè)條件,遞歸會(huì)出現(xiàn)棧溢出的情況即stack overflow。由于編譯器原因,這里不給大家分享?xiàng)R绯龅拇a了。我們繼續(xù)講遞歸,遞歸雖然使代碼量減少,但是程序運(yùn)行量并沒(méi)有減少,甚至可能比正常的程序代碼量還要更多。大家應(yīng)該都知道斐波那契數(shù)列吧,接下來(lái)以這個(gè)為例。

?

雖然第二個(gè)代碼比第一個(gè)代碼簡(jiǎn)潔,但是遞歸實(shí)現(xiàn)的斐波那契數(shù)列分支太多,當(dāng)n很大時(shí)計(jì)算量是巨大的,而第一個(gè)代碼則沒(méi)有那么多的計(jì)算量,所以遞歸使用也需要慎重考慮,理論上,循環(huán)都有可以用遞歸實(shí)現(xiàn),但實(shí)現(xiàn)遞歸可能會(huì)出現(xiàn)上面代碼二的情況哦。

大家如果要學(xué)習(xí)遞歸調(diào)用可以從簡(jiǎn)單的求階乘,漢諾塔和小青蛙跳臺(tái)階問(wèn)題來(lái)解決,甚至可以嘗試一下解決牛頓迭代方程。?

最后提一句,掌握自定義函數(shù)的核心其實(shí)是了解算法,希望大家可以自定義函數(shù)多設(shè)計(jì)一些各種各樣的程序。

庫(kù)函數(shù)

庫(kù)函數(shù)是之前的程序員設(shè)計(jì)好的函數(shù),放進(jìn)庫(kù)里,供其他人使用的函數(shù)。

庫(kù)函數(shù)這里只對(duì)一些重要的庫(kù)函數(shù)進(jìn)行介紹,不做過(guò)多的講解,以后會(huì)詳細(xì)講解一些常見的庫(kù)函數(shù)。

首先是IO函數(shù),I代表input輸入,O代表output輸出,即輸入輸出流函數(shù)。一般頭文件為stdio.h

printf函數(shù)是我們最常見的IO函數(shù)之一,他的作用是格式化打印“”中的字符,格式化打印符會(huì)自動(dòng)尋找變量或者常量來(lái)進(jìn)行替換,格式化打印符第一篇有詳細(xì)的介紹,如果有遺漏可以在評(píng)論區(qū)留言進(jìn)行補(bǔ)充。而printf的返回值就是字符的位數(shù),不包括\0。

scanf函數(shù)也是比較常見的函數(shù),比較容易犯在“”中加入非格式化轉(zhuǎn)換符和忘了取地址的錯(cuò)誤。

getchar是接受鍵盤上的任意一個(gè)字符(getchar還可以與文件聯(lián)系到一起),putchar是打印一個(gè)字符。

gets輸入一個(gè)字符串,puts打印一個(gè)字符串,值得一提的是gets在c++中已經(jīng)被棄用,這也是我最近在知道的東西。

接下來(lái)是字符串操作函數(shù),就是對(duì)字符串進(jìn)行操作的函數(shù)。頭文件一般是string.h

strcpy字符串拷貝函數(shù),基本使用方式是strcpy(string1,string2);將字符串2拷貝給字符串1;

strlen求字符串長(zhǎng)度函數(shù),遇到\0就停止計(jì)數(shù),基本用法是strlen(string);我們總會(huì)吧strlen和關(guān)鍵字sizeof聯(lián)系到一起,當(dāng)介紹數(shù)組時(shí),我會(huì)盡力去解釋這兩個(gè)的區(qū)別。

strcmp字符串比較函數(shù),將兩個(gè)字符串進(jìn)行比較,基本使用時(shí)strcmp(str1,str2);當(dāng)str1大于str2時(shí)返回大于零的數(shù),等于時(shí)返回0,小于則返回小于0的數(shù),是根據(jù)ASCII碼值進(jìn)行比較的。

strcat字符串追加函數(shù),strcat(str1,str2)是將str2字符串接在字符串str1的后面

strupr大寫字符串函數(shù),使用方法是strupr(string);會(huì)將string中的所有小寫字母變成大寫字母。

strlwr則是小寫字符串函數(shù),使用方法與strupr一致,但是是將所有的大寫轉(zhuǎn)換成小寫。

字符操作函數(shù),是對(duì)字符直接操作的函數(shù),接觸很少,沒(méi)有具體的例子,希望大家來(lái)補(bǔ)充。

內(nèi)存操作函數(shù),是對(duì)內(nèi)存進(jìn)行操作的函數(shù)

我們來(lái)簡(jiǎn)單介紹一下其中的memset,內(nèi)存設(shè)置函數(shù),頭文件為string

memset(指針或者數(shù)組a,賦給a的值,a的長(zhǎng)度)例如(a,\0,sizeof(a))代表情況數(shù)組a

接下來(lái)是時(shí)間/日期函數(shù),頭文件是time.h對(duì)時(shí)間進(jìn)行操作的函數(shù),這里也沒(méi)有例子

然后是數(shù)學(xué)函數(shù),顧名思義是數(shù)學(xué)的函數(shù),頭文件是math.h

sqrt求根函數(shù),pow是求冪的函數(shù),abs函數(shù)求絕對(duì)值等等,大家感興趣可以去了解一下。

值得一提的是這些函數(shù)的返回值都是double型的?

最后是其他庫(kù)函數(shù),這里介紹一個(gè)直接對(duì)操作系統(tǒng)下達(dá)命令的system函數(shù)

system系統(tǒng)函數(shù),頭文件是stdlib.h,system(“”)中的“”下達(dá)的命令和在cmd中下達(dá)的命令是一致的,懂得電腦的大概已經(jīng)迫不及待的想要使用system函數(shù)了吧,不懂電腦的沒(méi)關(guān)系,我也是一個(gè)電腦小白,我們總會(huì)慢慢學(xué)會(huì)的。

C語(yǔ)言初階的函數(shù)講解到這里就介紹了,感謝大家的閱讀。

總結(jié)

以上是生活随笔為你收集整理的C语言初阶函数讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。