自學C語言的最大難題是什麼?

數學問題


萬事開頭難,自學C語言最大的困難在於遇到問題不知道如何解決,還有不知道學到什麼程度才能找到工作,這是自學編程語言最大的障礙,學到中間不知道什麼時候是個頭,遇到問題沒有解決的途徑,這是自學過程中遇到的最大問題,但這種不能歸結為自學中遇到的難題,應該準確來講是學習編程都會遇到的問題,和具體學習什麼編程語言並沒有太直接的關係,學習任何編程語言都會存在這種疑惑。

從事C語言編程開發已經有十幾年,這門編程語言從入門的難易程度看並不是最難的,語法相對比較少,但C語言最大的特別是組合非常靈活多變,好多初學者學完基本的語法,覺得這門編程語言的代碼應該都能看懂,曾經在學習初期學完語法之後去圖書館借了本linux內核解析去閱讀,在開始階段還是信心滿滿,結果看了幾十頁之後就開始有懷疑人生的感覺,又老老實實還回圖書館了,繼續基礎知識的學習之中了,C語言的理論掌握了距離真正的實踐還是有很大的差距,實踐是永遠無法取代的過程。

C語言核心語法屈指可數,指針,函數,結構體,以及內存管理再加上常見的數據結構,說起來就是簡單幾句話的事情,但在實際過程中不斷在實際操作中完成一個個編程場景的試驗,不斷在編程思路中填充編程脈絡,就拿網絡編程例子來講,如果用C語言去完成需要對socket編程有所瞭解,socket編程屬於操作系統的知識,編程的過程不僅僅是編程語言語法的問題,還會涉及到用戶的使用習慣,以及編程的環境,常見的編程語言還有linux,windows,mac三種,不同的操作系統api的使用習慣也是不相同,編程語言的學習需要對編程環境有一個適應的階段。

C語言的學習最快的方法就是直接在項目中實戰,但是這種機會不是每個人都能涉獵到,參加培訓的機構中也會竭盡全力在模擬這個過程,在自學的過程中也會不斷的嘗試在開源社區中尋找實戰的味道,在真正項目實戰中不斷的總結經驗,現在編程入門的門檻已經提升了許多,在十年前C語言學點基本的語法就能找到個工作去參與到實踐中去,但現在已經沒有那麼好的機會了,這也是行業成熟進步的一種標記。

學習編程語言沒有什麼竅門,就是在實踐過程中,不停的折騰摸索,遇到困難也是很正常的事情,保持一顆平常心,用不到兩年的時間就能找到這門語言編程的感覺。C語言在嵌入式以及通信領域使用的比較多,安裝一個linux系統在裡面就可以找到很多實踐的機會,很多linux命令底層的實現就是C語言,可以找這方面的資料去學習,在不斷的學習過程中培養自己的學習興趣,如果本身對於編程有興趣可以繼續保持,沒有興趣想辦法培養興趣,希望能幫打你。


大學生編程指南


c語言最大的難題是指針和內存,這是難倒眾多新手的關鍵地方,指針本身其實不難,難的是在開發中指針的邏輯變化。

指針移動


int * ip = NULL;

ip += 1; // ip - NULL = 4

void * vp = NULL;

vp += 1; //編譯錯誤!


指針轉換移動


unsigned int i = 0;

unsigned char *p = (unsigned char *)&i;

*(p + 0) = 255;

*(p + 1) = 255;

*(p + 2) = 255;

*(p + 3) = 255;


指針指向內存邊界


int arr[] = {0};

*(arr + 1) = 1314; //超出邊界

arr++; //不允許++


堆棧內存問題

棧主要是用於邏輯計算、數據交換等,以及函數內定義的臨時變量,這部分變量只會在當前作用域有效。堆內存通過malloc開闢,數據則是在一直存在,除非free和退出程序。

1、注意棧溢出,不要把內存開銷大的結構定義在棧上,因為棧的空間很小。

2、注意被調函數變量分配,防止返回臨時變量地址給外部操作。

多級指針難點

多級指針的互相操作很容易懵圈,需要一級一級的查找地址,特別要認真和細心。

野指針


int * i = (int *)malloc(sizeof(int));

free(i);

*i = 10;


野指針是致命問題,能夠直接讓程序崩潰。這只是一個簡單的程序,當代碼變得非常複雜的時候,容易出錯的幾率更大。

棧作用域(有問題)


char* getstr()

{

    char str[] = "abc";

    return str;

}

char * p = getstr();


常量區作用域(沒問題)


char* getstr()

{

    char * str = "abc";

    return str;

}

char * p = getstr();


總結

c 和 c++固然難學,只要用心去學習和理解,終會學會的!


cpp架構


萬事開頭難,只怕有心人。只要你真正感興趣,肯定能學好。

從一個大學學習過來人,和有幾年編程工作經驗者的角度講講我的經驗。

我對題主問題的審題,理解題主可能是想學,沒有人教,只能自學,但不知道方法,同時擔心最難的地方搞不定。我來談談學習方法和最難的地方。

學習方法:買一本經典大學c語言教程(譚浩強版本),頭一個月粗略讀一遍,此一邊不求完全看懂,只求對c語言編程有個全面瞭解。重點必須做的兩件事情。

第一.每一章節中的程序代碼一定要在電腦上抄一邊,並且保證能正常運行,你會發現看不懂的東西,再敲代碼的過程中就懂了。類似跟學自行車,學再多理論,比如實際去騎車,摔幾次就會啦。也代碼也是一樣,你在調式代碼的時候慢慢就理解了會寫啦。

第二.把你不懂的知識點,在書本中圈出來,理解的要點不管對錯都寫下來(便於回頭看的時候,對比糾正加深理解)。然後繼續往後讀,不要死盯一點不往前走。你會慢慢發現後面和前面有連貫的地方,也有不連貫的。回頭再往前看,前面的知識其實很好理解。

在大學裡面,讀完一遍差不多一到兩個月後,再精讀一遍。

最難的知識點:指針是最難得,一維、二維、多維。一輪輪搞下來,都會暈。沒有計算機基礎的同學,對存儲、地址這樣的概念比較難理解。因為沒有直觀的東西給你們看。有個好辦法幫助理解:把存儲介質想象成圍棋盤。每一個格子代表一個字節存儲空間,有獨立的地址編號。一行代表一維,一個面(整個棋盤)代表二維,如果三維就是隻有一行的棋盤和另外一個完整棋盤疊加,四維就是兩個完整期盼疊加,依次類推。用一根萬能筆代表指針,這根筆有讀的功能、寫的功能、擦除的功能等(給指針一個地址和一個命令,就可以幹相應的事)。然後結合實際例子,根據上面理解方法在腦子中算出程序結果,最後運行程序驗證理解的正確性。

有什麼問題,歡迎大家留言,一起交流學習。


玩編程


最困難的地方是學了半天都還沒法看到實際應用的效果,不像學HTML,兩天就能看到一個網頁…學Python,兩天就能抓個文件,學才C#,兩天就可會做個窗體。

學C,如果你不是能夠享受算法樂趣學霸,想看個網頁少說需要一兩個月吧…


成都茂大叔


學c最大的難題是語言之外的東西,c要寫得好,你必須得懂計算機,懂CPU,懂內存,懂cache,懂指令集,不一定能熟練寫彙編,但至少得知道彙編是什麼,得懂堆棧,得了解編譯器。如果這些你都懂得差不多了,那指針之類的簡直就是小兒科,水到渠成自然就懂了。


涇渭漳淮


自學C語言的最大難題是什麼?大家都回答說是指針,我有不同的觀點。

C語言是緊緊貼合硬件的高級語言,因此要精通C語言,從根本上說,是熟悉硬件。指針本質上就是內存地址的索引嘛,然而內存是怎麼回事,它是怎麼排列的,字節對齊是怎麼工作的,這些都是計算機硬件層面的事情。學好C語言,不懂硬件是不可能的。因此,除了計算機和電子/通信專業以外的人,很少有人真正精通C語言的。

我也不建議科班以外的人來學習,學習其他高級語言就行了,比如Python和Java。


聊科技愛生活


其實C語言最難點在指針部分,指針的操作有跟數據結構有內在關聯,更深的涉及算法。


塞納河水10000


我覺的最大的難點是與實際向聯繫,光學語法,算法都沒大用,一遇到實際問題,不懂的,有什麼用,要理論與與實踐向結合,才學的快,學出來才有用


月飲沙丘


掌握基礎知識並不難,寫程序難在解決問題的思路和方法。請參看我的一系列C語言講解視頻


嵌入式經驗分享


看你懶不懶,沒啥難的,學一門計算機語言簡單,寫好程序難。你會說話,但你不是作家,寫不出優美的詞句。


分享到:


相關文章: