版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程式設計
第1章C語言概述
“高級語言”組合語言:優點:可以充分發揮機器硬體的功能,並提高品質。缺點:必須熟悉機器的指令系統,而指令系統又是和具體機器的內部結構密切相關的,所以所編寫的程式依賴於電腦硬體,可讀性和可移植性比較差。一般高級語言:優點:可讀性和可移植性比較好。缺點:難以對硬體進行操作,如記憶體地址、位操作等。
1.1介紹:
C語言:具有一般高級語言的特性,也具有組合語言的優點,所以有人稱為“中級語言”高級語言有的:高級語言沒有的:
算術運算關係運算邏輯運算
位運算單目、三目運算複合運算
1、語言簡潔、緊湊,使用方便、靈活。32個關鍵字、9種控制語句。
2、運算符豐富34種運算符
3、數據類型和數據結構豐富。基本類型(整型、字元型、實型)構造類型(數組、結構體、共用體)指針、檔、空類型數據結構(鏈、表、樹、棧等)1.2C語言的特點
4、具有結構化控制語句
5、語法不嚴格鬆散結構,即語法檢查不嚴格,編程時必須控制好。
6、C語言允許直接訪問物理地址,能進行位操作。
7、目標代碼品質高,程式執行效率高。
8、輸入輸出採用函數而無輸入輸出語句,可移植性好1.3用C庫函數組裝程式
用庫函數必須注意包含相應的頭檔
#include<stdio.h>#include<math.h>#include<string.h>1.4
程式格式和特點1、main()函數必須有且唯一
2、函數是C語言程式的基本單位3、大小寫敏感4、無行概念(1)、語句以分號結束
(2)、以#號開頭的編譯預處理語句無分號(3)、/*…*/加在C語言任何部分作注釋說明採用小寫,大寫有特殊意義(宏,常量等)1.5
程式執行從main函數開始
TurboC是一個集成環境,編輯、編譯、連接、執行。1、根源程式擴展名.c2、TurboC的使用
TC
選擇工作目錄建立工作環境建立工作環境F9編譯、連接。運行Alt+R.3、建立工作環境例題例1-例3講解、說明上機題:1、建立一個自己的工作環境2、熟悉TurboC環境3、輸入並調試運行例1-例34、自己編寫C程式習題1.5、1.6第2章數據描述和基本操作
程式
2.1C的數據類型:對數據的描述(數據結構)對操作的描述(演算法)1、不同的數據佔用的空間不同2、對應的運算不同數據類型(P38)2.2基本數據類型:1、整型
shout2位元組int
機器字長(2位元組)-215~(215-1)long
4位元組2、無符號類型只對整型;也包含字元型,存放正數的範圍擴大一倍Unsigned整型x;2.2基本數據類型:3、實型
float單精確度4位元組double
雙精度8位元組longdouble長雙精度16位元組2.2基本數據類型:4、字元型存貯形式,按ASCII碼值;占一位元組;與整型通用,相當一個位元組整數。
2.2基本數據類型:5、類型長度運算符sizeof(類型)用途:測試動態分配存貯空間
例如A=sizeof(int);2.3常量和變數:1、常量(1)、數值常量整型常量實型常量十進位自然表示八進制零打頭十六進制ox打頭指數形式E(e)前面有數,後面是整數小數形式.必須有“.”(2)、字元型常量用單引號包圍的單一字元‘a’‘A’字元常量沒有結束標誌(3)、字串型常量用雙引號包圍的0個或多個字元序列“china”有結束標誌(4)、特殊常量(一)符號常量如:宏定義#definePI3.14(二)轉義字元(換碼序列)\字母表示動作見P(48)2、變數(1)、變數的定義intx,y;先定義每個變數被指定為一確定類型便於編譯系統檢查如a%b(2)、變數識別字
C語言規定識別字只能由字母、數字和下劃線三種字元組成,且第一個字元必須是字母或下劃線。用來標識變數名、符號常量名、函數名、數組名、類型名、檔案名的有效字元序列。保留關鍵字預定義識別字用戶自定義(3)、變數的初始化定義變數的同時給變數賦值如:
intx=3,y=5;2.4運算式運算:1、說明例如運算式b=(a=x)*5運算符的功能與運算量的關係優先順序結合方向結果類型2、算術運算符雙目運算符5%3=2
-5%3=?5%-3=?+、-、*、/、%(模運算符或求餘運算符)a%b這裏a、b必須是整型數5/3=1-5/3=-1(-2)舍入的方向不因定,“向零取整原則”符號同左邊的運算元3、算術運算式用算術運算符和括弧將運算對象(也稱運算元)連接起來,符合C語法規則的式子稱C算術運算式。如:a*b/c-1.5+’a’同級時“從左到右”的結合原則4、複合的賦值運算
+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=只要有賦值號優先順序較低,只比逗號運算符高如:a+=ba=a+b累加器,注意a一定是變數b可以是運算式或變數,結合規律從右到左A+=3a=a+3X*=y+8x=x*(y+8)5、自增減運算
++、--a++,++a自增a=a+1a--,--a自減a=a-1後置運算、前置運算只能用於變數,不能用於常量或運算式;結合方向是從右至左6、關係運算
<
<=
>
>=
==
!=If(x==y)真(非0為真)假(0為假)7、邏輯運算&&(與)||(或)!(非)(1)實型數不比較相等的1.0/3.0*3.0==1.0x=-y<ε就是小到一定形式就行了
ε=10-6或ε=10-8e1?e2:e3(e為運算式)8、條件運算(三目)3+3,6+8逗號運算式,又稱順序求值運算符9、逗號運算符和逗號運算式2.5類型轉換:1、隱式轉換(1)必然轉換(2)由低向高轉換,一次到位轉換P54(3)賦值轉換2、顯示轉換強制類型運算(類型)第3章簡單的C程式設計
-順序結構3.1C語句:1、運算式語句2、控制語句3、函數調用語句4、空語句5、複合語句3.2格式化輸入輸出函數:(一)、格式輸出Printf(“格式控制”,輸出項序列);(二)、格式輸入scanf(“格式控制”,地址序列);3.3字元輸入輸出函數:(一)、輸入字元getchar()(二)、輸出一個字元Putchar(c);3.4順序結構程式設計舉例第4章邏輯運算和判斷選取控制4.1條件分支:1、if語句的三種形式(1)、if(運算式)語句(2)、if(運算式)語句1;
else語句2;(3)if(運算式1)語句1;
elseif(運算式2)語句2;
elseif(運算式3)語句3;
……if語句的說明:(1)運算式一般為邏輯運算式或關係運算式,但可以是任意運算式,是任意的數值類型(整型、實型、字元型、指針型數據)(2)else前面的分號不可缺少,它是if語句內嵌語句所要求的,缺少時語法錯誤。(3)if和else後面可以是一個操作語句,也可以是多個操作語句,若為多個語句必須用複合語句。2、if語句的嵌套:if語句中又包含一個或多個if語句。if(運算式1)
if(運算式2)語句1;
else語句2;elseif(運算式3)語句3;
else語句4;3、條件運算符:
在if語句中執行一個賦值語句且給同一個變數。(1)條件運算符?:(2)條件運算符優先於賦值運算符,低於關係運算符和算術運算符。(3)條件運算符的結合方向“從右至左”(4)條件運算符不能取代一般的if語句(5)運算式1的類型可以與運算式2和運算式3的類型不同。4.2開關分支switch語句:是多分支選擇語句格式:Switch(運算式){case判斷值1:語句組1;break;case判斷值2:語句組2;break;……default:語句組n;break;}switch語句的說明:(1)switch後面的運算式應是整型、字元型或是枚舉。(2)若運算式的值與某個case後面的判斷值相等時就執行case後面的語句組,沒有匹配值時執行default後面的語句組。(3)case後面的判斷值不能重複。(4)case和default出現的次序不影響執行結果。(5)執行完一個case後面的語句,則轉到下一個case繼續執行,所以必須用break語句跳出。第5章迴圈控制5.1迴圈結構:迴圈結構是結構化程式設計的三種基本結構之一(1)當型迴圈結構,當條件成立時反復執行操作,直到條件為假時才停止迴圈。(2)直到型迴圈結構:先執行操作,再判斷條件是否為假,若條件為假,再執行。如此反復,直到條件為真為止。5.2C語言中迴圈語句:1.while2.for3.do……while當型迴圈,先判斷後執行直到型迴圈,先執行後判斷1.while和do……while語句(1)while(條件)
{
語句;
}如:
1.while和do……while語句(2)do{
語句;
}while(條件);如:
需要注意:
(1)迴圈前的初始值(2)循環體內必須改變迴圈條件,使其趨於結束(3)循環體如果包含一個以上語句,應以複合語句出現(4)當while後面的運算式第一次值為真時,二者等價,否則二者不同。迴圈次數不確定,只給結束條件。2.for語句“靈活”—迴圈次數確定或不確定(只給結束條件)for(初值運算式;條件;修正運算式){
語句;}如:
s=0;for(i=1;i<=100;i++)s+=i;for語句的說明:(1)條件為真,則執行for語句中指定的內嵌語句(2)初值運算式和修正運算式可以是逗號運算式(3)e1,e2,e3均可缺少,但分號保留(4)可以取代while語句(5)初值運算式可以和迴圈變數無關5.3輔助控制:1.break語句
(1)跳出switch結構
(2)用於循環體內,結束本層迴圈,一次退出一層迴圈2.continue語句
僅用於循環體內,使本次迴圈結束3.goto語句
goto
語句標號;標號:用識別字表示,規則同變數退出多重迴圈,從內到外5.4迴圈的嵌套:一個循環體內又包含另一個完整的迴圈結構三種迴圈結構可以互相嵌套。例題分析:例題分析:例1輸入字元顯示之。#include<stdio.h>Main(){charc;while((c=getchar())!=EOF)
putchar(c);}例題分析:例2列印ASCII碼0-255的字元。第6章數組6.1一維數組的定義和引用:1定義類型說明符數組名[常量運算式]
如inta[10];說明:(1)數組名(2)用方括號(3)數組長度,元素個數(4)不能含變數數組:是有序數據的集合,數組中的元素應是同一類型。2引用先定義,後使用的原則C規定:逐個引用數組元素,不能一次引用整個數組數組元素的表示形式:數組名[下標]規定:下標是整型常量或整型運算式如a[5]或a[2*3]等3初始化(1)在定義數組時對數組元素賦以初值規定:只有靜態存貯數組和外部存貯數組才能初始化
static---靜態extern---外部(2)只給部分元素賦值(3)使數組中全部元素為0
(4)在對全部數組元素初始化時,可以不指定數組長度。6.2二維數組的定義和引用:1定義類型說明符數組名[常量運算式][常量運算式]
如inta[3][4];是特殊的一維數組存貯順序:按行存貯,多維數組同理2引用數組元素的表示形式:數組名[下標][下標]
如a[0][0]或a[0][1]等3初始化6.3字元數組:用來存放字元數據的數組是字元數組,字元數組中每個元素存放一個字元。1定義類型說明符數組名[常量運算式]
如:chara[10];
inta[10];2初始化staticcharc[5]={‘c’,’h’,’i’,’n’,’a’};注(1)如果字元個數大於數組長度則語法錯(2)如果字元個數小於數組長度則將字元賦給數組前面的元素,其餘元素為空格(3)字元個數等於數組長度時可以省略數組長度3引用可以引用字元數組中的一個元素,得到一個字元。4字串和字串結束標誌字元數組長度:實際長度\0;有效長度字串結束標誌‘\0’表示“china”共有5個字元,但占6個位元組可以用字符串常量來初始化字元數組Staticcharc[]={“china”};也可寫成staticcharc[]=“china”;
在C中將字串作為字元數組來處理,為了測定字串的實際長度‘\0’作為結束標誌。5字元數組輸入、輸出(1)getchar()/putchar()(2)用格式符%c輸入、輸出(3)將整個字串一次輸入、輸出,用格式符%s如Staticcharc[]=“china”;Printf(“%s”,c);注(1)輸出字元不包括結束符\0;
(2)用%s時輸出項是數組名;
(3)長度大於實際長度時也到、\0結束;
(4)用scanf函數輸入一個字串,利用一個scanf函數輸入多個字串時,以空格分隔。
staticcharc[6];
scanf(“%s”,c);
printf(“%s”,c);所以一維字元數組可以看作是“字串變數”6字串輸入、輸出(1)gets(str)
輸入一個字串到字元數組(2)puts(str)
可以包含轉義字元,如’\0’,’\n’等7字串函數#include<string.h>(1)拷貝strcpy(str1,str2);
目的源注:str1長度≥str2長度str1是數組名形式,str2可以是字串常量,不能用賦值語句將字串常量或字元數組賦給一個字元數組。如:str1={“china”};str1=str2;(2)字串連接
strcat(str1,str2);
目的源注:作用是把字元2連到字元1後面,結果放在字元數組1中,所以字元數組1必須足夠大,初始化時不能省略長度;連接時第一個\0取消。(3)字串比較strcmp(str1,str2);(4)測試字串長度函數strlen(str)(5)將字串中大寫字母轉成小寫字母函數strlwr(str)(6)將字串中小寫字母轉成大寫字母函數strupr(str)
第8章模組化程式設計8.1函數定義:在C中子程式的作用是由函數來完成的,使用的角度函數有兩種(1)系統函數(2)用戶定義函數;從函數的形式上分(1)無參函數(2)有參函數格式:函數類型函數名(形式參數)
{
函數體;
}模組化設計;結構化編程。說明:
函數類型---返回值的類型如:floataver(成績表)
void---無返值main()就應是void類型默認時為int型形參:(inta,intb,……,floatr)
或(a,b,……,r)
inta,b;floatr;
函數類型函數名()
{}稱為“空函數”8.2函數參數和函數值:1、形式參數和實際參數定義函數時函數名後面括弧中的變數—形參調用函數時函數名後面括弧中的運算式—實參通過函數調用使兩個函數中的數據發生聯繫說明:(1)形參變數在函數調用前無分配存貯空間(2)實參可以是常量、變數、運算式或數組名(3)在被定義的函數中,必須指定形參類型(4)實參和形參類型應一致,否則類型不匹配錯誤(5)形參和實參間的傳遞是單向的“值傳遞”,不同單元。2、函數的返值(1)函數的返值是通過return語句獲得的,return後面可以是一個運算式。(2)函數值的類型,在定義函數時指定函數值類型,如果不指定,按整型處理,函數類型決定返值類型。(3)如果被調函數中沒有return語句,則返值不確定。(4)如果不帶回值,應將函數定義為void類型。8.3函數的調用:1、函數調用的一般形式函數名(實參表列);說明:對實參表的求值順序並不是確定的,一般是從右至左,這種情況在printf函數中也同樣存在如:i=2;Printf(“%d%d\n”,i,++i);結果:332、函數的調用方式函數在程式中出現的位置;(1)函數語句(2)函數運算式(3)函數參數3、被調函數的說明在一個函數中調用另一個函數所具備的條件是:(1)被調函數是已經存在的函數(庫函數、自定義)(2)如果是庫函數則#include命令相關頭檔(3)如果是用戶自定義函數,在主調函數中對被調函數聲明:函數類型函數名(參數表);特例:(1)函數的返值是整型或字元型(2)被調函數的定義在主調函數之前(3)在所有函數定義之前,說明了函數類型8.4函數的嵌套調用:關係:自身可調用,相互之間可調用,即在調用一個函數的過程中,又調用另一個函數。如圖8.5函數1函數2函數3例8.6P1558.5函數的遞歸調用:1、直接遞歸2、間接遞歸函數A函數A函數B8.6數組作為函數參數:數組元素作參數同變數相同,數組名作為參數時傳遞整個數組。當用數組名作函數參數時,實參和形參都應用數組名(或指針變數)。例8.11P165說明(1)主調函數和被調函數分別定義數組(2)實參數組和形參數組類型應一致(3)實參數組和形參數組大小可以不一致,C編譯對形參數組大小不作檢查,只是將實參首址傳遞給形參數組。如:例8.12(4)不是“傳值”而是“傳址”例:8.13(5)也可以用多維數組名作函數參數,同上。例:8.148.7局部變數和全局變數:
1、局部變數在函數內定義的變數例:floatf1(inta){
intb,c;
…….}說明(1)主函數main中定義的變數只在主函數中有效(2)不同函數中可以使用相同的變數(3)形參也是局部變數(4)在一個函數內部,可以在複合語句中定義變數,這些變數只在複合語句中有效,離開複合語句該變數就無效。8.7局部變數和全局變數:
2、全局變數在函數之外定義的變數稱為外部變數,外部變數是全局變數,全局變數可以為本文件中其他函數所共用,它的有效範圍為“從定義的位置開始到檔結束”。例:8.15說明(1)設全局變數的作用是增加了函數間數據聯繫,可以從函數得到一個以上的返值,是“雙向傳遞的”。(2)不要輕易使用全局變數在程式執行過程中都佔用存貯單元;通用性降低;不清晰。(3)在定義點之前引用外部變數要用關鍵字extern作“外部變數說明”(4)在同一原始檔案中,外部變數與局部變數同名,則在局部變數的作用範圍內,外部變數不起作用。8.8動態存貯變數與靜態存貯變數:
1、變數的存貯類別以上是從變數的作用域角度分;從變數值生存期角度分靜態存貯變數和動態存貯變數。靜態存貯區存放:全局變數動態存貯區存放:(1)函數形參變數(2)局部變數(未加static說明的)(3)函數調用時的現場保護和返回地址程式區靜態存貯區動態存貯區用戶區說明C語言中每個變數和函數有兩個屬性,數據類型和數據存貯類別,一般形式。存貯類別數據類型變數表;存貯類別:auto(隱含)自動
static
靜態
register寄存器
extern外部8.8動態存貯變數與靜態存貯變數:
2、局部變數的存貯方式(1)不作專門說明都是動態分配存貯空間的,存貯在動態存貯區中,編譯系統自動處理。(2)有時希望函數中的局部變數值在函數調用結束後不消失這時就應該指定該局部變數為“局部靜態變數”用static說明例8.17P174
說明C語言中每個變數和函數有兩個屬性,數據類型和數據存貯類別,一般形式。存貯類別數據類型變數表;存貯類別:auto(隱含)自動
static
靜態
register寄存器
extern外部局部靜態主變數說明(1)局部靜態變數屬於靜態存貯類別,在靜態存貯區內分配,存貯單元在程式整個運行期間都不釋放(2)在編譯時賦初值,只賦初值一次,並保留上次函數調用時的值(3)不賦值時編譯時自動賦初值勤0(4)C規定只有全局變數和局部靜態變數時才能對數組初始化(5)局部靜態變數在函數調用結束後仍然存在,但其他函數是不能引用它的(6)對使用頻繁的局部自動變數或形參,可以作為寄存器變數,用關鍵字register說明例8.19
(7)全局變數和局部靜態變數不能定義為寄存器變數8.8動態存貯變數與靜態存貯變數:
3、全局變數的存貯方式(1)允許其他檔中的函數引用(2)只能被本文件中的函數引用時,用static說明例staticinta;
存貯類別小結:P180
8.9內部函數和外部函數
1、內部函數函數只能被本文件中其他函數所調用。
staticintfun(inta,intb)2、外部函數
externintfun(inta,intb)
屬於“隱含”例8.22
3、如何運行一個多檔的程式建立一個“專案檔”
第9章預處理命令
區別於其他高級語言:三種預處理功能宏定義檔包含條件編譯用命令來實現用命令來實現並用“#”開頭
9.1宏定義用一個指定的識別字來代表一個字串
1、不帶參數的宏定義命令的一般形式#define識別字(宏名)字串如#definePI3.1415929在預編譯時,將程式中出現的宏名進行宏展開。說明:P1882、帶參數的宏定義(1)命令的一般形式#define宏名(形參表)字串(2)帶參數的宏展開預編譯時遇到帶實參的宏名時,則按命令行指定的字串從左到右進行置換,原則是:遇形參則以實參代替,非形參字元原樣保留,從而形成展開後的內容。說明P1902、帶參數的宏定義(1)命令的一般形式#define宏名(形參表)字串(2)帶參數的宏展開預編譯時遇到帶實參的宏名時,則按命令行指定的字串從左到右進行置換,原則是:遇形參則以實參代替,非形參字元原樣保留,從而形成展開後的內容。說明P190(3)宏名的作用域是從宏名定義命令後到本文件結束,可用#undef
終止宏名的作用域如#undef
宏名(4)宏定義中可以引用已定義過的宏名(5)程式中雙引號括起的字串的內容若有與宏名相同的子串時,一般不進行宏展開。
9.2檔包含1、命令的一般形式#include“檔案名”或#include<檔案名>說明(1)檔案名應是C語言的原始檔案名,該原始檔案可以是系統提供,也可以是用戶編寫。頭檔、標題檔.h或.c
9.2檔包含(2)“”和<>的區別(3)一條include命令只能指定一個被包含的檔2、檔包含的處理預編譯時,將被包含檔的內容全部複製到包含檔中,檔包含可以是嵌套的。
9.3條件編譯1、#ifdef
識別字程式段1#else
程式段2#endif當指定識別字已經被定義過,則對程式段1進行編譯,否則編譯程序段2
9.3條件編譯2、#ifndef
識別字程式段1#else
程式段2#endif當指定識別字未被定義過,則對程式段1進行編譯,否則編譯程序段2
9.3條件編譯3、#if運算式程式段1#else
程式段2#endif當運算式的值為“真”(非零)時,編譯程序段1,否則編譯程序段2
說明(1)以上的“程式段”可以含語句和命令行(2)“識別字”一般是用#define命令定義(3)其中的#else部分可以沒有第10章指針
有利於設計系統軟體特點:表示複雜的數據結構;能動態分配記憶體;能方便地使用字串;有效方便地使用數組;調用函數時得到多於1個的值;能直接處理記憶體地址。10.1指針的概念一個變數的地址稱為該變數的“指針”一個變數存放另一個變數的地址(指針)則它是指針變數10.2變數的指針和指向變數的指針變數變數的“指針”就是變數的地址“*”--指向p是指針變數*p是p指向的變數如i=3;p=&i;一、指針變數的定義int
i,j;int*p1,*p2;指針變數定義的一般形式類型識別字*識別字;如:float*p3;char*p4;二、指針變數的引用(1)&取地址運算符(2)*指針運算符(間接訪問運算符)&a變數a的地址*p指針變數p所指向的變數三、指針變數作為函數參數運用指針變數作參數,可以得到多個變化的值10.3數組的指針和指向數組的指針變數數組的“指針”就是數組的起始地址。
數組元素的指針是指數組元素的地址,引用數組元素可以用下標法(如a[3])也可以用指針法,即通過指向數組元素的指針找到所需的元素。使用指針法能使目標程式品質高(占記憶體少,運行速度快)一、一維數組和指針指向數組元素的指針變數的定義與賦值inta[10];int*p;p=&a[0];或p=a;在定義變數時可以賦給初值
int*p=&a[0];或
*p=a;說明:1、一維數組和數組元素的地址數組名代表該數組的首地址,(數組中第一個元素的地址)例如inta[10],*p;則p=a和p=&a[0]是等價的
p=a+1和p=&a[1]等價
……p=a+i和p=&a[i]等價2、通過一維數組名所代表的地址引用數組元素數組名代表該數組的首地址,(數組中第一個元素的地址)*(a+i)代表第i個元素,即a[i]3、通過指針引用數組元素例inta[10],*p;若p=a;或p=&a[0];則p+i代表a數組第i個元素的地址,*(p+i)代表第i個元素a[i]4、通過帶下標的指針引用數組元素*(p+i)可以寫成p[i]綜上所述:在p=a的條件下,對a[i]數組元素的引用方式可以是:*(a+i);*(p+i);p[i];注意:
1、a和a[0]具有不同含義,前者是一個地址常量,是存貯單元a[0]的地址;而後者是一個變數名,代表一個存放數據的存貯單元。
2、p是指針變數,可以對其進行加、減和賦值運算,如p++,p=a,p=&a[i]等運算都是合法的,而由於數組名a代表一個地址常量,即一個常量指針,因此a++,a=p,a+=i是非法的。二、二維數組和指針1、二維數組和數組元素的地址如inta[2][3];二維數組a中任一元素a[i][j]的地址與a[i]的關係是:&a[i][j]==a[i]+j注:a+1和a[0]+1的含義不同a和a[i]是兩個基類不同的常量指針,*(a+1)代表a[1]而*(a[0]+1)則代表a[0][1]2、通過地址引用二維數組元素設二維數組a的定義同上,則a中任一元素a[i][j]的引用可以用以下運算式之一來表示*(a[i]+j)*(*(a+i)+j)(*(a+i))[j]3、通過一個指針數組引用二維數組元素設inta[2][3],*p[2]p是一個一維指針數組,其中每個元素都是一個指向整型變數的指針。若for(i=0;i<2;i++)
p[i]=a[i];使p數組中每個元素依次指向a數組中每行的起始元素,則二維數組元素a[i][j]的引用形式可以寫成(1)*(p[i]+j)(2)*(*(p+i)+j)(3)(*(p+i))[j](4)p[i][j]4、通過一個行指針引用二維數組元素設inta[2][3],(*prt)[3];其中prt是一個指針變數,它指向包含三個整數元素的一維數組。注意,*prt兩側的園括弧不可缺少,如果寫成*prt[3]則prt將成為一個指針數組名若prt=a;則a[i][j]可以寫成
*(prt[i]+j);*(*(prt+i)+j);(*(prt+i))[j];prt[i][j]10.4字串的指針和指向字串的指針變數1、字串的表示形式
(1)用字符數組實現
staticcharstring[]=“IloveChina”;(2)用字符指針實現
char*string;string=“ILoveChina”;10.4字串的指針和指向字串的指針變數2、字串指針作函數參數
如:P235例10.203、字元指針變數與字元數組的區別(1)字元數組由若干個元素組成,每個元素中放一個字元;而字元指針變數中存放的是地址,決不是將字串放到字元指針變數中。3、字元指針變數與字元數組的區別(2)賦初值的方式不同對數組staticcharstr[]=“ILoveChina!”;對字元指針char*a=“ILoveChina!”;3、字元指針變數與字元數組的區別(3)賦值方式不同不能用charstr[14];
str=“ILoveChina!”;而字元指針變數可以
char*a;a=“ILoveChina!”;3、字元指針變數與字元數組的區別(4)指針變數的值是可以改變的
char*a=“ILoveChina!”;a+=7;3、字元指針變數與字元數組的區別(5)可以表示格式字串
char*format=“a=%d,b=%f\n”;
printf(format,a,b);或:staticcharformat[]=“a=%d,b=%f\n”;
printf(format,a,b);10.5函數的指針和指向函數的指針變數1、指向函數的指針變數的一般定義形式數據類型識別字(*指針變數名)()
返值類型10.5函數的指針和指向函數的指針變數2、函數的調用可以通過函數名調用,也可以通過函數指針調用。如
c=max(a,b);
intmax();
int(*p)();p=max;c=(*p)(a,b);10.5函數的指針和指向函數的指針變數3、函數的指針變數可以改變p=min;4、在給函數指針賦值時,只用函數名5、用函數指針調用函數時,只需要將(*p)代替函數名即可,如c=(*p)(a,b);6、函數指針變數p+n,p++,p--;運算是無意義的7、可以用指向函數的指針變數作函數的參數如:P244頁10.6返回指針值的函數定義的一般形式:類型識別字*函數名(參數表)如int*a(int
x,inty)例:P246例10.25
仔細讀!10.7指針數組和指向指針的指針1指針數組的定義形式類型標識*數組名[數組長度說明];如int*p[4];2、指向指針的指針定義形式char**p;3、指針數組作main()函數的形參
main(int
argc,char*argv[])10.8有關指針的數據類型和指針運算的小結1有關指針的數據類型的小結2、指針運算的小結3、void指針類型本章的例題需要同學們仔細閱讀!第11章結構體與共用體
11.1使用關鍵字typedef定義新的類型識別字一般形式typedef
類型名識別字;說明(1)“類型名”為已有定義的類型識別字;“識別字”為用戶定義的識別字。如:typedef
intINTEGER;
typedeffloatREAL;(2)經此定義後的識別字可作為原數據類型名使用如:INTEGERi,j;REALx,y;11.2結構體一、結構體類型定義的一般形式Struct
結構體名{類型名結構成員名;
……
};說明(1)結構體成員的命名規則與變數相同,並且允許與變數或其他結構體中的成員重名。(2)結構體成員可以是簡單類型,數組,指針或已定義過的結構等。如:structstudent{
intnum;charname[20];charsex;
intage;floatscore;charaddr[30];};二、結構體變數、數組、指針的四種說明方式structstudent是自定義的類型名,是結構體類型,用其可以定義變數、數組、指針。(1)緊跟在類型定義之後進行說明如structstudent{……}student1,student2;(2)先定義結構體類型,再單獨進行說明如structstudent{……};
structstudentstudent1,student2;(3)定義一個無名結構體類型,直接進行變數說明如struct
{……}student1,student2;(4)用typedef定義一個結構體類型名,再用類型名進行說明。如typedef
struct{intmonth;
……}DATE;DATEbirthday;說明:P262三、對結構體成員的三種引用方式(1)結構體變數名.成員名如student1.num=10010;(2)指針變數名->成員名如p->num=10010;(3)(*指針變數名).成員名如(*p).num=10010;(2)和(3)的前提是:structstudentstudent1,*p;p=&student1;四、給結構體變數、數組賦初值(1)在定義結構時,可以給結構變數、數組賦初值。如P264例11.1P266例11.2(2)給結構體變數賦初值不能跨越前邊的成員而只給後面的成員賦值。(3)結構體數組成員賦初值的規則與數組元素賦初值的規則相同。如例11.2五、引用自身的結構體當在一個結構體中有一個成員是指向本結構體類型的指針時,那麼通過這樣的指針可以把若干個相同的結構體存貯單元連在一起,用以建立如鏈表、樹、圖等各種數據結構。如鏈表結構:如P273圖11.10
Struct
c_table{charch;Struct
c_table*next;};C語言的記憶體動態分配函數(1)malloc(運算式)該函數用來在內存中分配一個指定長度(以位元組為單位)的存貯空間,其中運算式的值表示待分配的存貯空間的位元組數,返值是指向分配域起始地址的指針,不成功為NULL(空值)其函數原型為
void*malloc(unsigned
intsize);(2)void*calloc(unsigned
num,nusignedsize)該函數用來在內存中分配一塊連續的存貯空間,其中num指定需要分配的元素個數;size用來指定每個元素所占的記憶體空間(以位元組為單位),返值是指向分配域起始地址的指針,不成功為NULL(空值)(3)voidfree(void*p)該函數用來釋放由malloc或calloc函數分配的存貯空間,其中指針應指向最近一次調用malloc或calloc時所分配存貯區的首地址。對鏈表的操作:(1)建立鏈表(2)輸出鏈表(3)鏈表的插入及刪除11.3共用體(聯合體)一、共用體定義的一般形式union[共用體名]{類型名共用體成員名;……}[變數名表];說明(1)共用體變數的定義與結構類似,可以把類型定義和變數說明放在一起,也可以分開,還可以直接定義共用體變數而不要共用體名。(2)共用體的含義與結構體不同,共用體中所有成員均放在以同一地址開始的存貯空間中,使用覆蓋的方式共用存貯單元,共用體所占空間大小取決於占存貯空間最大的那個成員。(3)共用體變數不能在定義時賦初值。11.3共用體(聯合體)二、共用體類型數據的使用(1)不能對共用體變數進行整體操作,只能單獨引用其成員(2)共用體成員的引用方式與結構體完全相同(3)共用體變數不能作為函數的參數或函數值,但可以使用指向共用體的指針變數P289(4)共用體可以作為結構成員,結構也可以作為共用體的成員11.4枚舉類型一個變數只有幾種可能的值,可以定義為枚舉類型一、枚舉類型的定義和變數說明的兩種方式1、定義和說明分開類型定義形式enum
枚舉類型名{枚舉值1,枚舉值2,……,枚舉值n};變數說明形式
enum
枚舉類型名變數名表;2、直接定義枚舉變數一般形式enum
{枚舉值1,枚舉值2,……,枚舉值n}變數名表;說明(1)枚舉類型名為用戶定義識別字(2)枚舉值又稱枚舉元素、枚舉常量,也是用戶定義的識別字二、枚舉元素和它的序號1、在定義枚舉類型的同時,編譯程序按順序給每個枚舉元素一個對應的序號,序號的值從0開始,後續元素順序加12、可以在定義時人為指定枚舉元素的序號值,如
enum{sun=7,mon=1,tue,ued,thu,fri,sat}day;沒有指定序號值的元素則在前一元素序號值基礎上順序加1三、枚舉類型數據的使用1、枚舉類型變數的取值範圍只限於類型定義時所列出的值2、只能給枚舉變數賦枚舉值,若賦序號值必須進行強制類型轉換,如P2923、枚舉值可以進行加(減)一個整數n的運算,用以得到其後(前)第n個元素的值4、枚舉值可以按定義時的序號進行關係比較5、枚舉值可以按整型輸出其序號值第12章位運算
12.1位運算符位運算:指進行二進位位的運算運算符功能優先順序結合性~按位取反高左右<<>>左移右移左右&按位與左右^按位異或左右|按位或低左右說明:(1)只有~為單目運算符(2)位運算只能用於整型或字元型數據(3)位運算符可以與賦值運算符結合組成擴展的賦值運算,即~=,<<=,>>=,&=,^=,!=
(4)兩個長度不同的數據進行位運算時,系統先將二者右端對齊,然後將短的一方按符號位擴充,無符號數則以0擴充。12.2位運算符的運算規則1、按位取反運算符~單目運算符如~x~x不是求x的負數~1的結果不是-1如~1=?~8=?2、移位運算符>>和<<左邊是移位對象,右邊是整型運算式,表示移位的位數,左移時低位補0,右移時補符號位,若為無符號整數則補03、按位與運算符&&和&&不同例如:a=10,b=5;可用於“高位元組清零,低位元組清零”
a&0xffa&0xff004、按位或運算符|如果想使a的低位元組全置1則a|0xff如果想使a的高位元組全置1則a|0xff005、異或運算符^相同為0不同為1,如果a和b的值相等,則a^b=0,如果想取a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院后勤保障及节能措施
- 医学课件-骨质疏松症的诊断标准及预防对策
- 医学课件-稳定性冠心病基层诊疗指南(2025全文版)
- 2025年化疗药物外渗的预防以及处理
- 2025 中医诊断学牙周炎查房课件
- 搜索引擎信息检索性能课程设计
- 平台学习行为激励机制课程设计
- 彩塑人物试讲课程设计
- 基于多源数据的城市交通拥堵预测理论创新课程设计
- 基于同态加密的隐私计算原型在实际应用课程设计
- 《2025患者身份识别管理标准》解读
- 《中华人民共和国水法》解读培训
- 教师信息化培训材料
- 九年级数学教学计划与实施方案
- 2025年防雷检测专项资格考试试题及答案
- 开采加工11万吨油砂、生产3万吨沥青油及8万吨尾砂项目可行性研究报告
- 贵州省望谟县2025年上半年公开招聘城市协管员试题含答案分析
- DB11T 593-2025 高速公路清扫保洁质量与作业要求
- 中国石油和化工勘察设计协会电气设计专业委员会公告2025版
- 癫痫的中医护理
- 从蒙古族文化生活中挖掘中学物理实验资源:开发应用与成效探究
评论
0/150
提交评论