c語言學習總結(個人向,完結篇)

(個人向)
C語言總結報告
2019-1-10

目錄
1編程習慣和認識
2關於代碼結構
3數據及其類型
4字符串
5除字符串外的數據輸入
6運算符表達式和語句
7指針
8函數
9儲存類別,鏈接和生存週期
10結構體
11文件
12緩衝區

  1. 編程習慣和認識
    代碼的測試和維護,可運用註釋,debug等,但是我個人比較常用註釋,有些時候debug不如註釋好用。
    關於寫代碼,主要是培養自己一個良好的代碼習慣,相同等級的代碼向左對正,適當的時候選用註釋,儘量少用或者不用名字簡單的變量,爲增強可讀性,可以適當選擇合適的方式和結構。寫出的代碼可讀性是判斷代碼好壞的一個很重要的標準。

  2. 關於代碼結構
    2.1選擇結構
    2.2循環結構
    2.3順序結構
    關於這三個結構,是比較基本的想法,循環結構裏面會涉及到遞歸,遞歸雖然想法簡單,但是會消耗大量計算機內存,建議用這三個基本結構。

  3. 數據及其類型
    基本數據類型有整形,浮點型,邏輯型,字符型。數據分兩種,變量和常量,每一個數據都有自己的數據類型,每個數據類型都擁有自己各自的範圍。
    關於stdint.h和inttypes.h這兩個頭文件,在c99之後,工會講這兩個頭文件加入c語言,如果使用的時候數據類型溢出或者範圍不夠,可以選擇這兩個頭文件,計算機會把int32_t作爲int的別名,並且數據範圍相比普通int大很多,使用int32_t的時候,計算機會自動替換成與系統相匹配的類型。有些特定的情況下,爲了追求計算機運行的速度,inttypes.h被系統定義爲對各種系統運行最快的類型。
    有一類特殊的字符叫轉義序列,用於表示一些行爲:(以/開頭)
    \a 警報(ANSI C)
    \b 退格
    \f 換頁
    \n 換行
    \r 回車
    \t 水平製表符
    \v 垂直製表符
    \ 輸出反斜槓(\)
    \’ 輸出單引號(’)
    \” 輸出雙引號(”)
    ? 輸出問號(?)
    \0oo 八進制值(oo必須是有效的八進制數,即每個o代表0-7的數字)
    \xhh 十六進制值(hh必須是有效的十六進制數,即每個h都代表0-f中的一個數)

  4. 字符串
    4.1輸入輸出
    關於字符串輸入有幾種方式。gets()函數用於將緩衝區內的字符打入所需要的數組裏面,但是不考慮是否溢出的問題。C99後將fgets()加入並且規定輸入的最大字數,讓程序員自己控制所輸入的長度,相比gets()更加先進。也可以不運用c語言本身的輸入函數,可以將自己的想法寫成一個屬於自己的輸入函數(用於解決各種問題,比如排除字母只留下數字的輸入,這些問題都可以通過自己編寫來解決)還有就是是scanf()函數,這個函數可以用來輸入各種各樣的數據,用於輸入字符串的就是scanf(”%s”)來輸入,遇到空格或者回車等停止輸入。
    關於字符串輸出,輸出方式多和輸入方式配套使用。gets()和puts(),fgets()和fputs(),scanf()和printf(),使用配套的輸出方式可以免去很多麻煩。
    關於特殊的輸入sprintf(),頭文件在stdio.h中而不是在string.h中,函數和printf()類似但是作用不同,sprintf是將數據寫入字符串這點需要注意。
    4.2字符串函數
    處理字符串運用字符串函數相比自己寫會簡單很多,在頭文件中加入string.h就可以使用這些文件,包括計算長度的strlen()函數,用於拼接的strcat()strncat(),用於比較的strcmp(),用於拷貝的strcpy()strncpy()等等。(加紅標註的是前面字符串函數的高級形式,可以解決文件溢出等其他問題,相比於前面的函數,使用這些函數更加安全。)

  5. 除字符串外的數據輸入

5.1字符輸入

字符輸入一般用getchar()進行輸入,和putchar()配套使用,字符指的是在ascll碼錶中的字符。
輸入也可以用scanf(),scanf(”%c”)用於輸入一個字符。

5.2其他類型的數據輸入

關於常量,在定義之後可以直接賦值(int a=10;int b,b=10;)這樣的。
關於變量要從鍵盤輸入,一般使用scanf()進行輸入,各種數據類型所用的格式也不同。
Int:%d;	long int:%ld
Float:%f	double:%lf
_Bool:true/false(bool變量比較特殊,c99之後加入,本質上是int類型,多用於判斷條件) 
Unsign的標誌數據,在各自類型輸入的格式加入u,進行改變。

6.運算符表達式和語句

6.1基本運算符號
賦值運算符(=)這個等於號在計算機代碼裏面作用和數學上面不太一樣,但是基本相同,(=)可以用作將(=)右邊的值賦值給左邊,不代表相等。
(-,+,,/)相對應的就是數學上的加減乘除。
除了這些基本符號之外,還有一些常用的符號:(%)取餘數;(&)取地址符號,(!)表示否定常用於(!=不等於);(++,–)對自身經行加1或者減1的操作。
6.2優先級
最基本的就是(
,/)優先級大於(+,-),小括號優先級最高,(++,–)位於兩個中間,簡單來說就是如此,對於(++,–)來說,和(,/)在一起運算的時候,如何運算會顯得奇怪:比如3a++和3*++a,這兩個意思是不一樣的,爲了避免理解錯誤,請加上小括號。還有兩條關於遞增遞減的建議:
·如果一個變量出現在一個函數的多個參數中,不要對該變量使用遞增或遞減運算符。
·如果一個變量出現在一個表達式中,不要對該變量使用遞增或遞減運算符。
6.3類型轉換
(int)這樣的用()加上類型表示強制轉換,將目標數據轉換爲所需要類型的數據。
將小範圍數據擴大爲大範圍的沒有問題(將int轉換爲long int),只是將儲存該數據的內存擴大來存放。
但是將範圍大的數據向小範圍來轉換就有可能出現數據丟失的問題(double變int就可能將小數範圍丟掉),會引起一些問題,使用的時候請注意。
7指針
7.1指針用法和理解
指針是指向一塊數據的存放該數據地址的東西。類似int類型變量的值是整數,而指針變量的值是地址。可以通過指針直接對這塊內存上面的數據進行修改,和函數,結構體連用的時候可以有很好的效果。
7.2指針的創建
創立指針變量的時候,要設想這個指針指向的是什麼類型的數據,就定義什麼類型的指針。(運用&取地址符號取得地址)
7.3名稱,地址,值
在很多語言中地址都歸計算機管理,但是對於c來說,可以用&取地址符取得該地址,從而對地址上的值進行修改,通過這個方法可以解決很多問題。
8函數
8.1函數的理解
計算機函數和數學上面的函數有點不同,對我自己理解來看,計算機函數可以有多個或者沒有輸入,一個或者沒有輸出(沒有輸出似乎沒啥用),一個或者沒有返回值。
8.2函數的返回值
就是調用這個函數結束後返回給主函數的東西,可以是int,double,bool等都可以,也可以沒有,比如void,選擇不同類型的返回值對解題有很大幫助。
8.3函數的輸入值
函數可以沒有輸入,也可以有一個甚至多個輸入,在函數頭中寫入所需要的形參
注意:函數調用的時候,形參和實參是不一樣的,例如有個函數是void swap(int a,int b){
Int temp=0;
Temp=a;
a=b;
b=temp;
}
這個函數在調用的時候使用swap(a,b)其實不能將a,b進行互換,因爲函數裏面所調用的a和b和給進去的a,b不是同一組值,函數獨立開拓一塊內存進行運行這個過程把真的a值給形參a,b值給形參b,然後形參a,b之間進行交換,交換結束之後卻沒有對原來的數據進行交換。
如果使用指針配合函數進行就可以進行交換了,這是我認爲的指針好用的地方之一。
9儲存類別,鏈接和生存週期
這個就當瞭解一下:auto儲存類別說明符(注意auto在c和c++裏面用法完全不同)static靜態存儲,register寄存器變量,extern外部存儲變量(即使用的時候使用的是位於別處的變量)
一開始對指針使用不熟練的時候,我經常會使用extern來完成數據的傳輸,後來熟練指針後就沒怎麼使用了,一般用的比較多的是static,在這一方面並不是很熟悉。
10.結構體
關於結構體,第一次瞭解到結構體的時候,感覺和二維數組有異曲同工的地方,但是使用起來不論是方便程度還是梳理思路,都比二維數組要好很多,而且可以自己定義自己想要的類型,使用範圍比二維數組廣好多。
用.運算符去拜訪結構體中的每個變量(用拜訪感覺好奇怪),然後對數據的處理和普通的數據沒有上面不同。用->運算符去拜訪指向結構體的指針中的數據(好彆扭QAQ)。
將結構體和指針一起運用的時候就發現很多好玩的東西,比如鏈表,單鏈表,多鏈表,二叉樹等等,明年數據結構會詳細講解。
11.文件
關於文件,我其實對文件的理解不如前面的東西,如果說前面幾個學了9成的話,文件的操作我大概學了7成左右吧。
文件的開啓和關閉,要用到fopen()和fclose()函數,有一個指向文件的指針,FILE *fp;fp=fopen(“文件名”,‘打開方式’)
文件的打開方式有好幾種:
R 以讀的模式打開文件
W 以寫的模式打開文件
A 以寫的模式打開文件
還有a+,w+等是c11後對文件操作的補充,ab,wb等就是以二進制模式打開文件。
文件中的操作和普通數據差不多,多了幾個函數getc(),putc()等,聯合文件指針一起使用,達到的效果和getchar()和putchar()類似,從本質上講,putchar其實是由getc()轉變過來的,只不過是putchar()改成從鍵盤輸入。
有三個特殊的文件指針,stdin鍵盤,stdout顯示器,stderr顯示器,這三個對應的標準文件是標準輸入,標準輸出和標準錯誤,這就是爲什麼我理解putchar()和getc()的原因,getc(stdin)其實就是putchar()。
12.緩衝區
這個是我自己加入c語言裏面的,雖然c語言好像沒有講這個,但是我個人覺得c語言中最難的部分就是指針和緩衝區吧,所以自己將緩衝區加入到裏面來。
我個人對緩衝區的理解,緩衝區就是在你按下回車,將緩衝區的數據發送給電腦進行處理的時候,就會出現很多問題,假如你需要給a和b兩個字符,中間用回車隔開一開始我是這麼寫的:getchar(a);getchar(b);然後輸入一個a的值後按回車你會發現程序就結束了,根本就沒有輸入b的情況,就是你輸入回車的時候雖然將a的值給了,但是同時也將\n(回車)也同時賦值給了b,就會產生一系列的問題,很多時候不是你的程序結構出了問題,可能只是緩衝區的輸入問題,包括scanf()等都有緩衝區這個問題,會讓你調試的時候顯得很奇怪。
解決的方法:
7. 使用scanf(’\n’),或者getchar()將回車給去掉(我一般用這個方法,一般能夠看出來哪裏有緩衝區問題)
8. 使用fflush()強制刷新緩衝區,這個就比較暴力了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章