C語言復習提綱
第一章 ?C語言程序設計概述
一、Visual C++6.0開發(fā)環(huán)境
1、了解Visual C++6.0的安裝過程;
2、了解Visual C++6.0的工作界面,菜單和工具欄的使用;
▲二、掌握C語言程序運行的過程
1、編輯:是指把按照C語法規(guī)則編寫的程序代碼通過編輯器(Visual C++ 6.0,Turbo C 3.0)輸入計算機,并存盤。在存盤時,C源文件的擴展名為 .c
2、編譯:將C語言源程序編譯成目標程序,即對源程序進行編譯,并將源程序轉換為擴展名為.obj的二進制目標代碼(即把已經編輯好的源程序翻譯成二進制目標代碼的過程)。
3、連接:將用戶程序生成的目標代碼文件(.obj)和系統(tǒng)提供的庫文件(.lib)中的某些代碼連接在一起,生成一個可執(zhí)行文件(.exe)。
4、執(zhí)行:執(zhí)行生成的可執(zhí)行代碼,并輸出結果。
5、調試:是將編制的程序投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。
▲三、結構化程序設計的基本概念
1、概念
以模塊化設計為中心,將待開發(fā)的軟件系統(tǒng)劃分為若干個相互獨立的模塊,將原來較為復雜的問題化簡為一系列簡單模塊的設計,任何模塊都可以使用一些基本的結構來實現(xiàn),任何復雜的程序,都可以使用這些基本結構按一定的順序組合起來,這些基本結構的特點都是只有一個入口、一個出口,這樣的程序設計方法稱為結構化程序設計。
2、基本思想
結構化程序設計的基本思想是采用"自頂向下,逐步細化、模塊化設計、結構化編碼"的程序設計方法和"單入口單出口"的控制結構。
3、三種基本結構
⑴順序結構 ???????????????⑵選擇結構 ????????????⑶循環(huán)結構
4、三種基本結構的特點
⑴只有一個入口 ???????????⑵只有一個出口
⑶每一個基本結構中的每一部分都有機會執(zhí)行到
⑷結構內不存在“死循環(huán)”
5、設計原則
⑴自頂向下 ??????????????⑶逐步細化 ????????????⑶模塊化設計
⑷結構化編碼
▲四、C程序的基本組成:
C程序是由若干個函數(shù)構成的,至少有一個主函數(shù)main(),main()的位置可以任意,其他各函數(shù)在程序中的前后位置也是可以任意的。程序的執(zhí)行總是從主函數(shù)開始,在主函數(shù)中結束。主函數(shù)是可以調用其他任何非主函數(shù)的函數(shù),任何非主函數(shù)也可以調用其它任何非主函數(shù)。
C程序的基本組成:聲明區(qū)、主程序區(qū)、函數(shù)定義區(qū)。
1、聲明區(qū)
處在程序文件的所有函數(shù)的外部,一般包含:包含頭文件、宏定義、類定義、結構體定義、函數(shù)聲明、全局變量聲明、條件編譯等。
2、主程序區(qū)
主程序以main()函數(shù)開始,main()函數(shù)(主函數(shù))是程序運行時的入口,包含局部變量的聲明、函數(shù)調用、一般運算、結構控制、對象與結構的處理、文件處理等。
3、函數(shù)定義區(qū)
函數(shù)的定義包含函數(shù)說明和函數(shù)體兩部分。
4、注釋
//或/* ????*/為注釋,不能嵌套
不產生編譯代碼,不影響程序的執(zhí)行效率。
▲五、標識符
1、標識符的定義:用來對變量、符號常量名、函數(shù)、數(shù)組、類型等命名的有效字符序列統(tǒng)稱為標識符。
2、標識符的命名規(guī)則:由字母、數(shù)字或下畫線組成,并且第1個字符必須為字母或下畫線。
注意:標識符區(qū)分大小寫,即大寫字母和小寫字母的通常意義不同,且不能與關鍵字重名。
練習1_1:下列變量標識符哪些是正確的,哪些是不正確的?
a3bc?????if?????a!bc ????_abc ?????abc???????_3abc??????a_bc???????3abc
3、標識符分類:關鍵字、預定義標識符、用戶自定義標識符。
第二章 ?數(shù)據(jù)類型、運算符和表達式
▲一、C語言的數(shù)據(jù)類型

C語言中基本數(shù)據(jù)類型包括整型、實型、字符型、枚舉類型,構造類型有數(shù)組、結構體、共用體等。
⑴、基本數(shù)據(jù)類型(見P17)
⑵、構造類型又稱為組合類型,它是由基本類型按照某種規(guī)則組合而成的。
n?數(shù)組:是由具有相同數(shù)據(jù)類型的元素組成的集合。
n?結構體:是由不同的數(shù)據(jù)類型構成的一種混合的數(shù)據(jù)結構,構成結構體的成員的數(shù)據(jù)類型一般不同,并且在內存中分別占據(jù)不同的存儲單元。
n?共用體:是類似于結構體的一種構造類型,與結構體不同的是構成共同體的數(shù)據(jù)成員共用同一段內存單元。
n?枚舉:是將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內。
⑶、指針類型變量用于存儲另一變量的地址,而不能用來存放基本類型的數(shù)據(jù)。它在內存中占據(jù)一個存儲單元。
⑷、類是一種數(shù)據(jù)類型,它定義的是一種對象類型,由數(shù)據(jù)和方法組成,描述了屬于該類型的所有對象的性質。
二、常量和變量
⑴、常量:在程序運行的整個過程中,其值始終保持不變的量。
n?整型常量:表示形式有十進制、八進制(以0開頭)和十六進制(以0x或0X開頭)。整型常量可以后綴字母L(或l)表示長整數(shù),后綴字母U(或u)表示無符號整數(shù)。
n?實型常量(浮點型常量):表示形式有一般形式和指數(shù)形式。實型常量缺省為double型(雙精度型),如后綴f或F,則為float型(單精度型)。
n?字符常量:用單撇號括起來的一個字符。如'A','*'等。
轉義字符:用反斜杠引導的,具有特定含義的字符(見P22表2-4),如?'\n','\367','\x8a'。
注:C語言字符集中的任何一個字符均可用轉義字符來表示。
n?字符串常量:用雙撇號括起來的字符序列。如"student","廣東廣州"等。
n?布爾常量:false,true。??
n?符號常量:
2?#define 宏名 ?常數(shù)
⑵變量:指程序在運行時其值可改變的量。
n?變量應先定義(聲明其類型和名稱)后使用;?
n?變量定義的一般形式為:
u?< 數(shù)據(jù)類型 > ??<變名1>,<變名2>,…,<變名n>;
n?在定義一個變量的同時,也可以給它賦以初值。?
▲三、運算符和表達式
1、算術運算符和算術表達式
注意:int i=1.2*3; ?//結果為3,而不是3.6。 int i=5/3結果為1。
表達式17/5的結果是3,表達式17%5的結果是2。
2、賦值運算符和賦值表達式
注意:
n?賦值運算符的結合性是從右至左的
n?復合賦值運算符:int a=12; ?a+=a-=a*=a;(a=a+(a=a-(a=a*a)),結果為0)
注意:
在C語言中,定義int a=b=c=3;是錯誤的,而定義int a,b,c;?a=b=c=3;是正確的。
練習2_3設m=9,i=3,則執(zhí)行運算m%=i+1后,m的值是多少?結果1。
m=m%(i+1)→m=9%(3+1)→m=1。
3、關系運算符和關系表達式
注意:
n?關系運算符的優(yōu)先級低于算術運算符。例如:a+b>c ?等價于?(a+b)>c,a!=b>c 等價于 a!=(b>c)
n?“=”與“==”的區(qū)別
4、邏輯運算符與邏輯表達式
注意:
n?邏輯非的優(yōu)先級最高,邏輯與次之,邏輯或最低
6、條件運算符
表達式1?表達式2:表達式3
注意:
n?結合性是自右向左。a>b?a:c>d?c:d相當于a>b?a:(c>d?c:d)
n?條件運算符的優(yōu)先級別高于賦值運算符,低于關系運算符和算術運算符。如:
a>b?a-b:b-a相當于a>b?(a-b):(b-a)?
7、位運算符
位運算符是對其操作數(shù)按其二進制形式逐位進行運算,參加位運算的操作數(shù)必須為整數(shù)。
注:在位運算中,操作數(shù)左移三位,其結果相當于操作數(shù)乘以8。
8、逗號運算符
表達式1, 表達式2, ……, 表達式n
注意:
自左至右,依次計算各表達式的值,“表達式n” 的值即為整個逗號表達式的值。如:a = 3 * 5, a * 4, a + 5的值為20。
▲四、運算符的優(yōu)先級與結合性
1、所謂結合性是指,當一個操作數(shù)兩側的運算符具有相同的優(yōu)先級時,該操作數(shù)是先與左邊的運算符結合,還是先與右邊的運算符結合。
自左至右的結合方向,稱為左結合性。反之,稱為右結合性。
結合性是C語言的獨有概念。除單目運算符、賦值運算符和條件運算符是右結合性外,其它運算符都是左結合性。
2、表達式求值
n?按運算符的優(yōu)先級高低次序執(zhí)行。例如,先乘除后加減。
n?如果在一個運算對象(或稱操作數(shù))兩側的運算符的優(yōu)先級相同,則按C語言規(guī)定的結合方向(結合性)進行。
例如,算術運算符的結合方向是“自左至右”,即:在執(zhí)行“a – b + c”時,變量b先與減號結合,執(zhí)行“a - b”;然后再執(zhí)行加c的運算。
第三章 順序結構程序設計
▲一、順序結構程序設計——數(shù)據(jù)的輸入和輸出
1、格式化輸出——printf()函數(shù)
n?printf()函數(shù)的一般格式如下:printf("格式字符串" [,輸出項表]);
2?輸出項表:要輸出的數(shù)據(jù)項(可以沒有,有多個時以“,”分隔)
2?格式控制串:包含兩種信息
格式說明:??%[修飾符]格式字符?,用于指定輸出格式
如:格式控制字符“%c”表示的含義是輸出一個字符型數(shù)據(jù)。
普通字符或轉義序列:原樣輸出。
n?格式控制字符:

n?修飾符:

如:在C程序的格式輸出中,%d表示輸出十進制整數(shù),%6.2f表示輸出長度為6位,有2位小數(shù)的實數(shù)。printf("s=%-5.3s","student");的輸出結果是s=stu ?。
2、格式化輸入——scanf()函數(shù)
scanf()函數(shù)的一般格式
scanf("格式字符串", 輸入項首地址表);
注:
①格式輸入函數(shù)scanf()可以從鍵盤上接收不同數(shù)據(jù)類型的數(shù)據(jù)。
②格式化輸出函數(shù)(printf())和格式化輸入函數(shù)(scanf())都包含在頭文件“stdio.h”中。
n?格式字符串。格式字符串可以包含3種類型的字符:格式指示符、空白字符(空格、Tab鍵和回車鍵)和非空白字符(又稱普通字符)。
格式指示符與printf()函數(shù)的相似,空白字符作為相鄰2個輸入數(shù)據(jù)的缺省分隔符,非空白字符在輸入有效數(shù)據(jù)時,必須原樣一起輸入。
n?輸入項首地址表──由若干個輸入項首地址組成,相鄰2個輸入項首地址之間,用逗號分開。
輸入項首地址表中的地址,可以是變量的首地址,也可以是字符數(shù)組名或指針變量。
變量首地址的表示方法:??&變量名
其中“&”是地址運算符。
n?數(shù)據(jù)輸入操作
2?如果相鄰2個格式指示符之間,不指定數(shù)據(jù)分隔符(如逗號、冒號等),則相應的2個輸入數(shù)據(jù)之間,至少用一個空格分開,或者用Tab鍵分開,或者輸入1個數(shù)據(jù)后,按回車,然后再輸入下1個數(shù)據(jù)。
例如,scanf("%d%d",&num1,&num2);
假設給num1輸入12,給num2輸入36,則正確的輸入操作為:12□36↙
或者:12↙
??????36↙
?注:使用“↙”符號表示按回車鍵操作,在輸入數(shù)據(jù)操作中的作用是,通知系統(tǒng)輸入操作結束。
2?“格式字符串”中出現(xiàn)的普通字符(包括轉義字符形式的字符),務必原樣輸入。
????例如,scanf("%d,%d",&num1,&num2);
假設給num1輸入12,給num2輸入36,正確的輸入操作為:12,36↙
第四章 選擇結構程序設計
▲一、算法
1、算法的概念:算法是指為解決一個問題而采取的確定的、有限的方法和步驟。
2、算法的描述方法最常用的有自然語言、流程圖、N-S流程圖、PAD圖和偽代碼等。
▲二、順序結構程序設計
順序結構是結構化程序設計中最簡單、最常見的一種程序結構。順序結構中的語句是按照書寫的先后次序執(zhí)行的,并且每個語句都會被執(zhí)行到。
▲三、選擇結構程序設計
1、if語句
⑴、if語句的一般格式
??????if(表達式)
???????????{語句組1;}
?????[else
???????????{語句組2;} ]
n?if語句中的“表達式”必須用“(”和“)”括起來。表示程序執(zhí)行的條件,常用關系運算符、邏輯運算符等表示的條件表達式,其結果只有兩個值“1”或“0”(成立或不成立)。
如:表示字符型變量ch是大寫英文字符的C語言表達式是ch>='A'&&ch<='Z',要判斷字符變量ch中的值是否為數(shù)字字符,則其表達式是ch>='0'&&ch<='9'。
n?else子句(可選)是if語句的一部分,必須與if配對使用,不能單獨使用。
n?當if和else下面的語句組,僅由一條語句構成時,也可不使用復合語句形式(即去掉花括號)。
⑵、if語句的執(zhí)行過程
n?缺省else子句時
n?當“表達式”的值不等于0(即判定為“邏輯真”)時,則執(zhí)行語句組1,否則直接轉向執(zhí)行下一條。
n?指定else子句時
n?當“表達式”的值不等于0(即判定為“邏輯真”)時,則執(zhí)行語句組1,然后轉向下一條語句;否則,執(zhí)行語句組2。
⑶、if語句的嵌套與嵌套匹配原則
n?if語句允許嵌套。所謂if語句的嵌套是指,在“語句組1”或(和)“語句組2”中,又包含有if語句的情況。
n?if語句嵌套時,為避免嵌套的if-else語句的二義性,C語言規(guī)定:else總是與在其之前最近的未配對的if語句組成配對關系。
2.switch語句
⑴、switch語句的一般形式
switch(表達式)
??????{??case ??常量表達式1:語句組;break;
????????
case ??常量表達式2:語句組;break;
??????????......
???????case ??常量表達式n:語句組;break;
????????
?[default:語句組;[break; ]]
??????}
⑵、執(zhí)行過程??
n?當switch后面“表達式”的值,與某個case后面的“常量表達式”的值相同時,就執(zhí)行該case后面的語句(組);當執(zhí)行到break語句時,跳出switch語句,轉向執(zhí)行switch語句的下一條。
n?如果沒有任何一個case后面的“常量表達式”的值,與“表達式”的值匹配,則執(zhí)行default 后面的語句(組)。然后,再執(zhí)行switch語句的下一條。
⑶說明
n?switch后面的“表達式”,可以是int、char和枚舉型中的一種。
n?每個case子句后面的“常量表達式”的值,必須各不相同,否則會出現(xiàn)相互矛盾的現(xiàn)象(即對表達式的同一值,有兩種或兩種以上的執(zhí)行方案)。
n?case后面的常量表達式僅起語句標號作用,并不進行條件判斷。系統(tǒng)一旦找到入口標號,就從此標號開始執(zhí)行,不再進行標號判斷,所以要退出switch語句,方法是使用break語句。
n?各case及default子句的先后次序,不影響程序執(zhí)行結果。
n?多個case子句,可共用同一語句(組)
n?用switch語句實現(xiàn)的多分支結構程序,完全可以用if語句或if語句的嵌套來實現(xiàn)。
第五章 ??循環(huán)結構程序設計
▲一、循環(huán)程序設計
1、while語句
⑴、一般格式
??????????while(循環(huán)繼續(xù)條件)
????????????????{ 循環(huán)體語句組;}
⑵、執(zhí)行過程
①求解“循環(huán)繼續(xù)條件”表達式。如果其值為非0,轉②;否則轉③。
②執(zhí)行循環(huán)體語句組,然后轉①。
③執(zhí)行while語句的下一條。
2、do-while語句(直到型循環(huán))
⑴、一般格式
?do
??????{ 循環(huán)體語句組; }
?while(循環(huán)繼續(xù)條件);/*本行的分號不能缺省*/
當循環(huán)體語句組僅由一條語句構成時,可以不使用復合語句形式。
⑵、執(zhí)行過程
①執(zhí)行循環(huán)體語句組。
②計算“循環(huán)繼續(xù)條件”表達式。如果“循環(huán)繼續(xù)條件”表達式的值為非?0(真),則轉向①繼續(xù)執(zhí)行;否則,轉向③。
③執(zhí)行do-while的下一條語句。
⑶、do-while循環(huán)語句的特點是:先執(zhí)行循環(huán)體語句組,然后再判斷循環(huán)條件。
因此do......while語句不論條件是否成立,至少要執(zhí)行一次循環(huán)體。
3、for語句
⑴、for語句的一般格式
???????for([變量賦初值];[循環(huán)繼續(xù)條件];[循環(huán)變量增值])
????????????{ 循環(huán)體語句組;}
⑵、for語句的執(zhí)行過程
①求解“變量賦初值”表達式。
②求解“循環(huán)繼續(xù)條件”表達式。如果其值非0,執(zhí)行③;否則,轉至④。
③執(zhí)行循環(huán)體語句組,并求解“循環(huán)變量增值”表達式,然后轉向②。
④執(zhí)行for語句的下一條語句。
⑶、說明
①“變量賦初值”、“循環(huán)繼續(xù)條件”和“循環(huán)變量增值”部分均可缺省,甚至全部缺省,但其間的分號不能省略。
②當循環(huán)體語句組僅由一條語句構成時,可以不使用復合語句形式。
③“循環(huán)變量賦初值”表達式,既可以是給循環(huán)變量賦初值的賦值表達式,也可以是與此無關的其它表達式(如逗號表達式)。
例如,for(sum=0;i<=100;i++) sum += i;
????????????for(sum=0,i=1;i<=100;i++) sum += i;
④“循環(huán)繼續(xù)條件”部分是一個邏輯量,除一般的關系(或邏輯)表達式外,也允許是數(shù)值(或字符)表達式。
如:while(!E)等價于while(0),while(E)等價于while(1)。
for語句最為靈活,不僅可用于循環(huán)次數(shù)已經確定的情況,也可用于循環(huán)次數(shù)雖不確定、但給出了循環(huán)繼續(xù)條件的情況。
4、循環(huán)的比較
⑴、While和?for都是先判斷后循環(huán),而do-while是先循后判斷。即do-while語句在條件不成立時循環(huán)體也要被執(zhí)行一次。
⑵、while和do-while語句的條件表達式只有一個,只起到控制循環(huán)結束的作用,循環(huán)變量的初值等都用其他語句完成;for語句則有3個表達式,不僅能起到控制循環(huán)結束的作用,還可給循環(huán)變量賦初值。
5、循環(huán)的嵌套
⑴、循環(huán)語句的循環(huán)體內,又包含另一個完整的循環(huán)結構,稱為循環(huán)的嵌套。循環(huán)嵌套的概念,對所有高級語言都是一樣的。
⑵、for語句和while語句允許嵌套,do-while語句也不例外。
6、break語句與continue語句
⑴、一般格式:?break;
???????????????continue;
⑵、功能
①break:強行結束循環(huán),轉向執(zhí)行循環(huán)語句的下一條語句。
②continue:對于for循環(huán),跳過循環(huán)體其余語句,轉向循環(huán)變量增量表達式的計算;對于while和do-while循環(huán),跳過循環(huán)體其余語句,但轉向循環(huán)繼續(xù)條件的判定。
⑶、說明
①break能用于循環(huán)語句和switch語句中,而continue只能用于循環(huán)語句中。
②break是終止整個循環(huán)的執(zhí)行,而continue只是結束本次循環(huán)。
③循環(huán)嵌套時,break和continue只影響包含它們的最內層循環(huán),與外層循環(huán)無關。
第六章 ?數(shù)組
數(shù)組是數(shù)目固定、類型相同的若干變量的有序集合。
▲一、一維數(shù)組
1、一維數(shù)組的定義:數(shù)據(jù)類型???數(shù)組名[常量表達式][, 數(shù)組名2[常量表達式2]……];
n?“數(shù)據(jù)類型”是指數(shù)組元素的數(shù)據(jù)類型。
n?數(shù)組名,與變量名一樣,必須遵循標識符命名規(guī)則。
n?“常量表達式”必須用方括號括起來,指的是數(shù)組的元素個數(shù)(又稱數(shù)組長度),它是一個整型值,其中可以包含常數(shù)和符號常量,但不能包含變量。
n?數(shù)組元素的下標,是元素相對于數(shù)組起始地址的偏移量,所以從0開始順序編號。
n?數(shù)組名中存放的是一個地址常量,它代表整個數(shù)組的首地址。同一數(shù)組中的所有元素,按其下標的順序占用一段連續(xù)的存儲單元。
注:數(shù)組名能與其他變量名相同,數(shù)組名后是用方括號括起來的常量表達式,不能和圓括號。
2、數(shù)組元素的引用
引用數(shù)組中的任意一個元素的形式:?????數(shù)組名[下標表達式]
n?“下標表達式”可以是任何非負整型數(shù)據(jù),取值范圍是0~(元素個數(shù)-1)。
n?1個數(shù)組元素,實質上就是1個變量,它具有和相同類型單個變量一樣的屬性,可以對它進行賦值和參與各種運算。
n?在C語言中,數(shù)組作為1個整體,不能參加數(shù)據(jù)運算,只能對單個的元素進行處理。
⑶、一維數(shù)組元素的初始化
n?初始化格式:數(shù)據(jù)類型??數(shù)組名[常量表達式]={初值表}
n?如果對數(shù)組的全部元素賦以初值,定義時可以不指定數(shù)組長度(系統(tǒng)根據(jù)初值個數(shù)自動確定)。如果被定義數(shù)組的長度,與初值個數(shù)不同,則數(shù)組長度不能省略。
n?“初值表”中的初值個數(shù),可以少于元素個數(shù),即允許只給部分元素賦初值。
3、數(shù)組元素的存儲
數(shù)組元素在計算機內存中存儲時,占據(jù)一片連續(xù)的存儲空間,數(shù)組名代表數(shù)組元素占據(jù)的內存空間的首地址。由于數(shù)組各元素的數(shù)據(jù)類型相同,因此在數(shù)組中,每一個元素在內存里占用的存儲單元數(shù)都是相同的。
二、二維數(shù)組
1、二維數(shù)組的定義:
????數(shù)據(jù)類型??數(shù)組名[行常量表達式][列常量表達式][, ?數(shù)組名2[行常量表達式2][列常量表達式2]……];
n?數(shù)組元素在內存中的排列順序為“按行存放”,即先順序存放第一行的元素,再存放第二行,以此類推。
n?設有一個m*n的數(shù)組x,則第i行第j列的元素x[i][j]在數(shù)組中的位置為:i*n+j(注意:行號、列號均從0開始計數(shù))。
2、二維數(shù)組元素的引用
引用2維數(shù)組元素的形式為:
數(shù)組名[行下標表達式][列下標表達式]
n?“行下標表達式”和“列下標表達式”,都應是整型表達式或符號常量。
n?“行下標表達式”和“列下標表達式”的值,都應在已定義數(shù)組大小的范圍內。假設有數(shù)組x[3][4],則可用的行下標范圍為0~2,列下標范圍為0~3。
n?對基本數(shù)據(jù)類型的變量所能進行的操作,也都適合于相同數(shù)據(jù)類型的2維數(shù)組元素。
3、二維數(shù)組元素的初始化
n?按行賦初值
數(shù)據(jù)類型??數(shù)組名[行常量表達式][列常量表達式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};
賦值規(guī)則:將“第0行初值表”中的數(shù)據(jù),依次賦給第0行中各元素;將“第1行初值表”中的數(shù)據(jù),依次賦給第1行各元素;以此類推。
n?按2維數(shù)組在內存中的排列順序給各元素賦初值
數(shù)據(jù)類型??數(shù)組名[行常量表達式][列常量表達式]={初值表};
賦值規(guī)則:按2維數(shù)組在內存中的排列順序,將初值表中的數(shù)據(jù),依次賦給各元素。
如果對全部元素都賦初值,可以省略“行數(shù)”,但不能省略“列數(shù)”。注意:只能省略“行數(shù)”。
三、字符數(shù)組
1、字符數(shù)組的定義
n?1維字符數(shù)組,用于存儲和處理1個字符串,其定義格式與1維數(shù)值數(shù)組一樣。
n?2維字符數(shù)組,用于同時存儲和處理多個字符串,其定義格式與2維數(shù)值數(shù)組一樣。
2、字符數(shù)組的初始化
字符數(shù)組的初始化,可以通過為每個數(shù)組元素指定初值字符來實現(xiàn)。
3、字符數(shù)組的引用
????字符數(shù)組的逐個字符引用,與引用數(shù)值數(shù)組元素類似。
n?字符數(shù)組的輸入
除了可以通過初始化使字符數(shù)組各元素得到初值外,也可以使用getchar()或scanf()函數(shù)輸入字符。
n?字符數(shù)組的輸出
????字符數(shù)組的輸出,可以用putchar()或printf()函數(shù)。
四、字符串及其結束標志
所謂字符串,是指若干有效字符的序列。C語言中的字符串,可以包括字母、數(shù)字、專用字符、轉義字符等。
C語言規(guī)定:以‘\0’作為字符串結束標志(‘\0’代表ASCII碼為0的字符,表示一個“空操作”,只起一個標志作用)。因此可以對字符數(shù)組采用另一種方式進行操作了──字符數(shù)組的整體操作。
注意:由于系統(tǒng)在存儲字符串常量時,會在串尾自動加上1個結束標志,所以無需人為地再加1個。
另外,由于結束標志也要在字符數(shù)組中占用一個元素的存儲空間,因此在說明字符數(shù)組長度時,至少為字符串所需長度加1。
1.字符數(shù)組的整體初始化
字符串設置了結束標志以后,對字符數(shù)組的初始化,就可以用字符串常量來初始化字符數(shù)組。
2.字符數(shù)組的整體引用
n?字符串的輸入
除了可以通過初始化使字符數(shù)組各元素得到初值外,也可以使用scanf()函數(shù)輸入字符串。
n?字符串的輸出
printf()函數(shù),不僅可以逐個輸出字符數(shù)組元素,還可以整體輸出存放在字符數(shù)組中的字符串。
五、常用的字符串處理函數(shù)
字符串標準函數(shù)的原型在頭文件string.h中。
1、輸入字符串──gets()函數(shù)
①調用方式:gets(字符數(shù)組)
②函數(shù)功能:從標準輸入設備(stdin)──鍵盤上,讀取1個字符串(可以包含空格),并將其存儲到字符數(shù)組中去。
③使用說明
n?gets()讀取的字符串,其長度沒有限制,編程者要保證字符數(shù)組有足夠大的空間,存放輸入的字符串。
n?該函數(shù)輸入的字符串中允許包含空格,而scanf()函數(shù)不允許。
2.輸出字符串──puts()函數(shù)
①調用方式:puts(字符數(shù)組)
②函數(shù)功能:把字符數(shù)組中所存放的字符串,輸出到標準輸出設備中去,并用‘\n’取代字符串的結束標志‘\0’。所以用puts()函數(shù)輸出字符串時,不要求另加換行符。
③使用說明
n?字符串中允許包含轉義字符,輸出時產生一個控制操作。
n?該函數(shù)一次只能輸出一個字符串,而printf()函數(shù)也能用來輸出字符串,且一次能輸出多個。
3、字符串比較──strcmp()函數(shù)
①調用方式:strcmp(字符串1 ,字符串2)
其中“字符串”可以是串常量,也可以是1維字符數(shù)組。
②函數(shù)功能:比較兩個字符串的大小。
如果:字符串1=字符串2,函數(shù)返回值等于0;
??????字符串1<字符串2,函數(shù)返回值負整數(shù);
??????字符串1>字符串2,函數(shù)返回值正整數(shù)。
③使用說明
n?如果一個字符串是另一個字符串從頭開始的子串,則母串為大。
n?不能使用關系運算符“==”來比較兩個字符串,只能用strcmp() 函數(shù)來處理。
4、拷貝字符串──strcpy()函數(shù)
①調用方式:strcpy(字符數(shù)組, 字符串)
其中“字符串”可以是串常量,也可以是字符數(shù)組。
②函數(shù)功能:將“字符串”完整地復制到“字符數(shù)組”中,字符數(shù)組中原有內容被覆蓋。
③使用說明
n?字符數(shù)組必須定義得足夠大,以便容納復制過來的字符串。復制時,連同結束標志'\0'一起復制。
n?不能用賦值運算符“=”將一個字符串直接賦值給一個字符數(shù)組,只能用strcpy()函數(shù)來處理。
5.連接字符串──strcat()函數(shù)
①調用方式:strcat(字符數(shù)組, 字符串)
②函數(shù)功能:把“字符串”連接到“字符數(shù)組”中的字符串尾端,并存儲于“字符數(shù)組”中?!白址麛?shù)組”中原來的結束標志,被“字符串”的第一個字符覆蓋,而“字符串”在操作中未被修改。
③使用說明
n?由于沒有邊界檢查,編程者要注意保證“字符數(shù)組”定義得足夠大,以便容納連接后的目標字符串;否則,會因長度不夠而產生問題。
n?連接前兩個字符串都有結束標志'\0',連接后“字符數(shù)組”中存儲的字符串的結束標志'\0'被舍棄,只在目標串的最后保留一個'\0'。
6.求字符串長度──strlen()函數(shù)(len是length的縮寫)
①調用方式:strlen(字符串)
②函數(shù)功能:求字符串(常量或字符數(shù)組)的實際長度(不包含結束標志)。
7.將字符串中大寫字母轉換成小寫──strlwr()函數(shù)
①調用方式:strlwr(字符串)
②函數(shù)功能:將字符串中的大寫字母轉換成小寫,其它字符(包括小寫字母和非字母字符)不轉換。
8.將字符串中小寫字母轉換成大寫──strupr()函數(shù)
①調用方式:strupr(字符串)
②函數(shù)功能:將字符串中小寫字母轉換成大寫,其它字符(包括大寫字母和非字母字符)不轉換。
第七章 ?函數(shù)
▲一、函數(shù)的定義與調用
1、函數(shù)的定義
任何函數(shù)(包括主函數(shù)main())都是由函數(shù)說明和函數(shù)體兩部分組成。根據(jù)函數(shù)是否需要參數(shù),可將函數(shù)分為無參函數(shù)和有參函數(shù)兩種。
⑴、無參函數(shù)的一般形式
????函數(shù)類型??函數(shù)名( void )
????????????{ 說明語句部分;
????????????????可執(zhí)行語句部分;
?????????????}
注意:在舊標準中,函數(shù)可以缺省參數(shù)表。但在新標準中,函數(shù)不可缺省參數(shù)表;如果不需要參數(shù),則用“void”表示,主函數(shù)main()例外。
⑵、有參函數(shù)的一般形式
函數(shù)類型??函數(shù)名( 數(shù)據(jù)類型??參數(shù)[,數(shù)據(jù)類型??參數(shù)2……] )
????????????{ 說明語句部分;
????????????????可執(zhí)行語句部分;
?????????????}
有參函數(shù)比無參函數(shù)多了一個參數(shù)表。調用有參函數(shù)時,調用函數(shù)將賦予這些參數(shù)實際的值。
為了與調用函數(shù)提供的實際參數(shù)區(qū)別開,將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡稱形參表。
⑶、說明
①函數(shù)定義不允許嵌套(但函數(shù)的調用可以嵌套)。
在C語言中,所有函數(shù)(包括主函數(shù)main())都是平行的。一個函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main()之前或之后。但在一個函數(shù)的函數(shù)體內,不能再定義另一個函數(shù),即不能嵌套定義。
②空函數(shù)──既無參數(shù)、函數(shù)體又為空的函數(shù)。其一般形式為:
[函數(shù)類型] ?函數(shù)名(void)
????????{ }
③在老版本C語言中,參數(shù)類型說明允許放在函數(shù)說明部分的第2行單獨指定。?
2、函數(shù)的返回值與函數(shù)類型
⑴.函數(shù)返回值與return語句
有參函數(shù)的返回值,是通過函數(shù)中的return語句來獲得的。
①return語句的一般格式:??return ( 返回值表達式?);
②return語句的功能:返回調用函數(shù),并將“返回值表達式”的值帶給調用函數(shù)。
注意:調用函數(shù)中無return語句,并不是不返回一個值,而是一個不確定的值。為了明確表示不返回值,可以用“void”定義成“無(空)類型”。
⑵.函數(shù)類型
函數(shù)的類型說明符指明了函數(shù)的類型,它實際上是函數(shù)返回值的類型。如果不要求函數(shù)有返回值,函數(shù)的類型說明符可以寫為void,如果缺省,C語言函數(shù)返回類型的默認定義類型是int型。
在定義函數(shù)時,對函數(shù)類型的說明,應與return語句中、返回值表達式的類型一致。
如果不一致,則以函數(shù)類型為準。如果缺省函數(shù)類型,則系統(tǒng)一律按整型處理。
即:在C語言中,函數(shù)返回值的數(shù)據(jù)類型取決于在定義該函數(shù)時所指定的數(shù)據(jù)類型。
3、對被調用函數(shù)的說明和函數(shù)原型
在ANSI C新標準中,采用函數(shù)原型方式,對被調用函數(shù)進行說明,其一般格式如下:
函數(shù)類型??函數(shù)名(數(shù)據(jù)類型[ ?參數(shù)名][, 數(shù)據(jù)類型[ ?參數(shù)名2]…]);
C/C語言同時又規(guī)定,在以下3種情況下,可以省去對被調用函數(shù)的說明:
①當被調用函數(shù)的函數(shù)定義出現(xiàn)在調用函數(shù)之前時。因為在調用之前,編譯系統(tǒng)已經知道了被調用函數(shù)的函數(shù)類型、參數(shù)個數(shù)、類型和順序。
②如果在所有函數(shù)定義之前,在函數(shù)外部(例如文件開始處)預先對各個函數(shù)進行了說明,則在調用函數(shù)中可缺省對被調用函數(shù)的說明。
③當一個函數(shù)是int類型時,它與被調用者的前后位置關系可以忽略,可以省略對被調函數(shù)的說明。
4、函數(shù)的調用?
一般形式為:??函數(shù)名([實際參數(shù)表])
切記:實參的個數(shù)、類型和順序,應該與被調用函數(shù)所要求的參數(shù)(形參)個數(shù)、類型和順序一致,才能正確地進行數(shù)據(jù)傳遞。
⑴、調用函數(shù)方式:
①函數(shù)表達式。函數(shù)作為表達式的一項,出現(xiàn)在表達式中,以函數(shù)返回值參與表達式的運算。
②函數(shù)語句。C/C語言中的函數(shù)可以只進行某些操作而不返回函數(shù)值,這時的函數(shù)調用可作為一條獨立的語句。
③函數(shù)實參。函數(shù)作為另一個函數(shù)調用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須是有返回值的。
⑵、說明:
①調用函數(shù)時,函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。
②實參在類型上按順序與形參,必須一一對應和匹配。如果類型不匹配,C編譯程序將按賦值兼容的規(guī)則進行轉換。如果實參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結果。
③如果實參表中包括多個參數(shù),對實參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右順序求實參的值,有的系統(tǒng)則相反。Turbo C和MS C是按自右向左的順序進行的?。
5、函數(shù)的形參與實參
⑴、函數(shù)的參數(shù)分為形參和實參兩種,作用是實現(xiàn)數(shù)據(jù)傳送。
形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內使用。發(fā)生函數(shù)調用時,調用函數(shù)把實參的值復制1份,傳送給被調用函數(shù)的形參,從而實現(xiàn)調用函數(shù)向被調用函數(shù)的數(shù)據(jù)傳送。?
⑵、說明:
①實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值,以便把這些值傳送給形參。
②形參變量只有在被調用時,才分配內存單元;調用結束時,即刻釋放所分配的內存單元。
因此,形參只有在該函數(shù)內有效。調用結束,返回調用函數(shù)后,則不能再使用該形參變量。
③實參對形參的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。
④實參和形參占用不同的內存單元,即使同名也互不影響。
6、函數(shù)的嵌套調用和遞歸調用
⑴、函數(shù)的嵌套調用?指在執(zhí)行被調用函數(shù)時,被調用函數(shù)又調用了其它函數(shù)。
如圖所示:

⑵、函數(shù)的遞歸調用
函數(shù)的遞歸調用是指,一個函數(shù)在它的函數(shù)體內,直接或間接地調用它自身。
二、變量的作用域、局部變量與全局變量
變量的作用域是指變量在程序中的有效范圍。C語言中的變量,按作用域范圍可分為兩種:局部變量和全局變量。
⑴、局部變量(內部變量)
在一個函數(shù)內部說明的變量是內部變量,它只在該函數(shù)范圍內有效。只有在包含變量說明的函數(shù)內部,才能使用被說明的變量,在此函數(shù)之外就不能使用這些變量了。所以內部變量也稱“局部變量”。?局部變量的作用域被限定在其所定義的局部范圍中。
⑵、關于局部變量的作用域還要說明以下幾點:
①主函數(shù)main()中定義的變量是內部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的內部變量。因為主函數(shù)也是一個函數(shù),與其它函數(shù)是平行關系。
②形參變量也是內部變量,屬于被調用函數(shù);實參變量,則是調用函數(shù)的內部變量。
③在同一個作用域中不可定義同名變量,但在不同的作用域中可以定義同名變量,因為它們代表不同的對象,分配不同的單元,互不干擾,不會發(fā)生混淆。
④在復合語句中也可定義變量,其作用域只在復合語句范圍內。?
⑶、全局變量(外部變量)
①在函數(shù)外部定義的變量稱為外部變量。
外部變量不屬于任何一個函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結束為止。
②外部變量可被作用域內的所有函數(shù)直接引用,所以外部變量又稱全局變量。
三、變量的存儲屬性
1、靜態(tài)存儲變量和動態(tài)存儲變量
從變量的生存期(即在內存中存在時間)來看,變量可分為靜態(tài)存儲變量和動態(tài)存儲變量。
①靜態(tài)存儲變量:在系統(tǒng)編譯程序時就分配存儲單元,直至整個程序結束。
②動態(tài)存儲變量:在程序執(zhí)行過程中使用它時才分配存儲單元,使用完畢立即釋放。
2、變量的存儲類型
變量存儲類型是指變量在內存中的存儲方式,分為靜態(tài)存儲和動態(tài)存儲。
從變量的存儲方式來看,變量分為auto(自動)變量、register(寄存器)變量、extern(外部變量)、static(靜態(tài)變量)4種。
自動變量和寄存器變量屬于動態(tài)存儲方式,外部變量和靜態(tài)變量屬于靜態(tài)存儲方式。
①自動變量:類型說明符為auto(可以省略),缺省時,凡未加存儲類型說明符的局部變量都有是自動變量。
自動變量屬于動態(tài)存儲方式,其作用域和生存期都局限于定義它的程序體內(函數(shù)或復合語句),因此不同的程序體中允許使用同名的變量而不會混淆。
②寄存器變量:類型說明符為register,存放在CPU的寄存器中,使用時不需要訪問內存,而直接從寄存器中讀寫,這樣可提高效率。
③外部變量:類型說明符為extern,又稱為全局變量。
④靜態(tài)變量:類型說明符為static,分為靜態(tài)局部變量和靜態(tài)全局變量。
四、編譯預處理
所謂編譯預處理是指,在編譯之前處理,即在對源程序進行編譯之前,先對源程序中的編譯預處理命令進行處理;然后再將處理的結果,和源程序一起進行編譯,以得到目標代碼。?
1、宏定義與符號常量
在C/C語言中,“宏”分為無參數(shù)的宏(簡稱無參宏)和有參數(shù)的宏(簡稱有參宏)兩種。
⑴、無參宏定義?
n?無參宏定義的一般格式
#define ??標識符???語言符號字符串
其中:“define”為宏定義命令;“標識符”為所定義的宏名,通常用大寫字母表示,以便于與變量區(qū)別;“語言符號字符串”可以是常數(shù)、表達式、格式串等。
n?使用宏定義的優(yōu)點
①可提高源程序的可維護性
②可提高源程序的可移植性?
③減少源程序中重復書寫字符串的工作量
n?說明
①宏名一般用大寫字母表示,以示與變量區(qū)別。但這并非是規(guī)定。?
②宏定義不是C語句,所以不能在行尾加分號。
③宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后,?到本文件結束。通常,宏定義命令放在文件開頭處。?
⑵、符號常量
在定義無參宏時,如果“語言符號字符串”是一個常量,則相應的“宏名”就是一個符號常量。
恰當命名的符號常量,除具有宏定義的上述優(yōu)點外,還能表達出它所代表常量的實際含義,從而增強程序的可讀性。
⑶、有參宏定義
n?帶參宏定義的一般格式
#define ??宏名(形參表) ??語言符號字符串
n?帶參宏的調用和宏展開
①調用格式:宏名(實參表)
②宏展開:用宏調用提供的實參字符串,直接置換宏定義命令行中、相應形參字符串,非形參字符保持不變。
2、文件包含
⑴、文件包含的概念
文件包含是指,一個源文件可以將另一個源文件的全部內容包含進來。
⑵.文件包含處理命令的格式
#include ?“包含文件名” ?或?#include ?<包含文件名>
兩種格式的區(qū)別僅在于:
①使用雙引號:系統(tǒng)首先到當前目錄下查找被包含文件,如果沒找到,再到系統(tǒng)指定的“包含文件目錄”(由用戶在配置環(huán)境時設置)去查找。
②使用尖括號:直接到系統(tǒng)指定的“包含文件目錄”去查找。一般地說,使用雙引號比較保險。?
⑶.文件包含的優(yōu)點
一個大程序,通常分為多個模塊,并由多個程序員分別編程。有了文件包含處理功能,就可以將多個模塊共用的數(shù)據(jù)(如符號常量和數(shù)據(jù)結構)或函數(shù),集中到一個單獨的文件中。這樣,凡是要使用其中數(shù)據(jù)或調用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進來即可,不必再重復定義它們,從而減少重復勞動。
⑷.說明
①編譯預處理時,預處理程序將查找指定的被包含文件,并將其復制到#include命令出現(xiàn)的位置上。?
②常用在文件頭部的被包含文件,稱為“標題文件”或“頭部文件”,常以“h”(head)作為后綴,簡稱頭文件。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結構類型定義等。
③一條包含命令,只能指定一個被包含文件。如果要包含n個文件,則要用n條包含命令。
④文件包含可以嵌套,即被包含文件中又包含另一個文件。
第八章 ??指針
▲一、指針和指針變量的概念
1、指針──即地址
一個變量的地址稱為該變量的指針。取變量地址的運算符是&,通過變量的指針能夠找到該變量。
2指針變量──專門用于存儲其它變量地址的變量
▲二、指針變量的定義與應用
⑴、指針變量的定義:[存儲類型] ?數(shù)據(jù)類型???*指針變量[, ?*指針變量2……];
如float *p(缺省存儲類型說明,表示指針變量p的存儲類型是auto型)
⑵、取地址運算(&)和指針運算(*)
取地址運算的格式:&變量
指針運算(取內容運算)的格式:*指針變量(表示取指針變量所對應的目標變量的內容)
注:
①指針變量有自己的地址,它的內容也是一個地址。在C語言中,說p指向x,意味著變量p的內容是變量x的地址。
②由于指針的數(shù)據(jù)類型實際上是指定指針所能指向對象的數(shù)據(jù)類型,所以不同數(shù)據(jù)類型的指針變量不能相互賦值。
▲三、指針與數(shù)組
⑴指針和一維數(shù)組
數(shù)組名代表數(shù)組的首地址,是一個常量。
數(shù)組指針:就是指向數(shù)組元素地址的指針變量。
指向數(shù)組的指針變量可以與一個整型常量相加,或與一個整型常量相減。
⑵指針和二維數(shù)組
用數(shù)組名表示二維數(shù)組的行地址
數(shù)組元素三種形式引用:
⑴ a[i][j] ??????????下標法
⑵ *(a[i]+j) ????????用一維數(shù)組名
⑶ *(*(a+i)+j) ??????用二維數(shù)組名
⑶指針數(shù)組
指針數(shù)組:數(shù)組的所有元素都是存放指針的數(shù)組稱為指針數(shù)組。
即:指針數(shù)組中每一個元素(下標變量)都是指針變量。
指針數(shù)組的定義形式:
<存儲類型> <數(shù)據(jù)類型> ?<*指針數(shù)組名>[數(shù)組長度][={地址列表}];
4、指針與字符串
⑴將字符串的首地址賦給指針,用字符指針變量來處理字符串。
⑵字符指針變量與字符指針數(shù)組
字符數(shù)組和字符指針變量都能實現(xiàn)字符串的存儲與運算,但兩者之間還是有區(qū)別的,主要包括以下幾點:
①字符數(shù)組由若干元素組成,每個元素存放一個字符;
字符指針變量存放的是字符串的首地址。
②賦值方式不同:
不能用賦值語句給字符數(shù)組賦值。
char str[14];
str=“I love china!”??這是錯誤的。
字符指針變量可以采用下面的形式賦值:
char *p;
p=“china!”????這是正確的。
但要注意賦給指針變量p的不是字符串,而是字符串的首地址。
定義一個數(shù)組,在編譯時分配存放n個元素的存儲空間;
定義指針變量只分配存放一個地址的空間。
第九章 ?結構體、共用體與枚舉類型
▲一、結構體
結構體是用戶自定義的新數(shù)據(jù)類型,在結構體中可以包含若干個不同數(shù)據(jù)類型和不同意義的數(shù)據(jù)項(當然也可以相同),從而使這些數(shù)據(jù)項組合起來反映某一個信息。
1、定義一個結構體類型的一般形式為:
struct ?結構體名
{
數(shù)據(jù)類型 成員名1;
數(shù)據(jù)類型 成員名2;
????……
數(shù)據(jù)類型 成員名n;
};
例如:定義一個職工worker結構體如下:
struct worker
{ ??long number;
????char name[20];
????char sex;??????????????????//sex是成員名?
????int age;
????float salary;
????char address[80];
????char phone[20]; ?}; ????//注意分號不要省略
int ?sex=10; ??????????????//sex是變量名?
2、結構體類型變量的定義方法
n?先定義結構體類型再定義變量名:struct 結構體名?變量名
n?在定義結構體類型的同時定義變量。
注意:結構體的定義可以嵌套,即在結構體內還可以定義結構體。結構體中的成員也可以是一個結構體變量。
3、結構體變量的引用和初始化
n?結構體變量的引用:結構變量不能整體引用,只能引用其成員,一般形式為:結構體變量名.成員名。
n?結構體變量的初始化:struct ?結構體名?變量名={初始數(shù)據(jù)表};
或
struct ?結構體名
{
成員列表;
}變量名={初始數(shù)據(jù)表};?
注意:
①結構體是一種構造數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序變量的集合。
②結構體變量占據(jù)的內存空間大小等于所有成員占據(jù)的內存空間之和。
二、共用體
1、共用體的概念
在C語言中,不同數(shù)據(jù)類型的數(shù)據(jù)可以使用共同的存儲區(qū)域,這種數(shù)據(jù)構造類型稱為共用體,簡稱共用,又稱聯(lián)合體。
2、定義一個共用體類型的一般形式為:
union 共用體名
{
成員列表;
};?
3、共用體變量的定義
n?先定義共用體類型再定義共用體變量:union?共用體名?變量名
n?在定義共用體類型的同時定義變量。
注意:
①共用體變量任何時刻只有一個成員存在。
②共用體變量定義分配內存,長度=最長成員所占字節(jié)數(shù)。
三、枚舉
1、枚舉的概念
枚舉就是指將某一變量所有可能的取值一一列舉出來。
2、枚舉的定義:
enum 枚舉類型名{枚舉元素表}枚舉變量名
3、枚舉變量的定義
n?在定義枚舉類型的同時,定義枚舉類型的變量。
n?已定義過的枚舉數(shù)據(jù)類型定義枚舉變量,格式為:
enum 枚舉名稱 ?變量名表
注意:
①枚舉元素是常量,不能在程序中用賦值語句再對它賦值?;
②枚舉元素作為常量是有值的,編譯系統(tǒng)按定義時的順序使它們具有順序整數(shù)值:0,1,2,……;
③在定義枚舉類型中,可在枚舉數(shù)據(jù)時通過“=”來對枚舉元素進行初始化(指定一個整型值),并影響后面的枚舉元素的值,后繼序號以此遞增;
③枚舉元素不是字符常量也不是字符串常量,不能直接輸入輸出,可在過程中通過判斷和強制類型轉換來實現(xiàn)輸入輸出;
④枚舉變量只能取對應枚舉類型的枚舉元素表中的元素;
⑤枚舉元素表中的元素有先后次序,可以進行比較。
四、類型定義typedef的使用
用typedef定義新的類型名代替已有的類型名。
⑴、格式:typedef 數(shù)據(jù)類型 ??新的名稱
⑵、類型定義一般為大寫,與原來的數(shù)據(jù)類型關鍵相區(qū)別
⑶、類型定義只是給已存在的數(shù)據(jù)類型增加一個類型名,并沒有創(chuàng)造一個新的數(shù)據(jù)類型。
注意:
①使用typedef可以定義各種類型名,但不能用來定義變量;
②使用用typedef只是將已存在的類型用一個新的名稱來代表,并不是定義了一種新的數(shù)據(jù)類型;
③使用typedef便于程序的通用。
第十章 ?文件
一、文件指針:
1、文件指針:C語言系統(tǒng)對文件的操作必須通過一個指向“FILE類型”的指針來實現(xiàn),我們稱這種指針為 “文件指針”。
二、文件位置指針
C語言規(guī)定:每一個文件都必須設置一個位置指針(文件指針)來控制文件的訪問位置,其規(guī)律如下。
◆ 文件打開時指針自動指向文件的開始位置;
◆ 每讀取一個單元內容文件位置指針自動順序向后移動一定的偏移量(該偏移量的字節(jié)數(shù)由所讀取單元的數(shù)據(jù)類型決定);
◆ 讀到文件的結尾,則文件的位置指針指向一個特殊的位置——EOF。
◆ 對文件進行順序寫操作時,數(shù)據(jù)寫入到文件位置指針所指向的位置。寫入后文件位置指針自動向后移動到一個新的位置,等待下一次的寫入操作。
◆ 可將文件位置指針移動到任何位置,實現(xiàn)對文件的隨機讀寫訪問。
三、文件的打開——打開文件函數(shù)fopen()
打開文件使用fopen()函數(shù)實現(xiàn)。打開文件格式為:
FILE *fp;
fp= fopen(文件名,使用方式);
文件名:為包含訪問路徑的文件名字符串。
在C語言中,對文件操作必須先打開文件。若執(zhí)行fopen()時發(fā)生錯誤,則函數(shù)的返回值是NULL或0。
四、關閉文件函數(shù)fclose()
文件操作結束前,必須關閉文件。
關閉文件使用fclose()函數(shù)。格式如下:
fclose(文件指針) ;
其中的“文件指針”參數(shù),就是保存打開文件操作時fopen函數(shù)返回值的FILE指針變量。
關閉文件的含義就是執(zhí)行fclose()函數(shù),先釋放文件指針,后寫緩沖區(qū)的數(shù)據(jù)到文件中。
當順利執(zhí)行了文件關閉操作時,fclose()返回值是0,否則返回-1。