C語言複習筆記

C快速複習,知識點總結

數據類型

基本數據類型

類型名稱說明char字符類型存放字符的ASCII碼int整型存放有符號整數short短整型存放有符號整數long長整型存放有符號整數long long存放有符號整數float單精度浮點型存放精度不高的小數double雙精度浮點型存放精度較高的小數數組

  • 除了這些基本數據類型以外,還有一些複合類型,後面會慢慢講到.
  • 表格中最經常使用到的四種類型是 char int float 和double.

類型介紹

根據存放類型的不一樣,能夠大體分爲字符型,整型和浮點型微信

  1. 整型
  • 存放整數的類型 好比0 1 2 3 4這種天然數或者負數均可以用整型存放

類型大小範圍說明函數

int4-231~231-1測試

short2-215~215設計

short(int) 短整型code

long4-231~231-1long (int) 長整型,規定範圍不得低於intblog

long long8-263~263-1不低於long類型遞歸

  • 整型數據須要注意的是 整型數據之間的運算只會獲得整型,也就是相似3除以4這種操做獲得的不是0.75,而是0
  1. 字符類型
  • 字符類型是一種比較特殊的整型,本質上存放的仍然是整數,所以能夠和整數同樣參與各類計算

類型大小範圍說明char1-1281270127每一個數字表明一個字符,可是不是全部的字符都是可打印字符遊戲

  • ASCII碼錶,字符類型不須要記這個表格,須要的時候能夠查表

img

  1. 浮點型/實型
  • 浮點型指的是小數類型,爲何叫浮點型,參考浮點數二進制計算時候小數點的移動

類型大小範圍說明float4-3.4e383.4e38**單精度浮點型,精確到小數點67位double8-1.7e3081.7e308**雙精度浮點型,精確到小數點後面1617位圖片

  • float內存佔用更小,運算速度更高.double類型佔用內存大,運算較慢,可是精度更高

變量定義和命名規範

  1. 變量和常量
  • C語言中將在代碼中不能變的量稱之爲變量,不可變的量稱之爲常量
  • 好比圓周率這種就是常量,關注人數就是變量
  1. 定義變量
  • 類型規定了數據存放和使用的方式,如今有一個數據若是要存放的話,就須要用到變量
//定義變量的格式 類型 變量名;
     int a;
  • 上面代碼定義了一個int類型的變量a 這個變量能夠在後面賦值,計算,或者顯示到屏幕上
  1. 命名規範
  • 只能由數字,下劃線,字母,美圓符號組成
  • 不能夠是數字開頭
  • 不能夠和關鍵字衝突

有一些名字拿去作其餘做用,好比int 表明整型,這些就稱之爲關鍵字

  • 命名方式 駝峯命名法

每一個變量名由若干個單詞組成,除了第一個單詞以外,其他單詞首字母所有大寫.單詞能夠是縮寫。好比 mciSendString

基本輸入輸出

  1. 輸入輸出函數
  • printf用於將指定的內容以特定格式輸出到屏幕
  • scanf用於獲取用戶輸入的內容
  1. 格式說明

格式佔位符做用%d有符號10進制整型%c字符類型%f單精度浮點型%lf雙精度浮點型%s字符數組類型%o無符號8進制整型%x無符號16進制整型

  1. 輸出格式
  • printf("格式佔位符",變量);
  1. 輸入格式
  • scanf("格式佔位符",&變量);

分支

分支語句

C語言的分支結構主要有if和switch

  1. if
  • 基本格式
if(條件) {
     //語句1
 } 
 else {
     //語句2;
 } 
 //若是條件知足 執行語句1,若是條件不知足 執行語句2
  • 須要注意的事情
  1. 條件能夠用一個數字做爲條件,判斷真假按照 0爲假以非0爲真的規則
  2. 寫條件的時候注意=和==是不一樣的運算符 不要弄混
  3. 若是條件比較複雜 建議拆成多句,if裏面的條件不宜太長,方便閱讀
  4. 在if後面不要加分號
  5. else部分若是不須要能夠不寫
  6. 若是是if-else嵌套,好比
if(條件1){
      語句1;
 }
 else if(條件2) {
      語句2;
 }
 …
 else {
      語句n;
 }
    • 當第一個條件不成立的時候才判斷條件2
    • if後面的{}中若是隻有一個語句(用分號結尾的語句或者其餘if語句均可以),那麼能夠省略掉{},else並非必要的,若是else的{}中沒有內容 能夠不要else
  1. switch
  • 基本格式
switch(變量) 
 { 
     case 狀況1:
     語句1;
     break 
     case 狀況2:
     語句2;
     break;
     //... 
     default:
     break;
 }
  • 注意事項
  1. sw itch的case後面只能接整型或者字符型的常量表達式,不能夠是小數或者字符

  2. sw itch每一個case後面都有一個break

  3. default語句若是不須要能夠不要

  4. 對比

  • if適應於任何分支狀況,三目運算符適合一些比較簡單的分支,switch適合能夠一一列舉全部可能狀況的時候
  • 若是是一個範圍的話用if比較容易表示,可是若是是單個單個能列舉的值,用switch比較簡介,好比遊戲操做的wasd方向鍵,菜單的幾個功能均可以用switch

循環

img

循環做用

  • 屢次執行的語句就可使用循環

好比遊戲的操做和貼圖,這些都是要屢次執行的,就會用到循環

  • 分支只會執行一次,可是循環可能會執行屢次(會搭配使用)

三大循環語句

  • while循環
  1. 基本格式
while(條件) {
     語句; //循環{}中語句稱之爲循環體 
 } 
 //執行順序 先判斷條件 條件知足執行循環體,不知足直接退出
  1. 說明

當條件知足的時候執行循環體,執行以後再去判斷條件,條件不知足的時候退出

//打印ASCII碼錶中的全部字符 
     int i=0; 
     while(i<128) { 
         printf("%c\t",i++);
     }
     //同一個代碼能夠有多種不一樣的寫法 熟練使用其中一個循環就行了
  1. 注意事項
  • w hile循環不要加分號

  • w hile循環體只有一句的時候能夠省略{} 可是不要省略

  • 若是條件知足則會一直進行循環,不知足就會退出循環,因此w hile可能一次都不執行

  • for循環

  1. 基本格式
for(初始化1;條件2;自增自減3) { 
     循環體4; 
 } 
 //爲了描述方便 給每一個語句都加了一個編號 
 //執行順序 先執行初始化語句1,而後判斷條件2,條件成立執行循環體4,不成立跳出循環. 
 //循環體執行完畢以後,執行自增語句3 而後判斷條件 開始下一輪循環 
 //簡記 1243 243 243
  1. 說明

for循環相似w hile循環 一樣是先判斷而後執行循環體的,不過for的語法比較簡單而且相對於w hile更不易寫錯,因此能夠先從for循環開始熟悉

  1. 注意事項
  • for循環中的兩個分號必不可少,其他的部分均可以不要,可是分號必不可少

  • for循環外面不要加分號!!!! 畫重點 if w hile for通常都不要加分號

  • do while循環

  1. 基本格式
do { 
     //循環體; 
 }while(條件); //;不能少
 //do while循環的特色是先執行循環體而後判斷條件,若是條件成立進行下一輪循環 
 //do while的循環體一定會執行一次
  1. 說明

do w hile循環條件放在後面,先執行而後判斷,若是條件不成立會退出,否則會繼續循環

  • 特別說明

    • 條件一直爲真的循環稱之爲死循環,經常使用的有w hile(1) 或者for(;😉
    • for和w hile之間能夠相互轉換,可是和do w hile不必定能夠

跳轉語句

跳轉語句使用方式做用說明goto跳轉到程序的任意位置使用不當會形成代碼的可讀性差,可維護性差,基本上不用breakbreak;跳出最近的一個循環或者switch若是是循環中的sw itch中的break只能跳出sw itch,若是是多層循環只能跳出最近的一個循環continuecontinue;跳過當前的一輪循環,進入下一輪循環只能和在循環中使用.跳過當前循環,進入下一輪循環returnreturn 返回值;或者return;跳出當前函數主函數中的return會跳出主函數(跳出主函數也就意味着程序結束),其他函數的return是跳出當前的函數.能夠跳出多層循環

  • 說明
  1. break,continue這樣的跳轉語句通常和if搭配使用,知足特定條件纔會退出循環或者跳過此次循環
  2. return後面要不要加一個返回值這個根據函數肯定,留到函數部分再具體講解
  3. 以上的都是關鍵字,不須要加頭文件,也不能夠用做函數或者變量名
  • 跳轉函數 exit的說明

exit做用 跳出整個程序,是stdlib.h裏面的函數,使用的時候須要加上

經常使用寫法

exit(0); //裏面的數字0表示正常退出,其他數字表示異常退出,不影響代碼

在任意地方使用均會跳出整個程序

數組

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dzN3NXey-1570415333052)(D:\微信公衆號\Typora\素材\潭州vip\數組.png)]

數組

  • 數組做用

存放多個相同類型的元素,若是有多個相同類型的元素須要存放,那麼可使用數組。

//存放3個成績
	//方式1 單獨定義變量
	int grade1,grade2,grade3;
	//方式2 使用數組
	int grade[3];
  • 數組定義和使用方式
  1. 數組定義格式 類型 數組名[數組大小];
int arr[16];//定義一個數組 數組中能夠存放16個int類型數據

若是你想要定義的時候就給裏面的元素賦值的話,能夠定義的時候直接用=

int arr[16]={1,2,33,2,4,5,6,1,6,7,7,7,8};
	//定義的時候給數組元素賦值 
	//數組元素個數是16,可是後面只有13個值,那麼多餘的就用0賦值
	//若是定義的時候給數組元素賦值,能夠省略掉數組大小,用後面賦值的個數做爲數組的大小	
	//int arr[]={1,2,3,4,5}; //此處數組大小是5
  1. 數組元素使用方式 數組名[下標]
//定義數組以後 至關於同時定義了多個變量,若是要使用這些變量,就用數組名加下標的形式去單獨訪問其中的元素
	// [ ] 下標運算符
	arr[2]=12; 	//表示給數組中第二個元素賦值(下標從0開始計算)
  • 注意
  1. 定義的時候int arr[16]表示對定義數組,除了定義以外的[]所有是下標運算符的意思,因此arr[16]不是數組的意思 而是數組中的一個元素
  2. 下標從0開始算,因此注意下數組的下標不能夠超過數組的最大元素個數
  3. 下標可使用變量,因此數組能夠和循環搭配使用

for(int i=0;i<16;++i) { printf("%d\t",arr[i]); }

二維數組和多維數組

  • 二維數組定義和使用

若是要定義幾組數據就要用到二維數組,好比說地圖,好比說一個學校有20個班級,每一個班級40個學生,這種用一維數組也能夠存,不過用二維數組更加方便

定義格式 類型 數組名[ 行 ] [ 列 ] 使用方式 數組名i (使用時候注意,行列都是從0開始的)

//一維數組元素地址打印測試
	int arr[12]={1,2,3,4};
	for(int i=0;i<12;++i)
	{
		printf("%p\t",&arr[i]);
	}
  • 二維數組的初始化

和一維數組相似,二維數組初始化能夠直接在定義的時候賦值

int douArr1[3][4]={{1,2,3,4},{2,2,3,4}};	//每一行單獨賦值 
	int douArr2[3][4]={1,2,3,4};	//先存第一行,而後第二行 以此類推
	int douArr3[][4]={1,2,3,4}; 	//省略行 根據後面賦值判斷有多少行

若是是定義的時候賦值,二維數組定義的時候能夠省略掉行(不推薦省略)

  • 二維數組本質(只作瞭解)
//一維數組元素地址打印測試
int arr[12]={1,2,3,4};
for(int i=0;i<12;++i)
{
printf("%p\t",&arr[i]);
}
//二維數組元素地址打印測試
int douArr[3][4]={1,2,3,4};
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%p\t",&douArr[i][j]);//打印地址
}
printf("\n");
}
//%p用於打印地址的格式佔位符 打印的是16進制形式

分析打印結果,發現這些元素地址都是相鄰的. 相似一維數組,實質上二維數組的元素存放方式也是一個個相鄰存放的,一行存完以後存下一行,從內存角度看,多維數組和一維數組其實沒有什麼太大的區別,使用的話,能夠用以下方式

for(int i=0;i<12;++i)
	{
		printf("%d\t",douArr[0][i]);
	}

基本上二維數組以上的多維數組就用的不多了,規則和二維數組相似,因此掌握了二維數組,多維數組也是同樣操做.

字符數組和函數

  • 字符數組和字符串

用雙引號括起來的一串內容是字符串,字符串通常用字符數組存儲

char str[20]="hello w orld";//定義字符數組存放一個字符串

字符串末尾都有一個'\0',表示的字符串的結尾,所以在進行和字符串相關的操做,都會用到'\0'

  • 因爲字符串末尾有'\0',用字符數組存放字符串須要注意幾個事項:
  1. 由於數組只有在定義的時候才能夠用=賦值,其他狀況下不能夠直接用=賦值
  2. 字符數組能夠用循環賦值,可是末尾須要記得加上一個\0
  3. 考慮到\0 數組大小不能夠過小
  4. 字符串有一些經常使用函數,但凡是字符串(用\0結尾)均可以用這些函數
  • 字符串能夠用的一些函數
  1. 字符串比較函數 strcmp
  2. 字符串拷貝函數 strcpy
  3. 字符串連接 strcat
  4. 測量字符串長度 strlen
  5. 判斷一個字符串是不是另一個字符串的子串 strstr
  6. 判斷字符串中是否包含一個字符 strch
  7. 字符串的輸入輸出 scanf printf
  8. 字符串的輸入輸出 gets puts

函數

對於一些常常會使用到的(屢次 重複使用)的代碼能夠將它封裝成一個函數,C語言程序的基本組成單位就是函數.

函數1

  • 函數使用方式

調用方式 函數名(參數)

  1. 調用函數須要先知道函數名,好比getchar scanf這種
  2. 若是函數沒有參數,那麼直接加()便可調用 好比getchar()
  3. 若是函數有參數,那麼須要在()裏面寫上參數,好比printf("Hello w orld")
  4. 通常函數都是爲了執行某項功能,一些常常用到的功能能夠寫成函數以供調用,調用函數不須要知道函數具體的實現方式(知道他的功能就行)
  • 返回值
  1. 對於一些函數會返回一個結果,好比printf他返回打印的元素個數
  2. 不一樣函數的返回值有不一樣的做用
  • 函數定義方式
  1. 函數定義須要包含全部函數的組成部分
  2. 須要肯定函數做用,參數和返回值,定義函數以後方能使用
  3. 函數體根據函數做用書寫 寫函數的時候須要先設計,最好寫註釋
  • 函數聲明
  1. 在調用函數以前定義函數的話就沒用任何問題,可是通常狀況會將函數定義放在調用函數的後面,這種狀況就須要寫函數聲明
  2. 函數聲明的做用是告訴編譯器去後面找這個函數的定義,也就是他只是刷一下存在感
  3. 函數聲明須要函數返回值類型 函數名和參數類型,也就是說參數的名字能夠省略
int fun(int ,int); //函數聲明
int main()
{
	fun(3,4); //函數調用
	getchar();
	return 0;
}
int fun(int x,int y) //函數定義
{
	return x>y?x:y;
}
  • 形參和實參
  • 形參意義
  1. 形參指的是調用函數的時候須要從外部引入的參數
  2. 其餘函數中的值能夠經過傳參的方式傳給被調用的函數
  3. 形參說明了被調用函數中須要哪些外部變量
  • 實參意義
  1. 實參是調用函數的時候傳遞的參數,實參傳遞給形參,就是從函數中傳遞值給被調用的函數
  2. 實參必須是有一個確切的值才能傳遞給其餘函數
  • 概括總結
  1. 函數聲明和定義時候的參數稱之爲函數的形參
  2. 函數調用時候的參數稱之爲實參
  3. 調用就是用實參給形參賦值而後執行函數體
int fun(int ,int); //函數聲明 形參
int main()
{
	fun(3,4); //函數調用 實參
	getchar();
	return 0;
}
int fun(int x,int y) //函數定義 形參
{
	return x>y?x:y;
}

函數2

  • 做用域

變量要先定義而後才能使用,可是 變量定義位置會影響到使用的範圍

  1. 局部變量

在函數或者{}裏面定義的變量,出了{}就不能繼續使用

  1. 全局變量

在函數外部定義的變量,定義以後整個程序中均可以使用

變量的做用域不同的話,名字能夠相同,使用的時候依據就近原則(最近定義的那個變量).

  • 函數傳參

問題1 若是要傳遞一個數組進去,那麼形參和實參要怎麼寫 問題2 若是想要在函數裏面修改實參的值 能不能作到

函數實參實參寫法函數形參備註int xxint x基本數據類型直接寫就行int arr[128]arrint arr[]一維數組傳參的時候數組大小是不寫的,須要另外傳遞進去int douArr[3] [4]douArrint douArr[] [4]二維數組傳遞參數實參直接寫數組名,形參省略行號,可是列不能省略

形參名和實參名能夠不同,這裏只是做爲示例,不是意味着須要名字相同

  • 遞歸

函數直接或者間接調用本身叫作遞歸,循環均可以用遞歸實現

遞歸只是一種解決問題的方式,關鍵在於找到遞歸公式

//示例 求階乘
//思考 n!=1*2*3*4*.....*(n-1)*n
//能夠獲得遞歸公式 n!=n*(n-1)
//當n==1的時候 n!=1
int Fn(int n) //求n的階乘
{
	if(n>1)
	{
		return Fn(n-1)*n;
	}
	else
	{
		return 1;
	}
}
相關文章
相關標籤/搜索