版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、I. 都不同的撰可以喜打每讀妒獎?wù)吭O(shè)計讀書C程序設(shè)計讀書筆記 關(guān)鍵字:c語言原作者姓名:loose_went寫在前面:第一章概述C程序設(shè)計可以說是一本再基礎(chǔ)不過的編程書了,但每讀一遍的感覺卻都是不同的, 可以說,每讀一遍,都會有很多新的收獲。真所謂老書再讀,回味無窮?。〈斯P記是C程序設(shè)計譚浩強(qiáng)編著,清華大學(xué)岀版社岀版。除了將書中的重點知識點記下來外,也加入了我對 知識點的理解,我想這一點是讀書筆記的重要性所在。第一章概述第二章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式第三章 最簡單的C程序設(shè)計第四章邏輯運(yùn)算和判斷選取控制第五章循環(huán)控制第六章數(shù)組第七章函數(shù)第八章預(yù)編譯處理第九章指針第十章結(jié)構(gòu)體與共用體第十一章位運(yùn)
2、算第十二章文件1. C語言的特點 語言簡潔、緊湊,使用方便、靈活。共有3 2個關(guān)鍵字,9種控制語句。 運(yùn)算符豐富,公有3 4種運(yùn)算符。 數(shù)據(jù)結(jié)構(gòu)豐富,數(shù)據(jù)類型有:整型、實型、字符型、數(shù)組、指針、結(jié)構(gòu)體、共用體等。 具有結(jié)構(gòu)化的控制語句(如ifelse while、dowhile、switch、for) 語法限制不太嚴(yán)格,程序設(shè)計自由度大。 允許直接訪問物理地址,能進(jìn)行位(bit)操作,可以直接對硬件操作。 生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。 可移植性好。2. C語言的用途C雖不擅長科學(xué)計算和管理領(lǐng)域,但對操作系統(tǒng)和系統(tǒng)實用程序以及對硬件進(jìn)行操作方面,C有明顯的優(yōu)勢?,F(xiàn)在很多大型應(yīng)用軟件也用C
3、編寫。瓦 Top of Page第二章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式1 C 的數(shù)據(jù)類型C的數(shù)據(jù)類型包括:整型、字符型、實型或浮點型(單精度和雙精度)、枚舉類型、數(shù)組類型、 結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。2 常量與變量 常量其值不可改變,符號常量名通常用大寫。變量其值可以改變,變量名只能由字母、數(shù)字和 下劃線組成,且第一個字符必須為字母或下劃線。否則為不合法的變量名。變量在編譯時為其 分配相應(yīng)存儲單元。3 整型數(shù)據(jù)整型常量的表示方法:十進(jìn)制不用說了,八進(jìn)制以0開頭,如 0123,十六進(jìn)制以 0x 開頭,如0x1e。整型變量分為:基本型( int )、短整型( short int )、長整型
4、( long int )和無符號型。不 同機(jī)器上各類數(shù)據(jù)所占內(nèi)存字節(jié)數(shù)不同,一般int型為2個字節(jié),long型為4個字節(jié)。4 實型數(shù)據(jù) 實型常量表示形式: 十進(jìn)制形式由數(shù)字和小數(shù)點組成 (必須有小數(shù)點) ,如: 0.12 、 .123 、 123. 、 0.0等。指數(shù)形式如 123e3代表123X 10的三次方。實型變量分為單精度( float )和雙精度( double )兩類。在一般系統(tǒng)中 float 型占 4字節(jié), 7 位有效數(shù)字, double 型占 8字節(jié), 1516 位有效數(shù)字。5 字符型數(shù)據(jù) 字符變量用單引號括起來,如 a,b 等。還有一些是特殊的字符常量,如 n,t 等。分別
5、代表換行和橫向跳格。字符變量以 char 來定義,一個變量只能存放一個字符常量。字符串常量是由雙引號括起來的字符序列。這里一定要注意a和a的不同,前者為字符常量,后者為字符串常量, c 規(guī)定:每個字符串的結(jié)尾加一個結(jié)束標(biāo)志 0 ,實際上 a 包含兩個字 符: a 和0。6 數(shù)值型數(shù)據(jù)間的混合運(yùn)算整型、字符型、實型數(shù)據(jù)間可以混合運(yùn)算,運(yùn)算時不同類型數(shù)據(jù)要轉(zhuǎn)換成同一類型再運(yùn)算,轉(zhuǎn)換規(guī)則: char,short - int - unsigned - long - double =v=匸 )邏輯運(yùn)算符(! & II )位運(yùn)算符( | A &)賦值運(yùn)算符(=)條件運(yùn)算符(?:)逗號運(yùn)算符(,)指針運(yùn)算符
6、(*&)求字節(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加加1, i+使用i之后,使i加H1o逗號表達(dá)式的求解過程:先求解表達(dá)式1, 再求解表達(dá)式2, 整個表達(dá)式的值是表達(dá)式2的值。云 Top of Page第三章 最簡單的C程序設(shè)計1. c的9種控制語句:if()elsefor()while()dowhile()con ti nuebreakswitchgotoreturn程序的三種基本結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)2 數(shù)據(jù)輸出c語言不提供輸入輸岀語句,
7、輸入輸岀操作是由c的庫函數(shù)完成。但要包含頭文件stdio.hputchar()向終端輸岀一個字符printf() 的格式字符: d格式符用來輸岀十進(jìn)制整數(shù)%d按整型數(shù)據(jù)的實際長度輸出%md使輸岀長度為 m如果數(shù)據(jù)長度小于m,則左補(bǔ)空格,如果大于m,則輸岀實際長度%ld輸出長整型數(shù)據(jù) o格式符以八進(jìn)制形式輸岀整數(shù) x格式符以十六進(jìn)制形式輸岀整數(shù) u格式符用來輸岀unsigned型數(shù)據(jù),以十進(jìn)制形式輸岀 c格式符用來輸岀一個字符 s格式符輸岀一個字符串%s輸岀實際長度字符串%ms輸岀的串占m列,如果串長度小于 %-ms輸岀的串占m列,如果串長度小于 %m.ns輸岀占m列,但只取字符串中左端 %-m
8、.ns m、n含義同上,靠左對齊,如果 f格式符以小數(shù)形式輸岀實數(shù)m左補(bǔ)空格,如果大于m實際輸岀m右補(bǔ)空格,n個字符并靠右對齊nm,則m自動取n值%f整數(shù)部分全部輸岀,小數(shù)部分輸岀6位%m.nf輸岀數(shù)據(jù)共占 m列,其中有n位小數(shù)。如果數(shù)值長度小于m,左補(bǔ)空格%-m.nf同上,右補(bǔ)空格e格式符以指數(shù)形式輸岀實數(shù)%e系統(tǒng)指定6位小數(shù),5位指數(shù)(e+002 ) g格式符 輸岀實數(shù),根據(jù)數(shù)值大小,自動選 f格式或e格式3 數(shù)據(jù)輸入getchar()從終端輸入一個字符scanf( 格式控制,地址列表)標(biāo)準(zhǔn)C scanf中不使用u對于unsigned型數(shù)據(jù),以%d或0或x 輸入。后的*,用來跳過它相應(yīng)的數(shù)
9、據(jù)。輸入數(shù)據(jù)時不能規(guī)定精度如scanf( %7.2f, &a );是不合法的。k Top of Page第四章 邏輯運(yùn)算和判斷選取控制1. 關(guān)系運(yùn)算符:c提供6種關(guān)系運(yùn)算符( =!=)前四種優(yōu)先級高于后兩種2. If 語句C提供了三種形式的if語句If(表達(dá)式)語句If(表達(dá)式)語句1 else 語句2If(表達(dá)式1)語句1Else if( 表達(dá)式2)語句2else 語句n3. 條件運(yùn)算符(ab)?a:b條件為真,表達(dá)式取值a,否則取值b4. Switch 語句Switch(表達(dá)式)case 常量表達(dá)式1:語句1; break;case常量表達(dá)式2:語句 2; break;case 常量表達(dá)式
10、 n:語句n ; break;default :語句n+1第五章循環(huán)控制1. 幾種循環(huán)語句goto語句(現(xiàn)已很少使用)while語句先判斷表達(dá)式后執(zhí)行語句do-while語句先執(zhí)行語句后判斷表達(dá)式for語句2. Break 語句和 continue 語句Break語句用于跳岀循環(huán),continue用于結(jié)束本次循環(huán)。第六章數(shù)組1.一維數(shù)組K Top of PageK Top of Pagec規(guī)定只有靜態(tài)存儲( 不指定數(shù)組長度。static )和外部存儲(extern )數(shù)組才能初始化。給數(shù)組初始化時可以2.二維數(shù)組3.字符數(shù)組部分字符串處理函數(shù)puts(字符數(shù)組)將一個字符串輸岀到終端。gets
11、(字符數(shù)組)從終端輸入一個字符串到字符數(shù)組,并且得到一個函數(shù)值,為該字符數(shù)組的 首地址strcat(字符數(shù)組1 ,字符數(shù)組2)連接兩個字符數(shù)組中的字符串,數(shù)組1必須足夠大。Strcpy(字符數(shù)組1 ,字符串2)將字符串2拷貝到字符數(shù)組1中。Strcmp(字符串1,字符串2)比較字符串,相等返回0,字符串1 字符串2,返回正數(shù),小于返回負(fù)數(shù)。Strlen(字符數(shù)組)求字符串長度。Strlwr( 字符串) 將字符串中的大寫字母轉(zhuǎn)換成小寫Strupr( 字符串)將字符串中的小寫字母轉(zhuǎn)換成大寫 以上是一些比較常用的字符串處理函數(shù)。k Top of Page第七章函數(shù)1. 關(guān)于形參和實參的說明 在函數(shù)被
12、調(diào)用之前,形參不占內(nèi)存 實參可以是常量、變量或表達(dá)式 必須指定形參的類型 實參與形參類型應(yīng)一致 實參對形參的數(shù)據(jù)傳遞是 值傳遞,即單向傳遞2. 函數(shù)返回值如果想讓函數(shù)返回一個值,在函數(shù)中就要用retur n 語句來獲得,在定義函數(shù)時也要對函數(shù)值指定類型,如果不指定,默認(rèn)返回整型。3. 函數(shù)調(diào)用1)注意在函數(shù)調(diào)用時實參和形參的個數(shù)、類型應(yīng)一一對應(yīng)。對實參表求值的順序是不確定的, 有的系統(tǒng)按自左至右,有的系統(tǒng)則按自右至左的順序。這一點要注意。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)行說明。 除非:
13、(1)被調(diào)函數(shù)的返回值類型為整型或字符型 (2)被調(diào)函數(shù)岀現(xiàn)在主調(diào)函 數(shù)之前。4)對函數(shù)的說明和定義是不同的,定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型,形參及其類型、函數(shù)體等。說明則只是對已定義的函數(shù)返回值類型進(jìn)行說明,只包括函數(shù)名、函數(shù)類型以及一個空的括弧,不包括形參和函數(shù)體。5)c語言允許函數(shù)的遞歸調(diào)用(在調(diào)用一個函數(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ù)中對形參
14、數(shù)組定義時可以省略第一維的大小說明, 但不能省略 第二維或更高維的說明。5 局部變量和全局變量從變量作用域角度分,變量可分為局部變量和全局變量。1) 內(nèi)部變量(局部變量)在一個函數(shù)內(nèi)定義,只在函數(shù)范圍內(nèi)有效的變量。2) 外部變量(全局變量)在函數(shù)外定義,可以為本文件其它函數(shù)所共用,有效范圍從定義變量的位置開始到本文件結(jié)束。建議盡量少使用全局變量,因為它在程序全部執(zhí)行過程中都占用 資源,而且使函數(shù)的通用性降低了。如果在定義外部變量之前的函數(shù)要想使用該 外部變量,則應(yīng)在該函數(shù)中用 extern 作外部變量說明。6 動態(tài)存儲變量與靜態(tài)存儲變量C語言中,變量的存儲方法分為兩大類: 靜態(tài)的 (stati
15、c) ,寄存器的 (register)1) 局部變量的存儲方式 函數(shù)中的局部變量如不作專門說明,都之從變量值存在的時間(生存期)角度來分,可分為靜態(tài)存儲變量和動態(tài)存儲變量。靜態(tài)存儲指 在程序運(yùn)行期間給變量分配固定的存儲空間, 動態(tài)存儲指程序運(yùn)行期間根據(jù)需要動態(tài)的給變量 分配存儲空間。靜態(tài)存儲類和動態(tài)存儲類,具體包括:自動的(auto ),,外部的 (extern) 。auto 的,即動態(tài)存儲的, auto 可以省略。局部變量 也可以定義為 static 的,這時它在函數(shù)內(nèi)值是不變的。靜態(tài)局部變量如不賦初值,編譯時系統(tǒng)自動賦值為0,動態(tài)局部變量如不賦初值,則它的值是個不確定的值。C規(guī)定,只有在定
16、義全局變量和局部靜態(tài)變量時才能對數(shù)組賦初值。為提高執(zhí)行效率,c 允許將局部變量值放在寄存器中,這種變量叫 register 變量,要用 register 說明。但只有局部動態(tài)變量和形式參數(shù)可 以作為 register 變量,其它不行。2) 全局變量的存儲方式全局變量在函數(shù)外部定義,編譯時分配在靜態(tài)存儲區(qū),可以在程序中各個函數(shù)所引用。多個文 件的情況如何引用全局變量呢?假如在一個文件定義全局變量,在別的文件引用, 就要在此文件中用 extern 對全局變量說明, 但如果全局變量定義時用 static 的話, 此全局變量就只能在 本文件中引用了,而不能被其它文件引用。3) 存儲類別小結(jié)從作用域角度
17、分,有局部變量和全局變量 局部變量:自動變量,即動態(tài)局部變量(離開函數(shù),值就消失)靜態(tài)局部變量(離開函數(shù),值仍保留)寄存器變量(離開函數(shù),值就消失)(形參可定義為自動變量和寄存器變量) 全局變量:靜態(tài)全局變量(只限本文件引用) 全局變量(允許其它文件引用) 從存在的時間分,有靜態(tài)存儲和動態(tài)存儲 動態(tài)存儲:自動變量(本函數(shù)內(nèi)有效)寄存器變量(本函數(shù)內(nèi)有效)形參靜態(tài)存儲:靜態(tài)局部變量(函數(shù)內(nèi)有效) 靜態(tài)全局變量(本文件內(nèi)有效) 全局變量(其它文件可引用)從變量值存放的位置分 靜態(tài)存儲區(qū):靜態(tài)局部變量靜態(tài)全局變量全局變量動態(tài)存儲區(qū):自動變量和形參寄存器內(nèi):寄存器變量7.內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù):只
18、能被本文件中的其它函數(shù)調(diào)用,定義時前加static ,內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。外部函數(shù):可以被其它文件調(diào)用,定義時前加extern,如果省略,則隱含為外部函數(shù),在需要調(diào)用此函數(shù)的文件中,一般要用extern說明。Top of Page第八章預(yù)編譯處理c提供的預(yù)處理功能主要有以下三c編譯系統(tǒng)在對程序進(jìn)行通常的編譯之前,先進(jìn)行預(yù)處理。 種:1)宏定義 2 )文件包含 3)條件編譯 1.宏定義#define 標(biāo)識符字符串不帶參數(shù)的宏定義用一個指定的標(biāo)識符來代表一個字符串,形式:幾點說明:1)宏名一般用大寫2)宏定義不作語法檢查,只有在編譯被宏展開后的源程序時才會報錯3)宏定義不是c語句,不在行末加分號
19、4)宏名有效范圍為定義到本源文件結(jié)束5)可以用#undef命令終止宏定義的作用域6)在宏定義時,可以引用已定義的宏名 帶參數(shù)的宏定義 定義形式:#defi ne 宏名(參數(shù)表) 字符串這和函數(shù)有些類似,但他們是不同的:1)函數(shù)調(diào)用時,先求實參表達(dá)式值,再代入形參,而宏只是簡單替換,并不求值2)函數(shù)調(diào)用是在程序運(yùn)行時分配內(nèi)存的,而宏展開時并不分配內(nèi)存,也沒有返回值的概念3)對函數(shù)中的實參和形參都要定義類型,而且要求一致,宏名無類型,其參數(shù)也沒有類型。4)函數(shù)只有一個返回值,而宏可以得到幾個結(jié)果5)宏替換不占運(yùn)行時間,只占編譯時間,而函數(shù)調(diào)用占運(yùn)行時間2. 文件包含處理#inelude 文件1就是
20、將文件1的全部內(nèi)容復(fù)制插入到 #inelude 位置,作為一個源文件進(jìn)行 編譯。在#山elude 命令中,文件名可以用“ “也可以用 ,假如現(xiàn)在filel.c 中包含file2.h 文件,表示系統(tǒng)先在filel.c 所在目錄中找file2.h ,如果找不到,再按系統(tǒng)指定的標(biāo)準(zhǔn)方式檢 索目錄,表示系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索目錄。所以用“保險一點。3. 條件編譯條件編譯指不對整個程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:1)#ifdef 標(biāo)識符程序段1#else程序段2#en dif它的作用:當(dāng)標(biāo)識符在前面已經(jīng)被定義過(一般用#define ),則對程序段1編譯,否則對程序段
21、2編譯。2)#ifndef 標(biāo)識符程序段1#else程序段2#en dif它的作用和#ifdef相反,當(dāng)標(biāo)識符沒被定義過,對程序段1編譯,否則對程序段2編譯。3)#if 表達(dá)式程序段1#else程序段2#en dif它的作用:當(dāng)表達(dá)式值為真(非0)時,對程序段1編譯,否則對程序段2編譯。k Top of Page第九章指針指針說白了就是地址。指針變量就是用來存放指針(地址)的變量1 變量的指針和指向變量的指針變量 讀起來很拗口, 說白了就是變量的地址和用來存放變量地址的地址變量。 因為一個變量在編譯 的時候系統(tǒng)要為它分配一個地址, 假如再用一個變量來存放這個地址, 那么這個變量就叫做指 向變量
22、的指針變量, 也就是用來存放變量地址的這么一個變量。 所謂“指向“就是指存放XX的 地址, 如指向變量的指針變量, 指向 就是指用來存放變量的地址, 再如指向數(shù)組的指針變量, 指向 就是指存放數(shù)組的地址。只要理解了這個,指針也就不難了。另外,還有指向字符串的 指針變量,指向函數(shù)的指針變量,指向指針的指針變量等。1) 指針變量的定義形式:類型標(biāo)識符* 標(biāo)識符 如: int *pointer;要注意兩點: *表示 pointer 是個指針變量, 在用這個變量的時候不能寫成 *pointer , *pointer是 pointer 指向的變量。一個指針變量只能指向同一個類型的變量。如上面 point
23、er 只能指向 int 型變量。2) 指針變量的引用兩個有關(guān)的運(yùn)算符:& 取地址運(yùn)算符 &a 就代表變量 a 的地址* 指針運(yùn)算符 *a 就代表變量 a 的值2 數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針指數(shù)組的起始地址,數(shù)組元素的指針指數(shù)組元素的地址。1) 指向數(shù)組元素的指針變量的定義與賦值定義和指向變量的指針變量定義相同, c 規(guī)定數(shù)組名代表數(shù)組的首地址,即第一個數(shù)組元素地 址。2) 通過指針引用數(shù)組元素我們通常引用數(shù)組元素的形式是 ai ,如果用指針可以這樣引用, *(a+i) ,或定義一個指針 變量p,將數(shù)組a的首地址賦給 p, p=a;然后用*(p+i)弓I用。注意:指針變量P指向數(shù)組
24、a首地址,則p+指向數(shù)組a的下一元素地址,即a1的地址。3) 數(shù)組名作函數(shù)參數(shù)形參數(shù)組和實參數(shù)組之間并不是值傳遞, 而是共用同一段地址, 所以在函數(shù)調(diào)用過程中如果形 參的值發(fā)生變化,則實參的值也跟著變化。4) 指向多維數(shù)組的指針和指針變量以二維數(shù)組為居多。假設(shè)定義了一個二維數(shù)組 a34 ,那么a代表整個二維數(shù)組的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。 a +0 和 a0 代表第 0 行首地址, a+1 和 a1 代表第一行的首地址。假設(shè)a是一個數(shù)組的首地址,那么如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則 a+I 代表第 I 行的首地址。那么第一行
25、第二列的元素地址如何表示呢?a1+2或&a12或*(a+1)+2。我們只要記住:在二維數(shù)組中 a 代表整個數(shù)組的首地址, aI 代表第 I 行的首地址, aI 與 *(a+I) 等價就行了。只要運(yùn)用熟練了就沒什么復(fù)雜的了。5) 指向由m個整數(shù)組成的一維數(shù)組的指針變量如: int (*p)4, p 是一個指向包含 4 個元素的一維數(shù)組,如果 p 先指向 a0 ,則 p+1 指向a1 ,即 p 的增值是以一維數(shù)組的長度為單位的,這里是 4,舉個例子:假設(shè) a34=1,3,5,7,9,11,13,15,17,19,21,23, p 先指向 a0也就是數(shù)組 a 的首地址,那么 p+1 就是 a1 的首
26、地址即元素 9 的地址,因為在定義 p 時 int (*p)4 ,定義一維數(shù)組長 度為 4,所以 p+1 就等于加了一個一維數(shù)組的長度4。3 字符串的指針和指向字符串的指針變量1) 字符串的表示形式c 中字符串有兩種表示形式:一種是數(shù)組,一種是字符指針char string=I love c!;char *str=I love c!; 其實指針形式也是在內(nèi)存中開辟了一個數(shù)組,只不過數(shù)組的首地址存放在字符指針變量str中,千萬不要認(rèn)為 str 是一個字符串變量。2) 字符串指針作函數(shù)參數(shù)實際上字符串指針就是數(shù)組的首地址。3) 字符指針變量與字符數(shù)組的區(qū)別 字符數(shù)組由若干元素組成,每個元素存放一個
27、字符,而字符指針變量只存放字符串的首地 址,不是整個字符串 對數(shù)組初始化要用 static ,對指針變量不用。 對字符數(shù)組賦值,只能對各個元素賦值,不能象下面這樣:char str14; str=I love c!;對指針變量可以,char *str;str=I love c!;注意:此時賦給 str 的不是字符,而是字符串首地址。 數(shù)組在定義和編譯時分配內(nèi)存單元,而指針變量定義后最好將其初始化,否則指針變量的 值會指向一個不確定的內(nèi)存段,將會破壞程序。如:char *a;scanf( %s, a ); 這種方法是很危險的,應(yīng)該這樣:char *a, str10;a = str;scanf(
28、%s, a ); 這樣字符指針就指向了一個確定的內(nèi)存段。 指針變量的值是可以改變的,而字符數(shù)組名所代表的字符串首地址卻是不能改變的。4 函數(shù)的指針和指向函數(shù)的指針變量一個函數(shù)在編譯時被分配一個入口地址, 這個入口地址就稱為函數(shù)的指針。 函數(shù)名代表函數(shù)的 入口地址,這一點和數(shù)組一樣。我們可以用一個指針變量來存放這個入口地址,然后通過該指 針變量調(diào)用函數(shù)。如:假設(shè)有一個求兩者較大的函數(shù)如下:int max( int x, int y );當(dāng)我們調(diào)用這個函數(shù)時可以這樣:int c;c=max( a, b ); 這是通常調(diào)用方法,其實我們可以定義一個函數(shù)指針,通過指針來調(diào)用,如: int (*p)()
29、; / 注意指向函數(shù)指針變量的定義形式 p=max; / 此句就是將函數(shù)的入口地址賦給函數(shù)指針變量 p c=(*p)( a, b );有些朋友可能對 (*p)() 不大理解,其實它的意思就是定義一個指向函數(shù)的指針變量p, p 不是固定指向哪個函數(shù)的, 而是專門用來存放函數(shù)入口地址的變量。 在程序中把哪個函數(shù)的入口地 址賦給它,它就指向哪個函數(shù)。但要注意, p 不能象指向變量的指針變量一樣進(jìn)行 p+,p- 等無 意義的操作。既然 p 是一個指針變量, 那么就可以作為函數(shù)的參數(shù)進(jìn)行傳遞。 其實函數(shù)的指針變量最常用的 用途之一就是作為函數(shù)參數(shù)傳遞到其它函數(shù)。這也是 c 語言中應(yīng)用的比較深入的部分了。
30、5 返回指針值的函數(shù) 我們知道,一個函數(shù)可以帶回一個整型值、字符值、實型值等,函數(shù)還可以帶回一個指針型的 數(shù)據(jù),即地址。這種函數(shù)的定義形式如下:類型標(biāo)識符 * 函數(shù)名 (參數(shù)表 ) 如: int *a(x,y) 返回一個指向整型的指針 使用這種函數(shù)的時候要注意: 在調(diào)用時要先定義一個適當(dāng)?shù)闹羔榿斫邮蘸瘮?shù)的返回值。 這個適 當(dāng)?shù)闹羔樒漕愋蛻?yīng)為函數(shù)返回指針?biāo)赶虻念愋?。這樣的函數(shù)比較難于理解, 其實只要把它當(dāng)做一般的函數(shù)來處理就容易了。 當(dāng)我們覺得指針難 于理解的時候,就把它暫時當(dāng)做整型來看,就好理解多了。6 指針數(shù)組指針數(shù)組無疑就是數(shù)組元素為指針,定義形式為: 類型標(biāo)識 *數(shù)組名 數(shù)組長度 如:
31、int *p4,千萬不要寫成in t (*p)4,這是指向一維數(shù)組的指針變量。指針數(shù)組多用于存放若干個字符串的首地址,注意一點,在定義指針數(shù)組時初始化,如下: static char *name=Li jing,Wang mi,Xu shang; 不要以為數(shù)組中存放的是字符串,它存放的是字符串首地址,這一點一定要注意。7 指向指針的指針說的明白一點, 將一個指針再用一個變量來存放, 那么這個變量就是指向指針的指針。 定義如: char * *p;8 指針數(shù)組作 main() 函數(shù)的參數(shù)函數(shù)形式為 main( int argc, char *argv ) main 函數(shù)的參數(shù)是從命令行得到的,
32、argc 指命令行參數(shù)個數(shù),注意命令名也算一個參數(shù),命 令行參數(shù)都是字符串, 他們的首地址構(gòu)成一個指針數(shù)組 argv 。 Main 函數(shù)的形參用 argc 和 argv 只是一個習(xí)慣,也可以定義成別的名字。9 指針小結(jié)1) 有關(guān)指針的數(shù)據(jù)類型定義含義Int I;定義一個整型變量 1Int *p;P為指向整型數(shù)據(jù)的指針變量Int an;定義整型數(shù)組a,它有n個元素Int *p n;定義指針數(shù)組p,它有n個指向整型的指針元素In t (*p) n;P為指向含有n個元素的一維數(shù)組的指針變量Int f();F為返回整型值的函數(shù)Int *p();P為返回值為指針的函數(shù),該指針指向整型數(shù)據(jù)In t (*p
33、)();P為指向函數(shù)的指針,該函數(shù)返回一個整型值Int *p;定義一個指向指針的指針變量2) ANSI新增了一種void *指針類型,即定義一個指針變量,但不指向任何數(shù)據(jù)類型,等用到的時候再強(qiáng)制轉(zhuǎn)換類型。如:char *p1;void *p2;pl = (char *)p2;也可以將一個函數(shù)定義成void *型,如:void *fun( chi, ch2 )表示函數(shù)fun返回一個地址,它指向空類型,如果需要用到此地址,也要對其強(qiáng)制轉(zhuǎn)換。 如(假設(shè)p1為char型):p1=(char *)fun( c1,c2 );指針應(yīng)該說是c語言中比較重要的概念,也是c語言的精華,它有很多優(yōu)點,但用不好也會帶
34、來嚴(yán)重性的錯誤,這就需要我們多用,多練,慢慢的積累經(jīng)驗。k Top of Page第十章結(jié)構(gòu)體與共用體結(jié)構(gòu)體定義的一般形式:struct結(jié)構(gòu)體名成員列表struct結(jié)構(gòu)體名結(jié)構(gòu)體變量名;定義一個結(jié)構(gòu)體變量可以這樣定義:2.結(jié)構(gòu)體變量的引用 在引用結(jié)構(gòu)體變量時應(yīng)注意以下規(guī)則:1) 不能將結(jié)構(gòu)體變量作為一個整體輸入輸出,只能對變量當(dāng)中的各個成員輸入輸出。新標(biāo)準(zhǔn) 允許將一個結(jié)構(gòu)體變量直接賦值給另一個具有相同結(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
35、,123 Beijing Road ;4 結(jié)構(gòu)體數(shù)組struct student stu4;定義了一個數(shù)組 stu,其元素為struct student類型,數(shù)組有 4個元素。注意數(shù)組各元素在內(nèi)存 中是連續(xù)存放的。在定義結(jié)構(gòu)體數(shù)組時,數(shù)組元素個數(shù)可以不指定。編譯時,系統(tǒng)會根據(jù)給出初值的結(jié)構(gòu)體常量 的個數(shù)來確定數(shù)組元素的個數(shù)。5 指向結(jié)構(gòu)體變量的指針因為結(jié)構(gòu)體變量在內(nèi)存中是連續(xù)存放各成員的, 因此我們可以將結(jié)構(gòu)體變量在內(nèi)存中的起始地 址存放到一個變量中,那么這個變量就是指向結(jié)構(gòu)體變量的指針。注意將結(jié)構(gòu)體變量的首地址賦給指針變量的形式:struct student stu_1;struct stu
36、dent *p;p=&stu_1; / 要加取地址符 而指向函數(shù)和指向字符串的指針不用 在對引用結(jié)構(gòu)體變量中的成員時,有三種方式:以上面的結(jié)構(gòu)體為例:設(shè) p 為指向此結(jié)構(gòu)體變量的指針,即 p=&a;1) a.num2) (*p).num3) p-num6 指向結(jié)構(gòu)體數(shù)組的指針struct student *p;struct student stu4;p=stu;則p為指向結(jié)構(gòu)體數(shù)組的指針變量。這里應(yīng)注意p+ , p指向stuO,p+則指向stu1。P指向的是數(shù)組中一個元素的首地址,而不能讓 p 指向元素中的某一成員,如 p=&stuI.name 是不對7 用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)雖然 AN
37、SI C 允許用整個結(jié)構(gòu)體作為函數(shù)參數(shù),但要將全部成員值一個一個傳遞,開銷大。所 以用指針作參數(shù),能提高運(yùn)行效率。Struct student stu;用整個結(jié)構(gòu)體作為參數(shù)調(diào)用形式:fun( stu );而且被調(diào)函數(shù) fun 中也要定義成結(jié)構(gòu)體變量 ,struct student stu; 用指針作參數(shù)調(diào)用形式:fun( &stu );被調(diào)函數(shù) fun 中定義成指針變量, struct student *p;8 用指針處理鏈表鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),原因就在于它可以動態(tài)的進(jìn)行存儲分配。鏈表都有一個頭指針, 用來存放整個鏈表的首地址。鏈表的定義形式如下:struct nodeint num;s
38、truct node *next;next 用來存放下一節(jié)點的地址。如何進(jìn)行動態(tài)的開辟和釋放存儲單元呢? c 提供了以下有關(guān)函數(shù):1) malloc(size) 在內(nèi)存的動態(tài)存儲區(qū)開辟一個長度為 size 的連續(xù)空間。成功返回空間首地址, 失敗返回 0;2) calloc(n,size) 在內(nèi)存的動態(tài)存儲區(qū)開辟 n 個長度為 size 的連續(xù)空間。成功返回空間首地址, 失敗返回 0;3) free(ptr) 釋放由 ptr 指向的內(nèi)存區(qū)。 Ptr 是最近調(diào)用一次調(diào)用 malloc 和 calloc 時返回的值。 上面函數(shù)中, n 和 size 為整型, ptr 為字符指針。9 共用體定義形式:
39、union 共用體名成員列表 變量列表 ; 共用體和結(jié)構(gòu)體類似,只是有一點不同,結(jié)構(gòu)體中個成員的起始地址不同,結(jié)構(gòu)體變量在內(nèi)存 中的長度為各成員長度之和; 而共用體中個成員的起始地址相同, 共用體變量所占的內(nèi)存長度 為最長的成員的長度。共用體類型數(shù)據(jù)的特點:1)同一個內(nèi)存段可以存放幾種不同類型的成員2)共用體變量中起作用的成員是最后一次存放的成員3)不能對共用體變量名賦值,不能在定義時初始化。4)不能把共用體變量作為函數(shù)參數(shù)5)共用體類型可以岀現(xiàn)在結(jié)構(gòu)體定義中,反之也可,也可以定義共用體數(shù)組。另外,結(jié)構(gòu)體名可以作為參數(shù),而共用體名不可以。這兩中數(shù)據(jù)結(jié)構(gòu)在不同場合中各有所用。10.枚舉類型定義形
40、式如下:舉個例子enum weekdaysu n,mon ,tue,wed,thu,fri,sat;enum weekday workday,week_e nd; /定義枚舉變量workday和week_end被定義成枚舉類型,他們的值只能為sun到sat之一。也可以直接定義枚舉變量,這一點與結(jié)構(gòu)體相同enum weekdaysun,mon,tue,wed,thu,fri,satwordday,week_end;注意:枚舉元素是作為常量存在的,他們是有值的,c在編譯時使他們的值按順序為0,1,2如:上面的定義中,sun的值為0,mon的值為1另外:雖然枚舉元素有值,但不能將一個整數(shù)直接賦給一個
41、枚舉變量。應(yīng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,如:workday=(enum weekday)2;它相當(dāng)于把 tue 賦給了 workday。11.用typedef定義類型typedef的作用就是能夠讓你定義一個自己喜歡的數(shù)據(jù)類型名來代替已有的數(shù)據(jù)類型名。如: typedef int INT;那么我就可以用INT來定義整型變量了。作用和 int 樣。Typedef用于結(jié)構(gòu)體定義,如:Typedef structInt day;In t mon th;Int year;DATE;DATE birthday;DATE *p;等等用typedef有利于程序的通用與移植。K Top of Page第十一章位運(yùn)算1)概
42、述所謂位運(yùn)算是指進(jìn)行二進(jìn)制位的運(yùn)算。在系統(tǒng)軟件中,常要處理二進(jìn)制位的問題。c提供的位運(yùn)算符有:& 按位與 | 按位或A按位異或 取反 右移 &對于將一個單元清零、取一個數(shù)中的某些指定位以及保留指定位有很大用途。 |常被用來將一個數(shù)的某些位置1。A判斷兩個位值,不同為1,相同為0。常用來使特定位翻轉(zhuǎn)等。常用來配合其它位運(yùn)算符使用的,常用來設(shè)置屏蔽字。 右移時,要注意符號問題。對無符號數(shù),右移時左邊高位移入0,對于有符號數(shù),如果原來符號位為0 (正數(shù)),則左邊移入 0;如果符號位為 1 (負(fù)數(shù)),則左邊移入0還是1要取決于 系統(tǒng)。移入0的稱為“邏輯右移“,移入1的稱為“算數(shù)右移“。2)位段將一個字
43、節(jié)分為幾段來存放幾個信息。所謂位段是以位為單位定義長度的結(jié)構(gòu)體類型中的成 員。如:struct packed-data unsigned a:2; unsigned b:6;unsigned c:4;unsigned d:4;int I;data;其中a,b,c,d分別占2位,6位,4位,4位。I為整型,占4個字節(jié)。 對于位段成員的引用如下:data.a = 2;等,但要注意賦值時,不要超岀位段定義的范圍。如位段成員a定義為2位,最大值為3,即(11)2,所以data.a=5;就會取5的兩個低位進(jìn)行賦值,就得不到想要的值了。 關(guān)于位段的定義和引用,有幾點重要說明: 若某一個段要從另一個字開始存
44、放,可以定義:unsigned a:1;unsigned b:2;unsigned :0;unsigned c:3; ( 另一單元 ) 使用長度為 0 的位段,作用就是使下一個位段從下一個存儲單元開始存放。 一個位段必須存放在用一個存儲單元中,不能跨兩個單元。 可以定義無名位段。如:unsigned a:1;unsigned :2; ( 這兩位空間不用 )unsigned b:3; 位段的長度不能大于存儲單元的長度,也不能定義位段數(shù)組k Top of Page第十二章文件1)概述c語言將文件看成一個字符的序列,分為ASCII文件(文本文件)和二進(jìn)制文件。即一個c文件就是一個字節(jié)流或二進(jìn)制流。A
45、SCII文件每一個字節(jié)放一個ASCII碼,代表一個字符,輸岀與字符一一對應(yīng),便于逐個處理字符,但占用空間較多。二進(jìn)制文件按內(nèi)存中的存儲形式原樣輸出到磁盤上,節(jié)省空間,由于輸岀與字符不對應(yīng),不能直接輸岀字符形式,一般用于保存中間結(jié)果。目前c對文件的處理只有緩沖文件系統(tǒng)一種方法,即無論是從程序到磁盤文件還是從磁盤文件到程序,數(shù)據(jù)都要先經(jīng)過緩沖區(qū),待緩沖區(qū)充滿后,才集中發(fā)送。2)文件夾類型指針在緩沖文件系統(tǒng)中,關(guān)鍵的概念是文件指針。因為每個被使用的文件都在內(nèi)存中開辟一個緩沖 區(qū),來存放文件有關(guān)信息。這些信息保存在一個結(jié)構(gòu)體變量中,該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILE,在stdio.h中定義。F
46、ILE *fp;定義了一個文件指針變量fp,以后對文件的操作都是通過fp進(jìn)行的。3)文件的打開與關(guān)閉在對文件讀寫之前,要先打開文件。打開文件的函數(shù)為:fopen(),調(diào)用方式為:FILE *fp;fp=fope n( file name,使用文件方式);fopen()失敗返回一個空指針NULL,成功則返回一個指向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)閉,即將文
47、件指針與文件脫鉤。用fclose(文件指針)函數(shù)關(guān)閉文件,執(zhí)行函數(shù)后,先將緩沖區(qū)中的數(shù)據(jù)送到磁盤文件,然后釋放文 件指針。成功返回 0,失敗返回非0。5)文件的讀寫文件打開后,就可以對其讀寫了,常用的文件讀寫函數(shù)有: fputc 和 fgetcfputc 將一個字符寫到文件, 形式為 fputc( ch, fp ); 將字符 ch 寫入 fp 所指向的文件。 成功返回該 字符,失敗返回 EOF ,EOF 在 stdio.h 中定義為符號常量 -1。fgetc 從指定文件讀入一個字符, 該文件必須是以讀或讀寫方式打開的。 調(diào)用形式為 ch=fgetc(fp); 從fp指向的文件讀入一個字符賦給c
48、h,當(dāng)文件結(jié)束時,fgetc返回一個EOF,我們可以用函數(shù)feof(fp) 來判斷是否已到文件尾,返回 1 表示已到文件尾,否則返回0。這個函數(shù)適用于文本文件和二進(jìn)制文件。 fread和fwrite函數(shù)可以讀寫一組數(shù)據(jù)。調(diào)用形式如下:fread( buffer, size, count, fp );fwrite( buffer, size, count, fp );buffer 為一個指針,對 fread 來講,是指從文件讀出數(shù)據(jù)的存放地址,對 fwrite 來講,是要寫入 文件的數(shù)據(jù)的地址。size 要讀寫的字節(jié)數(shù)count 要進(jìn)行讀寫多少個 size 字節(jié)的數(shù)據(jù)項(書上這么說)其實就是讀寫
49、的次數(shù)fp 文件指針這兩個函數(shù)返回值成功為 1,失敗為非 1,一般用于二進(jìn)制文件的讀寫。 注意:有些 c 編譯系統(tǒng)不具備這兩個函數(shù)。 fprintf()和 fscanf()函數(shù)格式化輸岀和輸入函數(shù),與printf()和scanf()作用相似,只有一點不同,fprintf()和fscanf()的讀寫對象不是終端而是磁盤文件。調(diào)用方式: fprintf( 文件指針 ,格式字符串 ,輸岀列表 );fscanf(文件指針,格式字符串,輸岀列表); fgets()和 fputs()函數(shù)作用是讀寫一個字符串,如:fgets(str,n,fp);意為從 fp 指向的文件讀岀 n-1 個字符,存放到 str 中,成功返回 str 的首地址。fputs( China, fp );把字符串 China 寫入 fp 指向的文件。成功返回 0,失敗為非 0。6) 文件的定位文件中有一個位置指針,指向當(dāng)前讀寫的位置,如果要強(qiáng)制改變位置指針的位置,可以用有關(guān) 函數(shù): rewind使位置指針重新返回文件的開頭 fseek()fs
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙方自愿合作協(xié)議模板
- 公司的股權(quán)轉(zhuǎn)讓的協(xié)議書
- mpa案例分析報告
- 2024-2025學(xué)年北京市五年級語文上學(xué)期期末考試真題重組卷(統(tǒng)編版)-A4
- 2023-2024學(xué)年天津市環(huán)城四區(qū)高二(上)期末語文試卷
- 陜西省渭南市蒲城縣2024-2025學(xué)年七年級上學(xué)期期中生物學(xué)試題(原卷版)-A4
- 《工業(yè)機(jī)器人現(xiàn)場編程》課件-任務(wù)2.1認(rèn)識機(jī)器人上下料工作站工程現(xiàn)場
- 《犯罪構(gòu)成》課件
- 養(yǎng)老院老人情感慰藉制度
- 課件電力工程質(zhì)量監(jiān)督檢查大綱介紹
- 《LED照明知識》課件
- GB/T 44481-2024建筑消防設(shè)施檢測技術(shù)規(guī)范
- 甲狀腺超聲超聲征象及TI-RADS分類
- 《白楊禮贊》知識清單
- 2024年2個娃兒的離婚協(xié)議書模板
- 2024年三級公共營養(yǎng)師考前沖刺備考題庫200題(含詳解)
- 《PLC應(yīng)用技術(shù)(西門子S7-1200)第二版》全套教學(xué)課件
- Revision Being a good guest(教學(xué)設(shè)計)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2024七年級歷史上冊知識點梳理
- 《高危新生兒分類分級管理專家共識(2023)》解讀
- 布置我們的家(課件)三年級下冊綜合實踐活動滬科黔科版
評論
0/150
提交評論