版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 C語言總結(jié)第一章概述1 C語言的特點(diǎn)語言簡潔、緊湊,使用方便、靈活。共有個(gè)關(guān)鍵字,種控制語句。運(yùn)算符豐富,公有種運(yùn)算符。數(shù)據(jù)結(jié)構(gòu)豐富,數(shù)據(jù)類型有:整型、實(shí)型、字符型、數(shù)組、指針、結(jié)構(gòu)體、共用體等。具有結(jié)構(gòu)化的控制語句(如ifelse、while、dowhile、switch、for)語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。允許直接訪問物理地址,能進(jìn)行位(bit)操作,可以直接對硬件操作。生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高??梢浦残院?。 2 C語言的用途C雖不擅長科學(xué)計(jì)算和管理領(lǐng)域,但對操作系統(tǒng)和系統(tǒng)實(shí)用程序以及對硬件進(jìn)行操作方面,C有明顯的優(yōu)勢?,F(xiàn)在很多大型應(yīng)用軟件也用編寫。Top of Pag
2、e 第二章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式1 C的數(shù)據(jù)類型C的數(shù)據(jù)類型包括:整型、字符型、實(shí)型或浮點(diǎn)型(單精度和雙精度)、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。2 常量與變量常量其值不可改變,符號常量名通常用大寫。變量其值可以改變,變量名只能由字母、數(shù)字和下劃線組成,且第一個(gè)字符必須為字母或下劃線。否則為不合法的變量名。變量在編譯時(shí)為其分配相應(yīng)存儲單元。3 整型數(shù)據(jù)整型常量的表示方法:十進(jìn)制不用說了,八進(jìn)制以0開頭,如0123,十六進(jìn)制以0x開頭,如0x1e。整型變量分為:基本型(int)、短整型(short int)、長整型(long int)和無符號型。不同機(jī)器上各類數(shù)據(jù)所
3、占內(nèi)存字節(jié)數(shù)不同,一般int型為個(gè)字節(jié),long型為4個(gè)字節(jié)。4 實(shí)型數(shù)據(jù)實(shí)型常量表示形式:十進(jìn)制形式由數(shù)字和小數(shù)點(diǎn)組成(必須有小數(shù)點(diǎn)),如:0.12、.123、123.、0.0等。指數(shù)形式如123e3代表123×10的三次方。實(shí)型變量分為單精度(float)和雙精度(double)兩類。在一般系統(tǒng)中float型占4字節(jié),7位有效數(shù)字,double型占8字節(jié),1516位有效數(shù)字。5 字符型數(shù)據(jù)字符變量用單引號括起來,如'a','b'等。還有一些是特殊的字符常量,如'n','t'等。分別代表換行和橫向跳格。字符變量以cha
4、r 來定義,一個(gè)變量只能存放一個(gè)字符常量。 字符串常量是由雙引號括起來的字符序列。這里一定要注意'a'和"a"的不同,前者為字符常量,后者為字符串常量,c規(guī)定:每個(gè)字符串的結(jié)尾加一個(gè)結(jié)束標(biāo)志'0',實(shí)際上"a"包含兩個(gè)字符:'a'和'0'。6 數(shù)值型數(shù)據(jù)間的混合運(yùn)算整型、字符型、實(shí)型數(shù)據(jù)間可以混合運(yùn)算,運(yùn)算時(shí)不同類型數(shù)據(jù)要轉(zhuǎn)換成同一類型再運(yùn)算,轉(zhuǎn)換規(guī)則:char,short -> int -> unsigned -> long -> double <- floa
5、t7 運(yùn)算符和表達(dá)式c運(yùn)算符包括:算數(shù)運(yùn)算符(+-*/%)關(guān)系運(yùn)算符( > < = >= <= != )邏輯運(yùn)算符( ! && | )位運(yùn)算符( << >> | & )賦值運(yùn)算符(= )條件運(yùn)算符(? : )逗號運(yùn)算符( , )指針運(yùn)算符( * & )求字節(jié)數(shù)( sizeof )強(qiáng)制類型轉(zhuǎn)換(類型)分量運(yùn)算符(. -> )下標(biāo)運(yùn)算符( )其它運(yùn)算符(如函數(shù)調(diào)用運(yùn)算符( ) )自增自減運(yùn)算符(+ - )注意:+i和i+的不同之處,+i使用i之前先使i加,i+使用i之后,使i加。逗號表達(dá)式的求解過程:先求解表達(dá)式
6、,再求解表達(dá)式,整個(gè)表達(dá)式的值是表達(dá)式的值。Top of Page 第三章 最簡單的程序設(shè)計(jì)c的種控制語句:if() elsefor()while()dowhile()continuebreakswitchgotoreturn程序的三種基本結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu) 數(shù)據(jù)輸出c語言不提供輸入輸出語句,輸入輸出操作是由c的庫函數(shù)完成。但要包含頭文件stdio.h。putchar( ) 向終端輸出一個(gè)字符printf( )的格式字符: d格式符用來輸出十進(jìn)制整數(shù)%d 按整型數(shù)據(jù)的實(shí)際長度輸出%md 使輸出長度為m,如果數(shù)據(jù)長度小于m,則左補(bǔ)空格,如果大于m,則輸出實(shí)際長度%ld 輸出長整型
7、數(shù)據(jù) o格式符以八進(jìn)制形式輸出整數(shù) x格式符以十六進(jìn)制形式輸出整數(shù) u格式符用來輸出unsigned型數(shù)據(jù),以十進(jìn)制形式輸出 c格式符用來輸出一個(gè)字符 s格式符輸出一個(gè)字符串%s輸出實(shí)際長度字符串%ms 輸出的串占m列,如果串長度小于m,左補(bǔ)空格,如果大于m,實(shí)際輸出%-ms輸出的串占m列,如果串長度小于m,右補(bǔ)空格,%m.ns 輸出占m列,但只取字符串中左端n個(gè)字符并靠右對齊%-m.ns m、n含義同上,靠左對齊,如果n>m,則m自動(dòng)取n值 f格式符以小數(shù)形式輸出實(shí)數(shù)%f 整數(shù)部分全部輸出,小數(shù)部分輸出6位%m.nf 輸出數(shù)據(jù)共占m列,其中有n位小數(shù)。如果數(shù)值長度小于m,左補(bǔ)空格 %-
8、m.nf 同上,右補(bǔ)空格 e格式符以指數(shù)形式輸出實(shí)數(shù)%e 系統(tǒng)指定位小數(shù),5位指數(shù)(e+002 ) g格式符輸出實(shí)數(shù),根據(jù)數(shù)值大小,自動(dòng)選f格式或e格式3數(shù)據(jù)輸入getchar( ) 從終端輸入一個(gè)字符scanf( 格式控制,地址列表) 標(biāo)準(zhǔn)C scanf中不使用%u,對于unsigned型數(shù)據(jù),以%d或%o或%x輸入。后的*,用來跳過它相應(yīng)的數(shù)據(jù)。輸入數(shù)據(jù)時(shí)不能規(guī)定精度如scanf( "%7.2f", &a );是不合法的。Top of Page 第四章 邏輯運(yùn)算和判斷選取控制1 關(guān)系運(yùn)算符:c提供種關(guān)系運(yùn)算符(> < <= >= = !=
9、 )前四種優(yōu)先級高于后兩種。2 If語句C提供了三種形式的if語句If(表達(dá)式) 語句If(表達(dá)式) 語句1 else 語句2If(表達(dá)式1) 語句1Else if(表達(dá)式2) 語句2else 語句n3 條件運(yùn)算符(a>b)?a:b 條件為真,表達(dá)式取值a,否則取值b4 Switch語句Switch(表達(dá)式)case 常量表達(dá)式:語句; break;case 常量表達(dá)式:語句2; break; case 常量表達(dá)式n:語句; break;default :語句; Top of Page 第五章 循環(huán)控制1 幾種循環(huán)語句goto語句(現(xiàn)已很少使用)while語句先判斷表達(dá)式后執(zhí)行語句do-
10、while語句先執(zhí)行語句后判斷表達(dá)式for語句2 Break語句和continue語句Break語句用于跳出循環(huán),continue用于結(jié)束本次循環(huán)。Top of Page 第六章 數(shù)組1 一維數(shù)組c規(guī)定只有靜態(tài)存儲(static)和外部存儲(extern)數(shù)組才能初始化。給數(shù)組初始化時(shí)可以不指定數(shù)組長度。2 二維數(shù)組3 字符數(shù)組部分字符串處理函數(shù)puts(字符數(shù)組)將一個(gè)字符串輸出到終端。gets(字符數(shù)組) 從終端輸入一個(gè)字符串到字符數(shù)組,并且得到一個(gè)函數(shù)值,為該字符數(shù)組的首地址strcat(字符數(shù)組,字符數(shù)組2)連接兩個(gè)字符數(shù)組中的字符串,數(shù)組1必須足夠大。Strcpy(字符數(shù)組,字符串2
11、)將字符串拷貝到字符數(shù)組中。Strcmp(字符串1,字符串2) 比較字符串,相等返回0,字符串>字符串2,返回正數(shù),小于返回負(fù)數(shù)。 Strlen(字符數(shù)組) 求字符串長度。Strlwr( 字符串)將字符串中的大寫字母轉(zhuǎn)換成小寫Strupr( 字符串) 將字符串中的小寫字母轉(zhuǎn)換成大寫以上是一些比較常用的字符串處理函數(shù)。Top of Page 第七章 函數(shù)1 關(guān)于形參和實(shí)參的說明 在函數(shù)被調(diào)用之前,形參不占內(nèi)存 實(shí)參可以是常量、變量或表達(dá)式 必須指定形參的類型 實(shí)參與形參類型應(yīng)一致 實(shí)參對形參的數(shù)據(jù)傳遞是"值傳遞",即單向傳遞2 函數(shù)返回值如果想讓函數(shù)返回一個(gè)值,在函數(shù)中
12、就要用return語句來獲得,在定義函數(shù)時(shí)也要對函數(shù)值指定類型,如果不指定,默認(rèn)返回整型。3 函數(shù)調(diào)用1)注意在函數(shù)調(diào)用時(shí)實(shí)參和形參的個(gè)數(shù)、類型應(yīng)一一對應(yīng)。對實(shí)參表求值的順序是不確定的,有的系統(tǒng)按自左至右,有的系統(tǒng)則按自右至左的順序。這一點(diǎn)要注意。2)函數(shù)調(diào)用的方式:函數(shù)語句,函數(shù)表達(dá)式,函數(shù)參數(shù) 3)如果主調(diào)函數(shù)和被調(diào)函數(shù)在同一文件中,并且主調(diào)函數(shù)在前,那么一般要在主調(diào)函數(shù)中對被調(diào)函數(shù)進(jìn)行說明。除非:(1)被調(diào)函數(shù)的返回值類型為整型或字符型(2)被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前。4)對函數(shù)的說明和定義是不同的,定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型,形參及其類型、函數(shù)體等。說明則只是
13、對已定義的函數(shù)返回值類型進(jìn)行說明,只包括函數(shù)名、函數(shù)類型以及一個(gè)空的括弧,不包括形參和函數(shù)體。5)c語言允許函數(shù)的遞歸調(diào)用(在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接的調(diào)用該函數(shù)本身)。4 數(shù)組作為函數(shù)參數(shù)1)數(shù)組元素作為函數(shù)參數(shù)和一般變量相同2)數(shù)組名作參數(shù)應(yīng)該在主調(diào)和被調(diào)函數(shù)分別定義數(shù)組,形參數(shù)組的大小可以不定義。注意:數(shù)組名作參數(shù),不是單向傳遞。3)多維數(shù)組作參數(shù),在被調(diào)函數(shù)中對形參數(shù)組定義時(shí)可以省略第一維的大小說明,但不能省略第二維或更高維的說明。5 局部變量和全局變量從變量作用域角度分,變量可分為局部變量和全局變量。1)內(nèi)部變量(局部變量)在一個(gè)函數(shù)內(nèi)定義,只在函數(shù)范圍內(nèi)有效的變量。 2
14、)外部變量(全局變量)在函數(shù)外定義,可以為本文件其它函數(shù)所共用,有效范圍從定義變量的位置開始到本文件結(jié)束。建議盡量少使用全局變量,因?yàn)樗诔绦蛉繄?zhí)行過程中都占用資源,而且使函數(shù)的通用性降低了。如果在定義外部變量之前的函數(shù)要想使用該外部變量,則應(yīng)在該函數(shù)中用extern作外部變量說明。6 動(dòng)態(tài)存儲變量與靜態(tài)存儲變量從變量值存在的時(shí)間(生存期)角度來分,可分為靜態(tài)存儲變量和動(dòng)態(tài)存儲變量。靜態(tài)存儲指在程序運(yùn)行期間給變量分配固定的存儲空間,動(dòng)態(tài)存儲指程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)的給變量分配存儲空間。C語言中,變量的存儲方法分為兩大類:靜態(tài)存儲類和動(dòng)態(tài)存儲類,具體包括:自動(dòng)的(auto),靜態(tài)的(stat
15、ic),寄存器的(register),外部的(extern)。1) 局部變量的存儲方式函數(shù)中的局部變量如不作專門說明,都之a(chǎn)uto的,即動(dòng)態(tài)存儲的,auto可以省略。局部變量也可以定義為static的,這時(shí)它在函數(shù)內(nèi)值是不變的。靜態(tài)局部變量如不賦初值,編譯時(shí)系統(tǒng)自動(dòng)賦值為,動(dòng)態(tài)局部變量如不賦初值,則它的值是個(gè)不確定的值。C規(guī)定,只有在定義全局變量和局部靜態(tài)變量時(shí)才能對數(shù)組賦初值。為提高執(zhí)行效率,c允許將局部變量值放在寄存器中,這種變量叫register變量,要用register說明。但只有局部動(dòng)態(tài)變量和形式參數(shù)可以作為register變量,其它不行。2) 全局變量的存儲方式全局變量在函數(shù)外部定
16、義,編譯時(shí)分配在靜態(tài)存儲區(qū),可以在程序中各個(gè)函數(shù)所引用。多個(gè)文件的情況如何引用全局變量呢?假如在一個(gè)文件定義全局變量,在別的文件引用,就要在此文件中用extern對全局變量說明,但如果全局變量定義時(shí)用static的話,此全局變量就只能在本文件中引用了,而不能被其它文件引用。3) 存儲類別小結(jié)從作用域角度分,有局部變量和全局變量局部變量:自動(dòng)變量,即動(dòng)態(tài)局部變量(離開函數(shù),值就消失)靜態(tài)局部變量(離開函數(shù),值仍保留)寄存器變量(離開函數(shù),值就消失)(形參可定義為自動(dòng)變量和寄存器變量)全局變量:靜態(tài)全局變量(只限本文件引用)全局變量(允許其它文件引用)從存在的時(shí)間分,有靜態(tài)存儲和動(dòng)態(tài)存儲動(dòng)態(tài)存儲:
17、自動(dòng)變量(本函數(shù)內(nèi)有效)寄存器變量(本函數(shù)內(nèi)有效)形參靜態(tài)存儲:靜態(tài)局部變量(函數(shù)內(nèi)有效)靜態(tài)全局變量(本文件內(nèi)有效)全局變量(其它文件可引用)從變量值存放的位置分靜態(tài)存儲區(qū):靜態(tài)局部變量靜態(tài)全局變量全局變量動(dòng)態(tài)存儲區(qū):自動(dòng)變量和形參寄存器內(nèi):寄存器變量7 內(nèi)部函數(shù)和外部函數(shù) 內(nèi)部函數(shù):只能被本文件中的其它函數(shù)調(diào)用,定義時(shí)前加static,內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。外部函數(shù):可以被其它文件調(diào)用,定義時(shí)前加extern,如果省略,則隱含為外部函數(shù),在需要調(diào)用此函數(shù)的文件中,一般要用extern說明。Top of Page 第八章 預(yù)編譯處理 c編譯系統(tǒng)在對程序進(jìn)行通常的編譯之前,先進(jìn)行預(yù)處理。c提供
18、的預(yù)處理功能主要有以下三種:1)宏定義2)文件包含3)條件編譯1 宏定義不帶參數(shù)的宏定義用一個(gè)指定的標(biāo)識符來代表一個(gè)字符串,形式:#define 標(biāo)識符 字符串幾點(diǎn)說明:) 宏名一般用大寫) 宏定義不作語法檢查,只有在編譯被宏展開后的源程序時(shí)才會報(bào)錯(cuò)) 宏定義不是c語句,不在行末加分號) 宏名有效范圍為定義到本源文件結(jié)束) 可以用#undef命令終止宏定義的作用域) 在宏定義時(shí),可以引用已定義的宏名帶參數(shù)的宏定義定義形式:#define 宏名(參數(shù)表)字符串 這和函數(shù)有些類似,但他們是不同的:) 函數(shù)調(diào)用時(shí),先求實(shí)參表達(dá)式值,再代入形參,而宏只是簡單替換,并不求值) 函數(shù)調(diào)用是在程序運(yùn)行時(shí)分配
19、內(nèi)存的,而宏展開時(shí)并不分配內(nèi)存,也沒有返回值的概念) 對函數(shù)中的實(shí)參和形參都要定義類型,而且要求一致,宏名無類型,其參數(shù)也沒有類型。) 函數(shù)只有一個(gè)返回值,而宏可以得到幾個(gè)結(jié)果) 宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間,而函數(shù)調(diào)用占運(yùn)行時(shí)間2 文件包含處理#include "文件1" 就是將文件1的全部內(nèi)容復(fù)制插入到#include位置,作為一個(gè)源文件進(jìn)行編譯。在#include命令中,文件名可以用" "也可以用< >,假如現(xiàn)在file1.c中包含file2.h文件," "表示系統(tǒng)先在file1.c所在目錄中找file2.h,如
20、果找不到,再按系統(tǒng)指定的標(biāo)準(zhǔn)方式檢索目錄,< >表示系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索目錄。所以用" "保險(xiǎn)一點(diǎn)。3 條件編譯條件編譯指不對整個(gè)程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:1)#ifdef 標(biāo)識符 程序段 #else程序段#endif它的作用:當(dāng)標(biāo)識符在前面已經(jīng)被定義過(一般用#define),則對程序段編譯,否則對程序段編譯。)#ifndef 標(biāo)識符程序段#else程序段#endif它的作用和#ifdef相反,當(dāng)標(biāo)識符沒被定義過,對程序段編譯,否則對程序段編譯。)#if 表達(dá)式程序段#else程序段#endif它的作用:當(dāng)表達(dá)式值為
21、真(非)時(shí),對程序段編譯,否則對程序段編譯。Top of Page 第九章 指針指針說白了就是地址。指針變量就是用來存放指針(地址)的變量。1 變量的指針和指向變量的指針變量讀起來很拗口,說白了就是變量的地址和用來存放變量地址的地址變量。因?yàn)橐粋€(gè)變量在編譯的時(shí)候系統(tǒng)要為它分配一個(gè)地址,假如再用一個(gè)變量來存放這個(gè)地址,那么這個(gè)變量就叫做指向變量的指針變量,也就是用來存放變量地址的這么一個(gè)變量。所謂"指向"就是指存放××的地址,如指向變量的指針變量,"指向"就是指用來存放變量的地址,再如指向數(shù)組的指針變量,"指向"就是
22、指存放數(shù)組的地址。只要理解了這個(gè),指針也就不難了。另外,還有指向字符串的指針變量,指向函數(shù)的指針變量,指向指針的指針變量等。1) 指針變量的定義形式:類型標(biāo)識符*標(biāo)識符如:int *pointer;要注意兩點(diǎn):*表示pointer是個(gè)指針變量,在用這個(gè)變量的時(shí)候不能寫成*pointer, *pointer是pointer指向的變量。一個(gè)指針變量只能指向同一個(gè)類型的變量。如上面pointer只能指向int型變量。2)指針變量的引用兩個(gè)有關(guān)的運(yùn)算符:& 取地址運(yùn)算符 &a 就代表變量a的地址* 指針運(yùn)算符*a就代表變量a的值2 數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針指數(shù)組的起始地
23、址,數(shù)組元素的指針指數(shù)組元素的地址。 1)指向數(shù)組元素的指針變量的定義與賦值定義和指向變量的指針變量定義相同,c規(guī)定數(shù)組名代表數(shù)組的首地址,即第一個(gè)數(shù)組元素地址。2)通過指針引用數(shù)組元素我們通常引用數(shù)組元素的形式是ai,如果用指針可以這樣引用,*(a+i),或定義一個(gè)指針變量p,將數(shù)組a的首地址賦給p,p=a;然后用*(p+i)引用。注意:指針變量指向數(shù)組a首地址,則p+指向數(shù)組的下一元素地址,即a1的地址。3)數(shù)組名作函數(shù)參數(shù)形參數(shù)組和實(shí)參數(shù)組之間并不是值傳遞,而是共用同一段地址,所以在函數(shù)調(diào)用過程中如果形參的值發(fā)生變化,則實(shí)參的值也跟著變化。4)指向多維數(shù)組的指針和指針變量 以二維數(shù)組為居
24、多。假設(shè)定義了一個(gè)二維數(shù)組a34,那么a代表整個(gè)二維數(shù)組的首地址,也代表第0行的首地址,同時(shí)也是第0行第0列的元素的首地址。a +0和a0代表第0行首地址,a+1和a1代表第一行的首地址。假設(shè)a是一個(gè)數(shù)組的首地址,那么如果a是一維的,a+I代表第I個(gè)元素的地址,如果a是二維的,則a+I代表第I行的首地址。那么第一行第二列的元素地址如何表示呢?a1+2或&a12或*(a+1)+2。我們只要記?。涸诙S數(shù)組中a代表整個(gè)數(shù)組的首地址,aI代表第I行的首地址,aI與*(a+I)等價(jià)就行了。只要運(yùn)用熟練了就沒什么復(fù)雜的了。 5)指向由m個(gè)整數(shù)組成的一維數(shù)組的指針變量如:int (*p)4,p是一
25、個(gè)指向包含4個(gè)元素的一維數(shù)組,如果p先指向a0,則p+1指向a1,即p的增值是以一維數(shù)組的長度為單位的,這里是4,舉個(gè)例子:假設(shè)a34=1,3,5,7,9,11,13,15,17,19,21,23,p先指向a0也就是數(shù)組a的首地址,那么p+1就是a1的首地址即元素9的地址,因?yàn)樵诙xp時(shí)int (*p)4,定義一維數(shù)組長度為4,所以p+1就等于加了一個(gè)一維數(shù)組的長度4。3 字符串的指針和指向字符串的指針變量1)字符串的表示形式c中字符串有兩種表示形式:一種是數(shù)組,一種是字符指針 char string="I love c!"char *str="I love c!
26、"其實(shí)指針形式也是在內(nèi)存中開辟了一個(gè)數(shù)組,只不過數(shù)組的首地址存放在字符指針變量str中,千萬不要認(rèn)為str是一個(gè)字符串變量。2)字符串指針作函數(shù)參數(shù)實(shí)際上字符串指針就是數(shù)組的首地址。3)字符指針變量與字符數(shù)組的區(qū)別 字符數(shù)組由若干元素組成,每個(gè)元素存放一個(gè)字符,而字符指針變量只存放字符串的首地址,不是整個(gè)字符串 對數(shù)組初始化要用static,對指針變量不用。 對字符數(shù)組賦值,只能對各個(gè)元素賦值,不能象下面這樣:char str14;str="I love c!"對指針變量可以, char *str;str="I love c!"注意:此時(shí)賦給s
27、tr的不是字符,而是字符串首地址。 數(shù)組在定義和編譯時(shí)分配內(nèi)存單元,而指針變量定義后最好將其初始化,否則指針變量的值會指向一個(gè)不確定的內(nèi)存段,將會破壞程序。如: char *a;scanf( "%s", a );這種方法是很危險(xiǎn)的,應(yīng)該這樣:char *a, str10;a = str;scanf( "%s", a );這樣字符指針就指向了一個(gè)確定的內(nèi)存段。 指針變量的值是可以改變的,而字符數(shù)組名所代表的字符串首地址卻是不能改變的。4 函數(shù)的指針和指向函數(shù)的指針變量一個(gè)函數(shù)在編譯時(shí)被分配一個(gè)入口地址,這個(gè)入口地址就稱為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址
28、,這一點(diǎn)和數(shù)組一樣。我們可以用一個(gè)指針變量來存放這個(gè)入口地址,然后通過該指針變量調(diào)用函數(shù)。如:假設(shè)有一個(gè)求兩者較大的函數(shù)如下:int max( int x, int y );當(dāng)我們調(diào)用這個(gè)函數(shù)時(shí)可以這樣:int c;c=max( a, b );這是通常調(diào)用方法,其實(shí)我們可以定義一個(gè)函數(shù)指針,通過指針來調(diào)用,如:int (*p)(); /注意指向函數(shù)指針變量的定義形式p=max; /此句就是將函數(shù)的入口地址賦給函數(shù)指針變量pc=(*p)( a, b );有些朋友可能對(*p)()不大理解,其實(shí)它的意思就是定義一個(gè)指向函數(shù)的指針變量p,p不是固定指向哪個(gè)函數(shù)的,而是專門用來存放函數(shù)入口地址的變量。
29、在程序中把哪個(gè)函數(shù)的入口地址賦給它,它就指向哪個(gè)函數(shù)。但要注意,p不能象指向變量的指針變量一樣進(jìn)行p+,p-等無意義的操作。既然p是一個(gè)指針變量,那么就可以作為函數(shù)的參數(shù)進(jìn)行傳遞。其實(shí)函數(shù)的指針變量最常用的用途之一就是作為函數(shù)參數(shù)傳遞到其它函數(shù)。這也是c語言中應(yīng)用的比較深入的部分了。5 返回指針值的函數(shù)我們知道,一個(gè)函數(shù)可以帶回一個(gè)整型值、字符值、實(shí)型值等,函數(shù)還可以帶回一個(gè)指針型的數(shù)據(jù),即地址。這種函數(shù)的定義形式如下:類型標(biāo)識符 *函數(shù)名(參數(shù)表) 如:int *a(x,y)返回一個(gè)指向整型的指針使用這種函數(shù)的時(shí)候要注意:在調(diào)用時(shí)要先定義一個(gè)適當(dāng)?shù)闹羔榿斫邮蘸瘮?shù)的返回值。這個(gè)適當(dāng)?shù)闹羔樒漕愋?/p>
30、應(yīng)為函數(shù)返回指針?biāo)赶虻念愋?。這樣的函數(shù)比較難于理解,其實(shí)只要把它當(dāng)做一般的函數(shù)來處理就容易了。當(dāng)我們覺得指針難于理解的時(shí)候,就把它暫時(shí)當(dāng)做整型來看,就好理解多了。6 指針數(shù)組指針數(shù)組無疑就是數(shù)組元素為指針,定義形式為: 類型標(biāo)識*數(shù)組名數(shù)組長度如:int *p4,千萬不要寫成int (*p)4,這是指向一維數(shù)組的指針變量。指針數(shù)組多用于存放若干個(gè)字符串的首地址,注意一點(diǎn),在定義指針數(shù)組時(shí)初始化,如下: static char *name="Li jing","Wang mi","Xu shang"不要以為數(shù)組中存放的是字符串,它存放
31、的是字符串首地址,這一點(diǎn)一定要注意。7 指向指針的指針說的明白一點(diǎn),將一個(gè)指針再用一個(gè)變量來存放,那么這個(gè)變量就是指向指針的指針。定義如:char * *p;8 指針數(shù)組作main()函數(shù)的參數(shù)函數(shù)形式為main( int argc, char *argv )main函數(shù)的參數(shù)是從命令行得到的,argc指命令行參數(shù)個(gè)數(shù),注意命令名也算一個(gè)參數(shù),命令行參數(shù)都是字符串,他們的首地址構(gòu)成一個(gè)指針數(shù)組argv。Main函數(shù)的形參用argc和argv只是一個(gè)習(xí)慣,也可以定義成別的名字。9 指針小結(jié)1)有關(guān)指針的數(shù)據(jù)類型定義 含義 Int I; 定義一個(gè)整型變量I Int *p; P為指向整型數(shù)據(jù)的指針變
32、量 Int an; 定義整型數(shù)組a,它有n個(gè)元素 Int *pn; 定義指針數(shù)組p,它有n個(gè)指向整型的指針元素 Int (*p)n; P為指向含有n個(gè)元素的一維數(shù)組的指針變量 Int f(); F為返回整型值的函數(shù) Int *p(); P為返回值為指針的函數(shù),該指針指向整型數(shù)據(jù) Int (*p)(); P為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型值 Int *p; 定義一個(gè)指向指針的指針變量 2)ANSI新增了一種void *指針類型,即定義一個(gè)指針變量,但不指向任何數(shù)據(jù)類型,等用到的時(shí)候再強(qiáng)制轉(zhuǎn)換類型。如: char *p1;void *p2;p1 = (char *)p2;也可以將一個(gè)函數(shù)定義成
33、void *型,如:void *fun( ch1, ch2 )表示函數(shù)fun返回一個(gè)地址,它指向空類型,如果需要用到此地址,也要對其強(qiáng)制轉(zhuǎn)換。如(假設(shè)p1為char型):p1=(char *)fun( c1,c2 );指針應(yīng)該說是c語言中比較重要的概念,也是c語言的精華,它有很多優(yōu)點(diǎn),但用不好也會帶來嚴(yán)重性的錯(cuò)誤,這就需要我們多用,多練,慢慢的積累經(jīng)驗(yàn)。Top of Page 第十章 結(jié)構(gòu)體與共用體1 定義結(jié)構(gòu)體定義的一般形式:struct 結(jié)構(gòu)體名成員列表;定義一個(gè)結(jié)構(gòu)體變量可以這樣定義:struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量名;2 結(jié)構(gòu)體變量的引用在引用結(jié)構(gòu)體變量時(shí)應(yīng)注意以下規(guī)則:1)不能將結(jié)
34、構(gòu)體變量作為一個(gè)整體輸入輸出,只能對變量當(dāng)中的各個(gè)成員輸入輸出。新標(biāo)準(zhǔn)C允許將一個(gè)結(jié)構(gòu)體變量直接賦值給另一個(gè)具有相同結(jié)構(gòu)的結(jié)構(gòu)體變量。3 結(jié)構(gòu)體變量的初始化如:struct studentlong int num;char name20;char sex;char addr20;a=89031,"Li Lin",'M',"123 Beijing Road" ;4 結(jié)構(gòu)體數(shù)組struct student stu4;定義了一個(gè)數(shù)組stu,其元素為struct student類型,數(shù)組有4個(gè)元素。注意數(shù)組各元素在內(nèi)存中是連續(xù)存放的。在定義結(jié)構(gòu)體
35、數(shù)組時(shí),數(shù)組元素個(gè)數(shù)可以不指定。編譯時(shí),系統(tǒng)會根據(jù)給出初值的結(jié)構(gòu)體常量的個(gè)數(shù)來確定數(shù)組元素的個(gè)數(shù)。5 指向結(jié)構(gòu)體變量的指針因?yàn)榻Y(jié)構(gòu)體變量在內(nèi)存中是連續(xù)存放各成員的,因此我們可以將結(jié)構(gòu)體變量在內(nèi)存中的起始地址存放到一個(gè)變量中,那么這個(gè)變量就是指向結(jié)構(gòu)體變量的指針。注意將結(jié)構(gòu)體變量的首地址賦給指針變量的形式:struct student stu_1;struct student *p;p=&stu_1; /要加取地址符而指向函數(shù)和指向字符串的指針不用在對引用結(jié)構(gòu)體變量中的成員時(shí),有三種方式:以上面的結(jié)構(gòu)體為例:設(shè)p為指向此結(jié)構(gòu)體變量的指針,即p=&a;1) a.num2) (*p)
36、.num3) p->num6 指向結(jié)構(gòu)體數(shù)組的指針struct student *p;struct student stu4;p=stu;則p為指向結(jié)構(gòu)體數(shù)組的指針變量。這里應(yīng)注意p+,p指向stu0,p+則指向stu1。P指向的是數(shù)組中一個(gè)元素的首地址,而不能讓p指向元素中的某一成員,如p=&stuI.name是不對的。7 用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)雖然ANSI C允許用整個(gè)結(jié)構(gòu)體作為函數(shù)參數(shù),但要將全部成員值一個(gè)一個(gè)傳遞,開銷大。所以用指針作參數(shù),能提高運(yùn)行效率。 Struct student stu;用整個(gè)結(jié)構(gòu)體作為參數(shù)調(diào)用形式:fun( stu );而且被調(diào)函數(shù)fun中
37、也要定義成結(jié)構(gòu)體變量,struct student stu;用指針作參數(shù)調(diào)用形式:fun( &stu );被調(diào)函數(shù)fun中定義成指針變量,struct student *p;8 用指針處理鏈表鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),原因就在于它可以動(dòng)態(tài)的進(jìn)行存儲分配。鏈表都有一個(gè)頭指針,用來存放整個(gè)鏈表的首地址。鏈表的定義形式如下:struct nodeint num;struct node *next;next用來存放下一節(jié)點(diǎn)的地址。如何進(jìn)行動(dòng)態(tài)的開辟和釋放存儲單元呢?c提供了以下有關(guān)函數(shù):1) malloc(size) 在內(nèi)存的動(dòng)態(tài)存儲區(qū)開辟一個(gè)長度為size的連續(xù)空間。成功返回空間首地址,失敗
38、返回0;2) calloc(n,size) 在內(nèi)存的動(dòng)態(tài)存儲區(qū)開辟n個(gè)長度為size的連續(xù)空間。成功返回空間首地址,失敗返回0;3) free(ptr) 釋放由ptr指向的內(nèi)存區(qū)。Ptr是最近調(diào)用一次調(diào)用malloc和calloc時(shí)返回的值。 上面函數(shù)中,n和size為整型,ptr為字符指針。9 共用體定義形式:union 共用體名成員列表變量列表;共用體和結(jié)構(gòu)體類似,只是有一點(diǎn)不同,結(jié)構(gòu)體中個(gè)成員的起始地址不同,結(jié)構(gòu)體變量在內(nèi)存中的長度為各成員長度之和;而共用體中個(gè)成員的起始地址相同,共用體變量所占的內(nèi)存長度為最長的成員的長度。 共用體類型數(shù)據(jù)的特點(diǎn):1) 同一個(gè)內(nèi)存段可以存放幾種不同類型的
39、成員2) 共用體變量中起作用的成員是最后一次存放的成員3) 不能對共用體變量名賦值,不能在定義時(shí)初始化。4) 不能把共用體變量作為函數(shù)參數(shù)5) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體定義中,反之也可,也可以定義共用體數(shù)組。 另外,結(jié)構(gòu)體名可以作為參數(shù),而共用體名不可以。這兩中數(shù)據(jù)結(jié)構(gòu)在不同場合中各有所用。10 枚舉類型定義形式如下:舉個(gè)例子enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekday workday,week_end; /定義枚舉變量workday和week_end被定義成枚舉類型,他們的值只能為sun到sat之一。也可以直接定義枚舉變量,這一點(diǎn)
40、與結(jié)構(gòu)體相同enum weekdaysun,mon,tue,wed,thu,fri,satwordday,week_end;注意:枚舉元素是作為常量存在的,他們是有值的,c在編譯時(shí)使他們的值按順序?yàn)?,1,2如:上面的定義中,sun的值為0,mon的值為1另外:雖然枚舉元素有值,但不能將一個(gè)整數(shù)直接賦給一個(gè)枚舉變量。應(yīng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,如:workday=(enum weekday)2;它相當(dāng)于把tue賦給了workday。11 用typedef定義類型typedef的作用就是能夠讓你定義一個(gè)自己喜歡的數(shù)據(jù)類型名來代替已有的數(shù)據(jù)類型名。如:typedef int INT;那么我就可以用INT來
41、定義整型變量了。作用和int一樣。Typedef用于結(jié)構(gòu)體定義,如:Typedef structInt day;Int month;Int year;DATE;DATE birthday;DATE *p;等等用typedef有利于程序的通用與移植。Top of Page 第十一章 位運(yùn)算1)概述所謂位運(yùn)算是指進(jìn)行二進(jìn)制位的運(yùn)算。在系統(tǒng)軟件中,常要處理二進(jìn)制位的問題。c提供的位運(yùn)算符有:& 按位與| 按位或 按位異或 取反<< 左移>> 右移&對于將一個(gè)單元清零、取一個(gè)數(shù)中的某些指定位以及保留指定位有很大用途。|常被用來將一個(gè)數(shù)的某些位置1。判斷兩個(gè)位值,
42、不同為1,相同為0。常用來使特定位翻轉(zhuǎn)等。常用來配合其它位運(yùn)算符使用的,常用來設(shè)置屏蔽字。<<將一個(gè)數(shù)的各二進(jìn)制位全部左移,高位左移后溢出,舍棄不起作用。左移一位相當(dāng)于該數(shù)乘2,左移n位相當(dāng)于乘2n。左移比乘法運(yùn)算要快的多。>>右移時(shí),要注意符號問題。對無符號數(shù),右移時(shí)左邊高位移入0,對于有符號數(shù),如果原來符號位為0(正數(shù)),則左邊移入0;如果符號位為1(負(fù)數(shù)),則左邊移入還是要取決于系統(tǒng)。移入的稱為"邏輯右移",移入的稱為"算數(shù)右移"。2)位段將一個(gè)字節(jié)分為幾段來存放幾個(gè)信息。所謂位段是以位為單位定義長度的結(jié)構(gòu)體類型中的成員。如
43、:struct packed-dataunsigned a:2; unsigned b:6;unsigned c:4;unsigned d:4;int I;data;其中a,b,c,d分別占2位,6位,4位,4位。I為整型,占4 個(gè)字節(jié)。對于位段成員的引用如下:data.a = 2;等,但要注意賦值時(shí),不要超出位段定義的范圍。如位段成員a定義為2位,最大值為3,即(11)2,所以data.a=5;就會取5的兩個(gè)低位進(jìn)行賦值,就得不到想要的值了。關(guān)于位段的定義和引用,有幾點(diǎn)重要說明:若某一個(gè)段要從另一個(gè)字開始存放,可以定義:unsigned a:1;unsigned b:2;unsigned :
44、0;unsigned c:3; (另一單元)使用長度為0的位段,作用就是使下一個(gè)位段從下一個(gè)存儲單元開始存放。一個(gè)位段必須存放在用一個(gè)存儲單元中,不能跨兩個(gè)單元??梢远x無名位段。如:unsigned a:1;unsigned :2; (這兩位空間不用)unsigned b:3;位段的長度不能大于存儲單元的長度,也不能定義位段數(shù)組。 Top of Page 第十二章 文件1) 概述c語言將文件看成一個(gè)字符的序列,分為ASCII文件(文本文件)和二進(jìn)制文件。即一個(gè)c文件就是一個(gè)字節(jié)流或二進(jìn)制流。ASCII文件每一個(gè)字節(jié)放一個(gè)ASCII碼,代表一個(gè)字符,輸出與字符一一對應(yīng),便于逐個(gè)處理字符,但占用
45、空間較多。二進(jìn)制文件按內(nèi)存中的存儲形式原樣輸出到磁盤上,節(jié)省空間,由于輸出與字符不對應(yīng),不能直接輸出字符形式,一般用于保存中間結(jié)果。目前c對文件的處理只有緩沖文件系統(tǒng)一種方法,即無論是從程序到磁盤文件還是從磁盤文件到程序,數(shù)據(jù)都要先經(jīng)過緩沖區(qū),待緩沖區(qū)充滿后,才集中發(fā)送。2) 文件夾類型指針在緩沖文件系統(tǒng)中,關(guān)鍵的概念是文件指針。因?yàn)槊總€(gè)被使用的文件都在內(nèi)存中開辟一個(gè)緩沖區(qū),來存放文件有關(guān)信息。這些信息保存在一個(gè)結(jié)構(gòu)體變量中,該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILE,在stdio.h中定義。FILE *fp;定義了一個(gè)文件指針變量fp,以后對文件的操作都是通過fp進(jìn)行的。3) 文件的打開與關(guān)
46、閉在對文件讀寫之前,要先打開文件。打開文件的函數(shù)為:fopen(),調(diào)用方式為:FILE *fp;fp=fopen( filename,使用文件方式 );fopen()失敗返回一個(gè)空指針NULL,成功則返回一個(gè)指向"filename"的文件指針,賦給fp,這樣fp就和打開的文件聯(lián)系在一起了?;蛘哒f,fp指向了"filename"。文件使用方式:r,w,a,rb,wb,ab,r+,w+,a+,rb+,wb+,ab+,具體含義要記住。4)文件的關(guān)閉為了防止數(shù)據(jù)丟失,程序結(jié)束前,務(wù)必將打開的文件關(guān)閉,即將文件指針與文件脫鉤。用fclose(文件指針)函數(shù)關(guān)閉文件,執(zhí)行函數(shù)后,先將緩沖區(qū)中的數(shù)據(jù)送到磁盤文件,然后釋放文件指針。成功返回0,失敗返回非0。5)文件的讀寫文件打開后,就可以對其讀寫了,常用的文件讀寫函數(shù)有:fputc和fgetcfputc將一個(gè)字符寫到文件,形式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年房地產(chǎn)開發(fā)土方合同
- 2024年文化藝術(shù)節(jié)活動(dòng)組織與承辦合同
- 2024年修訂版技術(shù)轉(zhuǎn)讓合同
- 2024年文化旅游綜合體開發(fā)合作協(xié)議
- DB4117T 233-2018 夏芝麻高產(chǎn)高效栽培技術(shù)規(guī)程
- DB4117T 169.13-2023 動(dòng)物疫病流行病學(xué)調(diào)查技術(shù)規(guī)范 第13部分:雞傳染性支氣管炎
- 2024年工業(yè)用水管道安裝協(xié)議
- 2024年度××建筑工程項(xiàng)目施工合同
- 質(zhì)檢個(gè)人年度總結(jié)(7篇)
- 2024年技術(shù)轉(zhuǎn)讓合同:研發(fā)機(jī)構(gòu)將自主研發(fā)的技術(shù)轉(zhuǎn)讓給企業(yè)
- 三年級美術(shù)上冊全冊教案(湘教版)
- 2024版成人術(shù)中非計(jì)劃低體溫預(yù)防與護(hù)理培訓(xùn)課件
- 2024第五輪營商環(huán)境考試復(fù)習(xí)試題含答案
- 綜合素質(zhì)評價(jià)平臺建設(shè)方案-2024
- GB/T 44539-2024螢石技術(shù)規(guī)范
- 廣東省珠海市紫荊中學(xué)2025屆高二數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 2024屋頂分布式光伏場站設(shè)備運(yùn)維規(guī)程
- 北師大版數(shù)學(xué)一上 3.1《一共有多少》教學(xué)設(shè)計(jì)
- 2024-2030年全球及中國電弧故障檢測裝置(AFDD)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- GB/T 44395-2024激光雷達(dá)測風(fēng)數(shù)據(jù)可靠性評價(jià)技術(shù)規(guī)范
- 10《我們所了解的環(huán)境污染》第一課時(shí)從白色污染說起(教學(xué)設(shè)計(jì))部編版道德與法治四年級上冊
評論
0/150
提交評論