你覺不覺得c語言基礎知識概念在頭腦裡沒有形成知識體系?是否比較模糊比較亂?這就對了?我之前也是,有些知識點時間長了容易忘或者混淆,有些初學者抓不住重點覺得c語言複雜,難!實不相瞞,我也是這樣的感受,於是我想是時候整體的把c語言給好好的總結一下了,這樣形成乙個知識體系,就不容易忘,也不容易混淆,這就是這次總結的意義所在。函式意義、
函式引數、
函式設計原則、
函式與巨集
分為幾個板塊總結:資料型別、指標與陣列、字串、多維指標與多維陣列、函式、記憶體分配與操作問題、符號總結、控制語句、以及編譯方面的問題。
總結宗旨:絕不專牛角尖!主要圍繞常用應用知識為主,突出重點,能夠很好的形成知識架構。比如:總結了float一般就不會再總結double,這樣做沒有多大意義,相反的,把重要的拿出來好好分析一下,是很有意義的,而相似的東西就可以舉一反三了。實際上就這些知識點,概念搞明白後,c語言就通透多了
1.計算機發展初期,人們認為:程式 = 資料 + 演算法;由此推導出:c程式 = 資料 + 函式;
2.初期程式採取模組化設計,即:複雜的問題分解為一系列簡單的問題來解決。c語言中的模組化則由函式來代表,分為各種模組函式,然後組成程式,這就是面向過程的思維;面向過程是一種以過程為中心的程式設計思想;首先將複雜的問題分解為乙個個容易解決的問題,分解後的問題可以按照步驟一步步完成,函式是面向過程在c語言中的體現,解決問題的每個步驟可以用函式來實現。
3.函式宣告:告訴編譯器程式單元的存在;函式定義:明確指示程式單元的意義;嚴格意義上的宣告與定義並不相同。c語言中通過extern進行程式單元宣告,而一些程式單元在宣告時可以省略extern。
1.函式引數在本質上與區域性變數相同,都是在棧上分配空間,函式引數的初始值是函式呼叫時的實參值 函式引數的求值順序依賴於編譯器的實現,程式中存在一定的順序點,順序點指的是執行過程中修改變數值的最晚時刻,在程式到達順序點的時候,之前所做的一切操作必須完成,
c語言中的順序點:
2.陣列引數:c語言中只會以值拷貝的方式傳遞引數,如果當向函式傳遞陣列引數時:會將整個陣列拷貝乙份傳入函式,此時引數傳遞的時候如果拷貝整個陣列,那麼執行效率會大大下降,並且引數位於棧 上,太大的陣列拷貝將導致棧溢位。因此:每個完整表示式結束時,即分號處;
&&,||,? : ,以及逗號表示式的每個引數計算之後;
函式呼叫時所有實參求值完成後(進入函式體之前);
陣列引數會退化為指標,此時將陣列名看作常量指標傳陣列首元素的位址.
2.二維陣列引數同樣存在退化的問題:二維陣列可以看作是一維陣列,二維陣列中的每個元素是一維陣列
void f(int a[5]) <–> void f(int* a);
void g(int a[3][3]) <–> void g(int (*a)[3]);
3.指標引數:與一般的傳值方式一樣,拷貝的是指標變數的值,即位址;指標本身是沒有改變的,因此傳指標引數的目的:在函式體內部用*號即可改變指標引數所指向的函式外部的值,或者使用外部的值。
注意:這個與在函式體內部宣告指標變數是不一樣的。
設計函式的時候應該注意的點:
函式與巨集的區別:
以上總結以c語言知識框架為主線,著重強調實際經常應用!反覆瀏覽體會可牢記,形成自己的知識框架,然後靈活應用,知識點**於狄泰軟體學習總結所得。
關於C語言中的memset函式
1.對於陣列初始化為0操作,常用 memset a,0,sizeof a 替代迴圈 for i 0 i2.將陣列初始化為無窮大的情況,例如floyd演算法。通常對於 32位int有符號數,我們將 無窮大inf 設為 0x3f3f3f3f define inf 0x3f3f3f3f 為什麼不設 inf...
C語言中的內聯函式(總結)
c語言本身不支援內聯函式,但是新的c標準c99中,支援了內聯函式。引入內聯函式的目的是為了提高程式中函式呼叫的效率。函式呼叫,實際上是將程式執行的順序轉移到被呼叫的函式所在的記憶體位址,將函式執行完後,再返回到原來的位址繼續往下執行,因此需要保護現場並記憶執行的位址,還要恢復現場。因此,函式呼叫需要...
C語言中庫函式總結
sprintf include include intmain atoi 範圍 0 9,大於這個範圍,例如 a 97 a 65,返回值為0 123c5 返回值為123。include include include intmain malloc 安全程式設計規範是否要判斷分配之後的返回值 經常用於字...