為什么這么多人學(xué)不會(huì)C語(yǔ)言?
C語(yǔ)言是計(jì)算機(jī)體系結(jié)構(gòu)的基礎(chǔ),很多新人將C語(yǔ)言作為學(xué)習(xí)計(jì)算機(jī)的入門語(yǔ)言。作為新入門的新人,肯定會(huì)感到迷茫,很混亂,這時(shí)我們就需要適當(dāng)?shù)囊龑?dǎo)。本文教你如何滴水不漏地學(xué)完C語(yǔ)言,學(xué)好基礎(chǔ)知識(shí),把握重點(diǎn),不斷深入學(xué)習(xí)。
一、背景
C語(yǔ)言是一門面向過程的、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開發(fā)。它誕生于美國(guó)的貝爾實(shí)驗(yàn)室,是由丹尼斯·里奇以肯尼斯·藍(lán)·湯普森設(shè)計(jì)的B語(yǔ)言為基礎(chǔ)發(fā)展而來。UNIX 系統(tǒng)是世界上第一個(gè)真正的操作系統(tǒng)。而UNIX 操作系統(tǒng)是用C語(yǔ)言編寫的,在當(dāng)時(shí)這個(gè)系統(tǒng)很流行,于是C語(yǔ)言也跟著流行起來。而 UNIX 操作系統(tǒng)是開源的,所以別人要想學(xué)習(xí),就要先學(xué)C語(yǔ)言。B語(yǔ)言被C語(yǔ)言改寫后,C語(yǔ)言流行了而B語(yǔ)言就被淘汰了。而且后來發(fā)現(xiàn),C語(yǔ)言的確非常好,它是面向過程語(yǔ)言的代表,是有史以來最重要的一門計(jì)算機(jī)語(yǔ)言。二、學(xué)習(xí)方法
C語(yǔ)言是計(jì)算機(jī)體系結(jié)構(gòu)的基礎(chǔ),很多新人將C語(yǔ)言作為學(xué)習(xí)計(jì)算機(jī)的入門語(yǔ)言。作為新入門的新人,肯定會(huì)感到迷茫,很混亂,這時(shí)我們就需要適當(dāng)?shù)囊龑?dǎo)。對(duì)于一門語(yǔ)言的學(xué)習(xí),不同的人有不同的方法,不過別人好的學(xué)習(xí)方法我們是可以拿來借鑒參考的。(1)看書
看書就是學(xué)習(xí)基礎(chǔ)知識(shí),學(xué)習(xí)一門語(yǔ)言首先就是學(xué)習(xí)基本語(yǔ)法,學(xué)會(huì)了基礎(chǔ)知識(shí)才能有更加深入的發(fā)展。除了看一些書籍之外,還可以看一些教學(xué)視頻入門,畢竟別人講解演示學(xué)起來更加輕松一點(diǎn)。后文我也會(huì)推薦一些好的學(xué)習(xí)書籍和視頻,供大家參考學(xué)習(xí)。(2)敲代碼
想要學(xué)習(xí)好一門計(jì)算機(jī)語(yǔ)言,光看書籍學(xué)習(xí)知識(shí)點(diǎn)是遠(yuǎn)遠(yuǎn)不夠的。在學(xué)習(xí)知識(shí)點(diǎn)的同時(shí)一定要自己敲代碼進(jìn)行練習(xí)。開始學(xué)習(xí)敲代碼的時(shí)候可以用一些輕便的編譯器,比如Dev C++,熟練了之后可以使用Visual Studio這些較為大型的編譯器。感覺基礎(chǔ)知識(shí)掌握熟練之后,就可以開始接觸算法和數(shù)據(jù)結(jié)構(gòu)之類的,再然后就可以刷題提高水平了。(3)練習(xí)項(xiàng)目
學(xué)習(xí)完基礎(chǔ)知識(shí)我們的目的還是實(shí)踐,所以我們就可以開始練習(xí)一些項(xiàng)目了。比如寫一個(gè)小的記事本、小游戲、計(jì)算器等經(jīng)典的小項(xiàng)目。平時(shí)面對(duì)那些黑框框肯定會(huì)感覺到很枯燥無聊,當(dāng)你做出一個(gè)小作品之后,你就會(huì)很有成就感,這也會(huì)極大的提升你的學(xué)習(xí)興趣。三、學(xué)習(xí)路線
學(xué)習(xí)一門語(yǔ)言先了解此語(yǔ)言的發(fā)展史,早期的C語(yǔ)言功能其實(shí)較為簡(jiǎn)單,隨著應(yīng)用和場(chǎng)景的變化,C語(yǔ)言的功能在不斷升級(jí)變化,功能也越來越強(qiáng)大。正式學(xué)習(xí)C語(yǔ)言之前了解一下計(jì)算機(jī)系統(tǒng)的組成以及工作原理也是很有必要的,除此之外還包括數(shù)據(jù)在計(jì)算機(jī)內(nèi)部的存儲(chǔ)方式,以及進(jìn)制之間的轉(zhuǎn)換。另外很重要的一點(diǎn)就是編譯環(huán)境和編譯器的學(xué)習(xí),學(xué)習(xí)之初可以選擇一些簡(jiǎn)單易上手的編譯器,隨著不斷深入學(xué)習(xí)選擇一個(gè)與時(shí)俱進(jìn)的編譯器也是很重要的。學(xué)習(xí)完這些內(nèi)容之后,我們就可以開始學(xué)習(xí)C語(yǔ)言基礎(chǔ)知識(shí)了。C語(yǔ)言編程離不開數(shù)據(jù),幾乎所有的程序中都會(huì)涉及到數(shù)據(jù),其中包含整型、浮點(diǎn)型、字符串等等。而C語(yǔ)言中存在著兩種表征數(shù)據(jù)的形式:常量和變量。常量可以用來表示數(shù)據(jù)的值,變量不僅可以用來表示數(shù)據(jù)的值,還可以用來存放數(shù)據(jù)。變量是用來存放數(shù)據(jù),運(yùn)算符則是用來處理數(shù)據(jù)。用運(yùn)算符將變量和常量連接起來的符合C語(yǔ)言語(yǔ)法規(guī)則的式子稱為表達(dá)式。學(xué)習(xí)完這些之后,就開始接觸結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)句。C語(yǔ)言基本控制結(jié)構(gòu)有三種,分別是順序控制、循環(huán)控制、選擇控制。程序總是為解決某個(gè)實(shí)際問題而設(shè)計(jì)的,而問題往往包含多個(gè)方面,不同的情況需要有不同的處理,所以這些結(jié)構(gòu)化程序語(yǔ)句在實(shí)際應(yīng)用程序中可以說是無處不在,正確掌握結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)句顯得尤為重要。如果用基本數(shù)據(jù)類型來定義某些變量,那么這些變量在內(nèi)存中將占用各自的內(nèi)存單元,變量之間的制約關(guān)系無法體現(xiàn),不能表現(xiàn)出這些變量之間的關(guān)聯(lián)性,所以我們把這些變量稱為“離散變量”;但是如果我們需要操作100個(gè)或者是更多的數(shù)呢,定義100個(gè)變量就顯得不太現(xiàn)實(shí),這時(shí)我們就引入了數(shù)組。數(shù)組是一組同類型的數(shù)據(jù)項(xiàng)的有序集合,我們就可以把100個(gè)要定義的變量存放到數(shù)組中。學(xué)習(xí)指針是學(xué)習(xí)C語(yǔ)言最重要的一環(huán),能否正確地理解和使用指針是掌握C語(yǔ)言的一個(gè)標(biāo)志,可以說不懂C語(yǔ)言的指針就不懂什么是C語(yǔ)言。指針也是C語(yǔ)言中最難學(xué)的一部分,學(xué)習(xí)時(shí)除了要正確理解基本概念,還必須要多編程,多上機(jī)敲代碼,只要做到這些,指針也是不難掌握的。前面介紹的都是簡(jiǎn)單的數(shù)據(jù)類型,只能定義一些簡(jiǎn)單的數(shù)據(jù)信息。對(duì)于復(fù)雜的數(shù)據(jù)信息是無法用前面所學(xué)的某個(gè)單一數(shù)據(jù)來定義的,必須使用C語(yǔ)言中提供的復(fù)雜數(shù)據(jù)類型來定義。復(fù)雜數(shù)據(jù)類型是C語(yǔ)言提供的不同于簡(jiǎn)單數(shù)據(jù)類型的又一數(shù)據(jù)類型,它極大地豐富了C語(yǔ)言對(duì)數(shù)據(jù)信息的處理能力。3.1 C語(yǔ)言基礎(chǔ)第一部分是C語(yǔ)言基礎(chǔ),包括預(yù)處理指令、函數(shù)、變量和語(yǔ)句。即使是編寫最簡(jiǎn)單的C語(yǔ)言程序,也是會(huì)用到這些基本概念。用一個(gè)經(jīng)典的c語(yǔ)言程序,介紹c語(yǔ)言的基本構(gòu)成、格式,使我們對(duì)c語(yǔ)言有個(gè)初步認(rèn)識(shí)。一個(gè)C語(yǔ)言程序只有一個(gè)主函數(shù),程序執(zhí)行時(shí)從主函數(shù)開始,在主函數(shù)內(nèi)結(jié)束;函數(shù)由函數(shù)說明和函數(shù)體兩部分構(gòu)成;函數(shù)說明部分包含了對(duì)函數(shù)名,函數(shù)類型,函數(shù)參數(shù)等的定義和說明;函數(shù)體包含了變量說明和執(zhí)行語(yǔ)句。3.2 選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)
C語(yǔ)言中有三大結(jié)構(gòu),分別是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。C語(yǔ)言順序結(jié)構(gòu)就是讓程序按照從頭到尾的順序依次執(zhí)行每一條C語(yǔ)言代碼,不重復(fù)執(zhí)行任何代碼,也不跳過任何代碼。C語(yǔ)言選擇結(jié)構(gòu)也稱分支結(jié)構(gòu),就是讓程序“拐彎” ,有選擇性的執(zhí)行代碼;換句話說,可以跳過沒用的代碼,只執(zhí)行有用的代碼。C語(yǔ)言循環(huán)結(jié)構(gòu)就是讓程序“殺個(gè)回馬槍”,不斷地重復(fù)執(zhí)行同一段代碼。順序結(jié)構(gòu)很好理解,無需過多闡述,簡(jiǎn)單概述一下選擇語(yǔ)句和循環(huán)語(yǔ)句。其中有兩個(gè)選擇語(yǔ)句,if語(yǔ)句和switch語(yǔ)句。循環(huán)語(yǔ)句有三種,for循環(huán)語(yǔ)句,while循環(huán)語(yǔ)句,do……while循環(huán)語(yǔ)句。
3.3 數(shù)組
數(shù)組就是一列具有相同類型的數(shù)據(jù)的集合,這些數(shù)據(jù)在內(nèi)存中依次挨著存放,彼此之間沒有縫隙。C 語(yǔ)言數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。數(shù)組分為一維數(shù)組和二維數(shù)組,當(dāng)數(shù)組中每個(gè)元素都只帶有一個(gè)下標(biāo)時(shí),稱這樣的數(shù)組為一維數(shù)組,一維數(shù)組實(shí)質(zhì)上是一組相同類型數(shù)據(jù)的線性集合。二維數(shù)組本質(zhì)上是以數(shù)組作為數(shù)組元素的數(shù)組,即“數(shù)組的數(shù)組”。3.4 函數(shù)
每個(gè)C程序都至少有一個(gè)函數(shù),即主函數(shù) main() ,如果程序的任務(wù)比較簡(jiǎn)單,全部的代碼都寫在main()函數(shù)中,但是,在實(shí)際開發(fā)中,程序的任務(wù)往往比較復(fù)雜,如果全部的代碼都寫在main()函數(shù)中,main()函數(shù)將非常龐大繁雜,結(jié)構(gòu)混亂。我們可以根據(jù)程序的邏輯和任務(wù)的分工把代碼劃分到不同的自定義函數(shù)中,main()函數(shù)更關(guān)心業(yè)務(wù)邏輯和處理流程,需要執(zhí)行具體任務(wù)的時(shí)候,調(diào)用其他的自定義的函數(shù)就可以了。引入函數(shù)得本質(zhì)就是把一個(gè)復(fù)雜的任務(wù)分解為子任務(wù),每一個(gè)子任務(wù)都是一個(gè)較小的功能模塊,通過實(shí)現(xiàn)這些小功能模塊來實(shí)現(xiàn)復(fù)雜的問題,從而使得比較復(fù)雜的問題變得簡(jiǎn)單。3.5 指針
沒學(xué)指針就是沒學(xué) C 語(yǔ)言!指針是 C 語(yǔ)言的精華,也是 C 語(yǔ)言的難點(diǎn),破解 C 語(yǔ)言指針,會(huì)讓你的 C 語(yǔ)言水平突飛猛進(jìn)。所謂指針,也就是內(nèi)存的地址;所謂指針變量,也就是保存了內(nèi)存地址的變量。不過,人們往往不會(huì)區(qū)分兩者的概念,而是混淆在一起使用,在必要的情況下,大家也要注意區(qū)分。關(guān)于指針我們需要重點(diǎn)學(xué)習(xí)的內(nèi)容有指針與地址、指針與函數(shù)參數(shù)、指針與數(shù)組、指針數(shù)組以及指向指針的指針和指向函數(shù)的指針等等。3.6 結(jié)構(gòu)體
C 語(yǔ)言結(jié)構(gòu)體從本質(zhì)上講是一種自定義的數(shù)據(jù)類型,只不過這種數(shù)據(jù)類型比較復(fù)雜,是由 int、char、float 等基本類型組成的。你可以認(rèn)為結(jié)構(gòu)體是一種聚合類型。結(jié)構(gòu)體部分重點(diǎn)學(xué)習(xí)包括結(jié)構(gòu)體的定義方法、結(jié)構(gòu)體的引用方法、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的概念及應(yīng)用、結(jié)構(gòu)體與函數(shù)。在實(shí)際開發(fā)中,我們可以將一組類型不同的、但是用來描述同一件事物的變量放到結(jié)構(gòu)體中。例如,在校學(xué)生有姓名、年齡、身高、成績(jī)等屬性,學(xué)了結(jié)構(gòu)體后,我們就不需要再定義多個(gè)變量了,將它們都放到結(jié)構(gòu)體中即可。四、學(xué)習(xí)資料
4.1 經(jīng)典書籍
《C Primer Plus(第6版)中文版》是非常經(jīng)典的一本書籍,此書共17章。第1、2章介紹了C語(yǔ)言編程的預(yù)備知識(shí)。第3~15章詳細(xì)講解了C語(yǔ)言的相關(guān)知識(shí),包括數(shù)據(jù)類型、格式化輸入/輸出、運(yùn)算符、表達(dá)式、語(yǔ)句、循環(huán)、字符輸入和輸出、函數(shù)、數(shù)組和指針、字符和字符串函數(shù)、內(nèi)存管理、文件輸入輸出、結(jié)構(gòu)、位操作等。第16章、17章介紹C預(yù)處理器、C庫(kù)和高級(jí)數(shù)據(jù)表示。本書以完整的程序?yàn)槔v解C語(yǔ)言的知識(shí)要點(diǎn)和注意事項(xiàng)。每章末設(shè)計(jì)了大量復(fù)習(xí)題和編程練習(xí),幫助讀者鞏固所學(xué)知識(shí)和提高實(shí)際編程能力。附錄給出了各章復(fù)習(xí)題的參考答案和豐富的參考資料。《C和指針》本書提供與C語(yǔ)言編程相關(guān)的全面資源和深入討論。本書通過對(duì)指針的基礎(chǔ)知識(shí)和高級(jí)特性的探討,幫助程序員把指針的強(qiáng)大功能融入到自己的程序中去。全書共18章,覆蓋了數(shù)據(jù)、語(yǔ)句、操作符和表達(dá)式、指針、函數(shù)、數(shù)組、字符串、結(jié)構(gòu)和聯(lián)合等幾乎所有重要的C編程話題。書中給出了很多編程技巧和提示,每章后面有針對(duì)性很強(qiáng)的練習(xí),附錄部分則給出了部分練習(xí)的解答。本書適合C語(yǔ)言初學(xué)者和初級(jí)C程序員閱讀,也可作為計(jì)算機(jī)專業(yè)學(xué)生學(xué)習(xí)C語(yǔ)言的參考。4.2 學(xué)習(xí)視頻
現(xiàn)在網(wǎng)絡(luò)如此發(fā)達(dá),網(wǎng)上的學(xué)習(xí)資源也是非常的豐富。大家可以自行上網(wǎng)查找適合自己的學(xué)習(xí)視頻,這里給大家推薦的是大學(xué)MOOC上的浙江大學(xué)翁愷老師講的C語(yǔ)言程序設(shè)計(jì)。這位老師講課非常的不錯(cuò), C語(yǔ)言基礎(chǔ)理論知識(shí)講解完善;循序漸進(jìn),從易到難,學(xué)習(xí)很輕松;語(yǔ)言組織嚴(yán)謹(jǐn),風(fēng)趣,很容易接受,讓你有一直學(xué)下去的動(dòng)力。4.3 華為云C++語(yǔ)言實(shí)戰(zhàn)進(jìn)階學(xué)習(xí)資源(免費(fèi))
本課程從基礎(chǔ)語(yǔ)法、 面向?qū)ο筇匦浴?異常處理、 模板編程基礎(chǔ)、 C++11新特性、STL標(biāo)準(zhǔn)庫(kù)容器和算法、并發(fā)編程、 C++未來發(fā)展趨勢(shì)幾大模塊解構(gòu)知識(shí)點(diǎn),實(shí)戰(zhàn)場(chǎng)景+學(xué)習(xí)+練,精煉干貨講解幫助你快速掌握知識(shí)短板。立即點(diǎn)擊報(bào)名學(xué)習(xí)五、結(jié)語(yǔ)
C語(yǔ)言是國(guó)際上最流行的、應(yīng)用最廣泛的高級(jí)編程語(yǔ)言之一。時(shí)至今日,它依然保持著旺盛的生命力,深受廣大程序員的歡迎。作為一種“個(gè)性鮮明”的編程語(yǔ)言,C語(yǔ)言既具有高級(jí)語(yǔ)言的優(yōu)點(diǎn),又有著低級(jí)語(yǔ)言的特性。很多大學(xué)或者是新入門的程序員都將C語(yǔ)言作為學(xué)習(xí)計(jì)算機(jī)的入門語(yǔ)言,學(xué)好C語(yǔ)言顯得尤為重要。我們一定要學(xué)號(hào)基礎(chǔ)知識(shí),把握學(xué)習(xí)重點(diǎn),不斷深入的學(xué)習(xí)。本文分享自華為云社區(qū)《【云駐共創(chuàng)】如何滴水不漏地學(xué)完C語(yǔ)言?》,作者:靜Yu 。