C語言編程新手入門基礎(chǔ)學(xué)習(xí):使用函數(shù)必須知道的3點(diǎn)注意事項(xiàng)

C語言是面向過程的,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。

C++,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計這個概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設(shè)計的基礎(chǔ),好的設(shè)計如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計”也能寫出非常好的東西。

這次與大家分享的是我對 C 語言中函數(shù)使用注意事項(xiàng)的小短文,希望能幫助有疑惑的同學(xué)更好的使用這個強(qiáng)大的語言特性。

大家在高中的時候都求過數(shù)學(xué)函數(shù)的表達(dá)式,其實(shí)編程語言的函數(shù)與數(shù)學(xué)表達(dá)式實(shí)際上是一樣的。

我們都可以將其理解為一個有輸入有輸出的「功能黑箱」,看下圖:

就類似給函數(shù)一個 x 值,可以求結(jié)果一樣,給函數(shù)一些輸入?yún)?shù),也可以得到相同的輸出結(jié)果。

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 七三零,一三零,二二一 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

1. 模塊化編程

為什么要使用函數(shù)呢?其實(shí)是為了更好的維護(hù)軟件的功能以及實(shí)現(xiàn)模塊化編程。

你可以想下如果把所有的功能都寫在 main 函數(shù)中,那該多么可怕,估計沒人會讀你寫的代碼。

通過使用函數(shù)可以使我們的軟件邏輯性更強(qiáng),單獨(dú)的功能寫在單獨(dú)的函數(shù)中,還可以方便后期復(fù)用等等,好處還有很多實(shí)在列舉不完。

其中比較重要的作用要說:模塊化編程和代碼復(fù)用了,建議你去找實(shí)際的項(xiàng)目看看代碼組成,自然就理解了。

2. 函數(shù)的副本機(jī)制

很多初學(xué)者都搞不清楚函數(shù)的副本機(jī)制,例如下面的交換函數(shù):

這個函數(shù)是錯誤的,因?yàn)楹瘮?shù)在進(jìn)行參數(shù)傳遞的時候,會將傳入?yún)?shù) m,n 的值拷貝給函數(shù)的形式參數(shù) a,b。

因此在函數(shù)內(nèi)部交換的是形式參數(shù) a,b 的值,而不是交換傳遞時 m,n 變量的值。

函數(shù)的副本機(jī)制從內(nèi)存的角度來說就是:在函數(shù)進(jìn)行參數(shù)傳遞的時候,實(shí)參和形參的內(nèi)存地址是不同的。

這是這個例子的輸出結(jié)果,每個人的機(jī)器可能都不同:

可以看到變量 m 和 a,以及 n 和 b 的內(nèi)存地址均不同,因此對值的交換也是不起作用的。

但是使用指針就完全不同了,看下面這個例子:

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 七三零,一三零,二二一 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

這個函數(shù)才是正確的交換函數(shù),為什么呢?

因?yàn)槲覀冞@里傳遞的是 m,n 的內(nèi)存地址,即傳遞的是指針,所以在函數(shù)內(nèi)部對指針解除引用就可以直接訪問這個地址的內(nèi)容了,這是指針提供的特性。

那么是否就意為著傳遞指針就沒有副本機(jī)制了呢?這也是錯誤的,指針也是變量,本質(zhì)上與 int 沒有區(qū)別,只是特性不同罷了。

上面例子在傳遞指針的時候,也是將 m,n 的地址拷貝給 pa,和 pb,也是存在副本機(jī)制的。

只不過這里拷貝的是地址而不是值,在內(nèi)部通過指針的解引用操作可以直接訪問 m,n 的內(nèi)存地址,進(jìn)而進(jìn)行交換。

因?yàn)橹羔樂浅V匾越ㄗh你自己運(yùn)行這個程序,可以看到輸出結(jié)果中 pa 指向的是 m 的內(nèi)存地址,而 &pa 是指針變量 pa 的內(nèi)存地址,這兩個千萬不要搞混了。

一定時時刻刻記住下面的結(jié)論:

1. 一個 int 變量有自己的內(nèi)存地址,也有自己存儲的整數(shù)值

2. 一個指針變量有自己的內(nèi)存地址,也有自己存儲的指向地址值

3. 變量在內(nèi)存中都有自己的地址和其存儲的內(nèi)容

3. 函數(shù)的參數(shù)傳遞順序

VC 和 gcc 編譯器計算函數(shù)參數(shù)的順序都是從右向左,這個特點(diǎn)一點(diǎn)要記住,面試可能會問到。

你可以使用下面這個程序去驗(yàn)證,程序比較簡單,留作給你的思考(不去思考就等于浪費(fèi)時間看 cd 這篇文章了):

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 七三零,一三零,二二一 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

好了,今天就到這里。

寫在最后

編程最重要的練,重復(fù)寫。

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,975評論 1 19
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,620評論 3 44
  • C語言是面向過程的,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程...
    小辰帶你看世界閱讀 1,022評論 0 6
  • 看了那么多姑娘的臉,有模特、明星、設(shè)計師、作家。都有自己喜歡的,有的是因?yàn)橐恍┘?xì)節(jié)動作、有的是因?yàn)闅赓|(zhì)。 氣質(zhì)是可...
    Monica在歐洲閱讀 182評論 0 0
  • 在馬里亞納市郊的一家銀行門前,停著一輛寶馬轎車。 這輛轎車是一伙劫匪偷來的,司機(jī)是這個團(tuán)伙中的一員,名叫賈托,負(fù)責(zé)...
    陶心魚閱讀 598評論 0 0

友情鏈接更多精彩內(nèi)容