C語言使用函數必須知道的3點注意事項!

C語言是面向過程的,而C++是面向對象的

C和C++的區別:

C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”。

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


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

大家在高中的時候都求過數學函數的表達式,其實編程語言的函數與數學表達式實際上是一樣的。

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


就類似給函數一個 x 值,可以求結果一樣,給函數一些輸入參數,也可以得到相同的輸出結果。

C/C++交流裙815393895


1. 模塊化編程

為什么要使用函數呢?其實是為了更好的維護軟件的功能以及實現模塊化編程。

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

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

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


2. 函數的副本機制

很多初學者都搞不清楚函數的副本機制,例如下面的交換函數:


這個函數是錯誤的,因為函數在進行參數傳遞的時候,會將傳入參數 m,n 的值拷貝給函數的形式參數 a,b。

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

函數的副本機制從內存的角度來說就是:在函數進行參數傳遞的時候,實參和形參的內存地址是不同的。

這是這個例子的輸出結果,每個人的機器可能都不同:

C/C++干貨裙815393895
可以看到變量 m 和 a,以及 n 和 b 的內存地址均不同,因此對值的交換也是不起作用的。

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


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

因為我們這里傳遞的是 m,n 的內存地址,即傳遞的是指針,所以在函數內部對指針解除引用就可以直接訪問這個地址的內容了,這是指針提供的特性。

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

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

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

因為指針非常重要,所以建議你自己運行這個程序,可以看到輸出結果中 pa 指向的是 m 的內存地址,而 &pa 是指針變量 pa 的內存地址,這兩個千萬不要搞混了。

一定時時刻刻記住下面的結論:

1. 一個 int 變量有自己的內存地址,也有自己存儲的整數值

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

3. 變量在內存中都有自己的地址和其存儲的內容

C/C++交流裙815393895
3. 函數的參數傳遞順序

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

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


好了,今天就到這里。

寫在最后

編程最重要的練,重復寫。
作者:CC我的
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言/C++編程學習:C語言環境設置!

C語言是面向過程的,而C++是面向對象的 C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得…

C語言指針原來也可以這么的通俗易懂!

C語言是面向過程的,而C++是面向對象的 C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得…

C語言過時了?你在做夢?

為什么要使用C語言? 在過去的四十年里,C語言已經成為世界上最流行、最重要的一種編程語言。 C是一種融合了控制特性的現代語言,而我們已發現在計算機科學的理論和實踐中,控制特性是很重要的。其設計使得用戶可以自然地采用自頂向…

C/C++的轉義字符詳解

所有的ASCII碼都可以用“\”加數字(一般是8進制數字)來表示。而C中定義了一些字母前加"\"來表示常見的那些不能顯示的ASCII字符,如\0,\t,\n等,就稱為轉義字符,因為后面的字符,都不是它本來的ASCI…

C語言深入理解!助你向大佬邁進!

Dennis Ritchie 過世了,他發明了C語言,一個影響深遠并徹底改變世界的計算機語言。一門經歷40多年的到今天還長盛不衰的語言,今天很多語言都受到C的影響,C,Java,C#,Perl, PHP&#xf…

【初涉C語言】程序員歡迎來到C語言的世界!

計算機發展史 機器語言所有的代碼里面只有0和1優點:直接對硬件產生作用,程序的執行效率非常高缺點:指令又多又難記、可讀性差、無可移植性匯編語言符號化的機器語言,用一個符號(英文單詞、數字)來代表一條…

C語言和C++的區別整理詳解!

c和c主要區別 根據書中的描述,進行了整理 推薦一個我自己的C/C交流裙815393895 1、 源代碼文件的擴展名 摘自1.4.1 C實現源代碼文件的擴展名UNIXC、cc、cxx、cGNU CC、cc、cxx、cpp、cDigital Marscpp、cxxBorland CcppWatcomcppMicrosoft Visual Ccpp、cxx、cc…

揭示C語言函數調用的本質解析

C語言是面向過程的,而C++是面向對象的C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到…

C語言的關鍵字和詳細介紹

C語言是面向過程的,而C++是面向對象的C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到…

【C語言簡介】C語言的前世今生

C語言的發展歷史: 20世紀70年代初,貝爾實驗室的Dennis Richie 等人在B語言基礎上開發出C語言,最初是作為UNIX的開發語言; 20世紀70年代末,隨著微型計算機的發展,C語言開始移植到非UNIX環境中,并…

C語言/C++編程學習:不找C/C++的工作也要學C/C++的原因

C語言是面向過程的,而C++是面向對象的 C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得…

C\C++中聲明與定義的區別

C語言是面向過程的,而C++是面向對象的 C和C的區別: C是一個結構化語言,它的重點在于算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得…

C++ 虛函數和虛繼承解析

本文針對C里的虛函數,虛繼承表現和原理進行一些簡單分析,有不對的地方請指出。下面都是以VC2008編譯器對這兩種機制內部實現為例。 有喜歡或者想學習C/C的朋友加一下我的C/C交流群815393895。謝謝大家的支持 虛函數 以下是百度百科對于虛函數的解釋&a…

【網絡攻防】精通C語言的黑客才是真正的黑客!

精通C語言的黑客才是真正的黑客 黑客界,有兩樣重要的課程,一是計算機的本質,二是編譯原理。相對于匯編等底層語言,它簡單;相對于其它高級語言,它更為接近計算機;同樣它對黑客的兩大課程很有幫助…

我兩小時學完指針,你學會數組/指針與函數需要多久?

數組與函數: 這段函數中 函數的參數是數組,注意數組作為函數參數時,數組名和數組元素個數時分別傳遞的。 指針與函數: 這段函數中的參數是指針變量,傳入的是數組的數組名或者首元素的地址,然后用引領操作…

【C語言】C語言結構解析

C 程序結構 在我們學習 C 語言的基本構建塊之前,讓我們先來看看一個最小的 C 程序結構,在接下來的章節中可以以此作為參考。 喜歡編程的或者想學習編程的朋友可以加一下我的C語言編程交流群815393895,謝謝大家的支持 C Hello World 實例 C…

每一個程序員都是自學成才?

為什么CS學位并非是成為開發人員的唯一路徑,因為每個開發人員在工作于他們的項目時學到了很多很多。 學習編程并不難 有興趣學習或者已經在學習C語言的朋友可以加一下我的編程交流群815393895 除了CS學位,還有很多成為程序員的方法。如果你正行進在一…

不妨問問自己,學習C語言是為了什么?

1、首先是雞湯,也就是為什么要學C語言。你可以先問自己,為什么我要學C語言?是為了應付考試,還是為了應聘,還是為了提高自己的編程能力。我想說的是,如果你打算以后長期從事計算機方面的工作,你就…

C語言靈魂——算法!

程序的靈魂—算法 一個程序應包括: 對數據的描述。在程序中要指定數據的類型和數據的組織形式,即數據結構(data structure)。 對操作的描述。即操作步驟,也就是算法(algorithm)。 Nikiklaus Wir…

為什么會有那么多人放棄編程?

為什么許多編程人員最后都放棄了呢?小編幫你理清下原因,主要有以下幾個 為什么這么多人選擇放棄學習編程? 加班加點是家常便飯 在軟件行業不加班的公司不是很多,區別就是加班強度。為什么程序員需要加這么多班,軟件是一…