成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C語言】玩轉(zhuǎn)函數(shù)——關(guān)于函數(shù),你需要知道的知識!

newsning / 3198人閱讀

摘要:可分為兩類,一類是語言標準規(guī)定的庫函數(shù),一類是編譯器特定的庫函數(shù)。函數(shù)的調(diào)用傳值調(diào)用函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。函數(shù)的聲明一般要放在頭文件中的。


前言

函數(shù)在我們編程的時候,發(fā)揮著巨大的作用。它就像一個功能,一個招式,當我們需要用的時候,直接調(diào)用出來抵擋對手。函數(shù)的使用,既讓我們的代碼變得簡潔了,也讓我們的代碼變得方便管理。因此,在學(xué)習編程的時候,掌握函數(shù)這一知識點無疑是在我們學(xué)習占據(jù)重要地位的。

1、 C語言中的函數(shù)是什么?

在維基百科中,對C語言中函數(shù)的定義是:子程序。
那么什么是子程序呢?

1、在計算機科學(xué)中,子程序(英語:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一個大型程序中的某部分代碼,由一個或多個語句塊組成。它負責完成某項特定任務(wù),而且相較于其他代 碼,具備相對的獨立性。

2、一般會有輸入?yún)?shù)并有返回值,提供對過程的封裝和細節(jié)的隱藏。這些代碼通常被集成為軟件庫。

從中提取信息點,“大型程序中的某部分代碼” “負責完成某項特定任務(wù)” 。舉個例子說,就比如我們在做計算器的時候,需要加減乘除四個大塊內(nèi)容,我們在這里就可將加法做成一個多帶帶的代碼塊,專門用來實現(xiàn)加法的功能。這功能就是函數(shù)。

2、函數(shù)的分類

2.1庫函數(shù)

2.1.1庫函數(shù)是什么?

庫函數(shù)(Library function)是把函數(shù)放到庫里,供別人使用的一種方式。是把一些常用到的函數(shù)編完放到一個文件里,供不同的人進行調(diào)用。調(diào)用的時候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。

一般是指編譯器提供的可在c源程序中調(diào)用的函數(shù)。
可分為兩類,一類是c語言標準規(guī)定的庫函數(shù),一類是編譯器特定的庫函數(shù)。

由于版權(quán)原因,庫函數(shù)的源代碼一般是不可見的,但在頭文件中你可以看到它對外的接口。

舉個例子:

  1. 當我們在學(xué)習C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結(jié)果,想把這個結(jié)果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格式打印到屏幕上(使用printf函數(shù))。
  2. 在編程的過程中我們會頻繁的做一些字符串的拷貝工作(使用strcpy函數(shù))。
  3. 在編程是我們也計算,總是會計算n的k次方這樣的運算(使用pow函數(shù))。

像上面我們描述的基礎(chǔ)功能,它們不是業(yè)務(wù)性的代碼。我們在開發(fā)的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員 進行軟件開發(fā)。

2.1.2如何學(xué)習庫函數(shù)

在這里,我們可以用到一個程序員必備網(wǎng)站:http://www.cplusplus.com/

打開,我們可以看到有非常多的庫函數(shù)
我們在這里以strcpy為例來給大家講解一下如何使用這個網(wǎng)站。

第一步,打開網(wǎng)站
第二步,搜索函數(shù)strcpy

第三步,查看函數(shù)功能與用法。
例子代碼:

#include#includeint main(){	char arr1[20] = { 0 };	char arr2[] = "gogogo";	strcpy(arr1, arr2);	printf("%s/n", arr1);}

相信通過這樣的講述,大家也能明白怎樣使用庫函數(shù)了吧!

在這里,簡單的總結(jié),C語言常用的庫函數(shù)都有:

IO函數(shù)——輸入輸出函數(shù) input/output printf scanf getchar putchar
字符串操作函數(shù) strlen strcmp strcpy strcat
字符操作函數(shù) tolower toupper
內(nèi)存操作函數(shù) memcpy menset memmove memcmp
時間日期函數(shù) time
數(shù)學(xué)函數(shù) sqrt abs fabs pow
其他庫函數(shù)

注意:
但是庫函數(shù)必須知道的一個秘密就是:使用庫函數(shù),必須包含 #include 對應(yīng)的頭文件。

需要學(xué)會查詢工具的使用:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com(英文版) http://ch.cppreference.com(中文版)

2.2自定義函數(shù)

大家有沒有發(fā)現(xiàn),庫函數(shù)并不能解決所有的問題,比如說我今天要寫一個自動刷牙的程序,可能庫函數(shù)中根本就沒有。這時候,就需要我們程序員自己來定義函數(shù)了

這就是自定義函數(shù)。
自定義函數(shù)和庫函數(shù)一樣,有函數(shù)名,返回值類型和函數(shù)參數(shù)。
但是不一樣的是這些都是我們自己來設(shè)計。這給程序員一個很大的自由發(fā)揮的空間。

ret_type fun_name(para1, * )
{
statement;//語句項
}

ret_type 返回類型
fun_name 函數(shù)名
para1 函數(shù)參數(shù)

舉個例子:

寫一個函數(shù)找出兩個整數(shù)中的最大值

#include //get_max函數(shù)的設(shè)計int get_max(int x, int y) { return (x>y)?(x):(y);}int main(){ int num1 = 10; int num2 = 20; int max = get_max(num1, num2);//調(diào)用函數(shù) printf("max = %d/n", max); return 0;  }

3、函數(shù)的參數(shù)

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

在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。
在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)稱為“實際參數(shù)”(簡稱“實參”)。
實參可以是常量、變量或表達式, 無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應(yīng)預(yù)先用賦值,輸入等辦法使實參獲得確定值。

舉個例子:

#include void Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; }void Swap2(int *px, int *py) { int tmp = 0; tmp = *px; *px = *py; *py = tmp; }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; }

3.1形式參數(shù)(形參)

形式參數(shù)是指函數(shù)名后括號中的變量,因為形式參數(shù)只有在函數(shù)被調(diào)用的過程中才實例化(分配內(nèi)存單元),所以叫形式參數(shù)。
形式參數(shù)當函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有效。

上面Swap1和Swap2函數(shù)中的參數(shù) x,y,px,py 都是形式參數(shù)。
在main函數(shù)中傳給Swap1的num1,num2和傳給Swap2函數(shù)的&num1,&num2是實際參數(shù)。

這里我們對函數(shù)的實參和形參進行分析
借用網(wǎng)上的一幅圖

實參是調(diào)用函數(shù)傳遞的具體數(shù)據(jù)。實參對形參數(shù)據(jù)傳遞時時單向傳遞。在存儲單元中是不同的單元.

在上面的Swap1函數(shù),在調(diào)用過程中,形參x和y的值都發(fā)生了改變,但是在main函數(shù)中,num1和num2的值都未發(fā)生變化。所以說實參向形參的值的傳遞是單向的。

Swap2函數(shù),由于把地址也傳過去了,所以兩個值都改變了,這也是下面所講的傳值調(diào)用與傳址調(diào)用。

**【注意】**形參實例化之后其實相當于實參的一份臨時拷貝。

4、函數(shù)的調(diào)用

4.1傳值調(diào)用

函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。

舉個例子,交換兩個整數(shù)的值。

#include int Swap(int x, int y)//這里形參x,y占據(jù)的內(nèi)存塊與下面實參a,b占據(jù)的內(nèi)存塊是不同的{	int z = 0;	z= x;	x= y;	y = z;}int main(){	int a = 10;	int b = 20;	printf("交換前a=%d,b=%d/n", a, b);	Swap(a, b);//這里實參a,b占據(jù)的內(nèi)存塊與上面形參x,y占據(jù)的內(nèi)存塊是不同的	printf("交換后a=%d,b=%d/n", a, b);	return 0;}

我們可以看到,這里a與b的值并沒有發(fā)生變化,因為**函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。**所以,實參a和b,傳給形參x,y的時候,形參是實參的一份臨時拷貝,改變形參變量x,y,是不會影響實參a和b.

4.2傳址調(diào)用

1、傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
2、這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。

舉個例子,也交換兩個整數(shù)的值

#includevoid Swap(int *px, int *py)//用指針接收a,b的地址{	int z = 0;	z = *px;	*px = *py;	*py = z;}int main(){	int a = 10;	int b = 20;	printf("交換前a=%d,b=%d/n", a, b);	Swap(&a,&b);//把a,b的地址傳到上面函數(shù)去	printf("交換后a=%d,b=%d/n", a, b);	return 0;}

在這里,我們可以了解到,如果把a和b的內(nèi)存地址傳過去給函數(shù)的時候,在函數(shù)中,我們就可以依照這個指針地址,傳數(shù)據(jù)回來。讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。

5、 函數(shù)的嵌套調(diào)用和鏈式訪問

5.1嵌套使用

需要說明的是,C語言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級函數(shù)和下一級函數(shù)的問題。但是C語言允許在一個函數(shù)的定義中出現(xiàn)對另一個函數(shù)的調(diào)用。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。

舉個例子:

void first_line(){	printf("hello world/n");}void two_line(){	int i = 0;	first_line();}int main(){	two_line();	return 0;}

main函數(shù)調(diào)用了two_line函數(shù),而two_line函數(shù)調(diào)用了first_line函數(shù)。函數(shù)調(diào)用了函數(shù),我們就說是函數(shù)的嵌套調(diào)用
**注意,**函數(shù)可以嵌套調(diào)用,但是不能嵌套定義。
什么意思?
就是說,我們不能在函數(shù)之中定義一個函數(shù),舉個例子:

5.2鏈式訪問

把一個函數(shù)的返回值作為另外一個函數(shù)的參數(shù)。

我們舉個例子。

#include int main(){    printf("%d/n", printf("%d", printf("%d", 43)));    //注:printf函數(shù)的返回值是打印在屏幕上字符的個數(shù)    return 0; }

6、函數(shù)的聲明與定義

6.1函數(shù)的聲明

  1. 告訴編譯器有一個函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,函數(shù) 聲明決定不了。
  2. 函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。
  3. 函數(shù)的聲明一般要放在頭文件中的。

函數(shù)聲明的格式:

dataType functionName( dataType1 param1, dataType2 param2 … );

有了函數(shù)聲明,函數(shù)定義就可以出現(xiàn)在任何地方了,甚至是其他文件、靜態(tài)鏈接庫、動態(tài)鏈接庫等。

簡單來說,“函數(shù)聲明”的作用是把函數(shù)的名字、函數(shù)類型以及形參類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢查(例如函數(shù)名是否正確,實參與形參的類型和個數(shù)是否一致)

6.2函數(shù)定義

函數(shù)的定義是指函數(shù)的具體實現(xiàn),交待函數(shù)的功能實現(xiàn)。

void Swap1(int *px, int *py);//函數(shù)的聲明void Swap(int *px, int *py)//函數(shù)定義{	int z = 0;	z = *px;	*px = *py;	*py = z;}int main(){	int a = 10;	int b = 20;	printf("交換前a=%d,b=%d/n", a, b);	Swap(&a,&b);	printf("交換后a=%d,b=%d/n", a, b);	return 0;}

6.3函數(shù)聲明與定義的區(qū)別

1、函數(shù)的聲明與函數(shù)的定義形式上十分相似,但是二者有著本質(zhì)上的不同。聲明是不開辟內(nèi)存的,僅僅告訴編譯器,要聲明的部分存在,要預(yù)留一點空間。定義則需要開辟內(nèi)存。

函數(shù)的定義
函數(shù)的定義是一個完整的函數(shù)單元:

包含函數(shù)類型、函數(shù)名、形參及形參類型、函數(shù)體等在程序中,函數(shù)的定義只能有一次函數(shù)首部與花括號間不加分號

函數(shù)的聲明
函數(shù)聲明只是對編譯系統(tǒng)的一個說明:

函數(shù)聲明是對定義的函數(shù)的返回值的類型說明,以通知系統(tǒng)在本函數(shù)中所調(diào)用的函數(shù)是什么類型。不包含函數(shù)體(或形參)調(diào)用幾次該函數(shù)就應(yīng)在各個主調(diào)函數(shù)中做相應(yīng)聲明函數(shù)聲明是一個說明語句,必須以分號結(jié)束!

總結(jié)

函數(shù)還有很多其他的知識,本文只是略作探討。函數(shù)在我們編程之中占據(jù)重要地位,只有學(xué)好了函數(shù),我們才能在接下的學(xué)習之中更好的前進。


?。?! 感謝各位看到這里,小弟不才,文中若有錯誤之處,還望指出,共同探討,共同進步?。?!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119675.html

相關(guān)文章

  • C語言玩轉(zhuǎn)指針——關(guān)于指針,需要掌握基礎(chǔ)知識!

    摘要:如果我們要將的地址保存到中,我們需要我們給指針變量相應(yīng)的類型。類型的指針是為了存放類型變量的地址這里可以看到,指針的定義方式是類型名指針變量名。如下最后本文介紹的是指針的基礎(chǔ)知識,往后還會繼續(xù)深入講解指 ...

    zebrayoung 評論0 收藏0
  • C語言玩轉(zhuǎn)遞歸——學(xué)好遞歸,需要掌握知識!

    摘要:所以,遞歸在編程中同樣是很重要的一個知識點。舉個例子用遞歸實現(xiàn)求第個斐波那契數(shù)??偨Y(jié)起來四個字大事化小繼續(xù)舉斐波那契數(shù)的例子三遞歸是怎樣運行的我們通過一道題目來講解。 ...

    Donne 評論0 收藏0
  • 玩轉(zhuǎn) React(一)- 前言

    摘要:本人計劃編寫一個針對中初級前端開發(fā)者學(xué)習的系列教程玩轉(zhuǎn)。使用的原因是新的語言規(guī)范開發(fā)效率更高代碼更優(yōu)雅,尤其是基于開發(fā)的項目。其次也是目前特別流行的一個前端框架,截止目前,上有將近萬,國內(nèi)一二線互聯(lián)網(wǎng)公司都有深度依賴開發(fā)的項目。 本人計劃編寫一個針對中初級前端開發(fā)者學(xué)習 React 的系列教程 - 《玩轉(zhuǎn) React》。 文章更新頻率:每周 1 ~ 2 篇。 目錄 玩轉(zhuǎn) React(...

    waltr 評論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<