



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、杭州電子科技大學C 語言要點總結草稿鄔惠峰2011-5-20 PAGE PAGE 69目錄 HYPERLINK l _bookmark0 第1 章C 語言程序的基本形式4 HYPERLINK l _bookmark1 C 語言的結構4 HYPERLINK l _bookmark2 標識符4 HYPERLINK l _bookmark3 保留字(即關鍵字)5 HYPERLINK l _bookmark4 基本數據類型5 HYPERLINK l _bookmark5 算術表達式7 HYPERLINK l _bookmark6 C 語言的基本語句7 HYPERLINK l _bookmark7 第2
2、 章 流程控制11 HYPERLINK l _bookmark8 控制表達式11 HYPERLINK l _bookmark9 for 循環語句12 HYPERLINK l _bookmark10 while 語句13 HYPERLINK l _bookmark11 Do- while 語句15 HYPERLINK l _bookmark12 if 語句15 HYPERLINK l _bookmark13 條件表達式運算符19 HYPERLINK l _bookmark14 break 語句19 HYPERLINK l _bookmark15 continue 語句20 HYPERLINK l
3、 _bookmark16 switch 語句20 HYPERLINK l _bookmark17 第3 章 數組與字符串22 HYPERLINK l _bookmark18 一維數組22 HYPERLINK l _bookmark19 多維數組23 HYPERLINK l _bookmark20 數組元素初始化24 HYPERLINK l _bookmark21 字符串25 HYPERLINK l _bookmark22 字符串函數27 HYPERLINK l _bookmark23 字符函數和字符轉換及運算27 HYPERLINK l _bookmark24 第4 章 函數與變量29 HYP
4、ERLINK l _bookmark25 4.1C 程序設計的一般形式29 HYPERLINK l _bookmark26 4.2 函數30 HYPERLINK l _bookmark27 函數返回值32 HYPERLINK l _bookmark28 函數的調用33 HYPERLINK l _bookmark29 遞歸函數與遞歸調用34 HYPERLINK l _bookmark30 外部函數和內部函數(了解)34 HYPERLINK l _bookmark31 變量的存儲類型35 HYPERLINK l _bookmark32 第 5 章 指針41 HYPERLINK l _bookmar
5、k33 指針和地址41 HYPERLINK l _bookmark34 指針變量和指針運算符41 HYPERLINK l _bookmark35 指針與函數參數45 HYPERLINK l _bookmark36 指針、數組和字符串指針46 HYPERLINK l _bookmark37 指針數組49 HYPERLINK l _bookmark38 多級指針51 HYPERLINK l _bookmark39 返回指針的函數52 HYPERLINK l _bookmark40 函數指針53 HYPERLINK l _bookmark41 第6 章結構體54 HYPERLINK l _bookm
6、ark42 結構的定義54 HYPERLINK l _bookmark43 結構數組56 HYPERLINK l _bookmark44 結構與函數57 HYPERLINK l _bookmark45 結構的初始化58 HYPERLINK l _bookmark46 第7 章預處理程序60 HYPERLINK l _bookmark47 什么是預處理程序60 HYPERLINK l _bookmark48 宏定義和宏替換60 HYPERLINK l _bookmark49 文件包含61 HYPERLINK l _bookmark50 條件編譯61 HYPERLINK l _bookmark51
7、 7.4 格式化輸入/輸出61 HYPERLINK l _bookmark52 第8 章枚舉、位操作63 HYPERLINK l _bookmark53 8.1 枚舉63 HYPERLINK l _bookmark54 8.2 位操作運算符63 HYPERLINK l _bookmark55 第9 章文件66 HYPERLINK l _bookmark56 ASCII 碼文件的存取66 HYPERLINK l _bookmark57 二進制文件的存取67第1 章C 語言程序的基本形式C 語言的結構C (Function)C C void main()void main()變量說明語句; 執行語
8、句;main()只能有一個main 許多常用的函數做成標準函數與C *This program is sum of two integer and the results*void*This program is sum of two integer and the results*voidmain()inta,b,sum;/*a,b sum */ a=123;b=456; sum=a+b;rf“Te mf%ddds%,);main()a,b sum (int)標識符C 語言中所使用的每個函數和變量都應有唯一的名稱,這樣才能被識別和使用。通常, 這種函數和變量名稱用一串字符表達,稱為標識符。C
9、 語言使用的標識符有嚴格限制:, ;()。: 正確的函或變量名:_abc,veb7,lev_5錯誤的函數或變量名稱的實例:3H, sUM$,char保留字(即關鍵字)在 C 語言中保留字或關鍵字并不太多,原先規定有 28 個,新標準規定改為 32 個,如下所示:autodefaultlongvoidbreakdoforregisterstructvolatilecasedoublefloatreturnswitchwhilecharenumgotosizeoftypedefelseifsignedunionintshortunsigned基本數據類型C 語言可以使用多種數據類型整類型實類(類型
10、): 度點型float 度點型字類型char枚類型(2)類型數類型結類型struct聯類型(3)類型&,*(4)型void整數型(integerint 型)整數型常量不僅可以用十進制表示,也允許用八進制或十六進制表示,例如:62十進制數053八進制數以 0 打頭,由 07 構成。0 x32十六進制數0 x 打頭,由 09 AF 如 0 x2C2 即(21612)165709整數類型又可細分成不同長短的類型,應加上類型修飾符構成,即:shortint可化為short longint可化為unsignedintunsigned浮點類型(float 型)實數類型也叫浮點類型。可包含有整數部分和小數部
11、分,例如:0.012 于.0125.0 等同于 5.科學計數法中,則用“尾數e指數”表示浮點數值,e 即exponent(指數)例如: 6.3e5 等同于 630000.0其中,6.3 就是尾數,含有整數部分(integer part)為 6 和小數部分(fractional part)為 3, 而 5 就是指數 (exponent) 部分。尾數和指數也都有可能為負值,例如:-1.23e412.34567e-8-78e-12字符類型(char 型)字符類型的數據代表一個字符,由一對單引號將字符括起來,表示的是該字符在 ASCII 碼表中的代碼值,例如:a9765它們占 1 byte。ASCII
12、 碼表中的某些控制字符不可顯示,則通過加反斜線“”的轉義字符表示,例如:0表示NULL(空)即0t表示tab(制表)即9n表示new line(新行或換行)即r表示return(回車)即13表示反斜線即92#include void main ( )char c1,c2;/*定#include void main ( )char c1,c2;/*定字類型c1=97;c2=98;/*賦型*/printf(%c # %cn, c1,c2);/*以字符類型輸出*/例 1.3: 小寫轉大寫void main ( )char c1, c2; c1=a; c2=b;/*定義字符類型void main (
13、)char c1, c2; c1=a; c2=b;/*定義字符類型*/c1=c1-32c2=c2-32;/*/printf(%c%c, c1,c2);算術表達式C 語言中算術運算符算術示式變、量及術算構。在C 言算運符:、*、%、,*,和為四則運算符,和日常概念沒有區別,其中*和優先于和。%為取模(Modulus)運算符,是針對整數運算,即取整數除法之后,所得到的余數,例如:10%3110 3 1。13%8513 8 5。為自減 1,為自增 1。n或n 都變量 n 自增 1,最終結果與 nn1 等效。但處理過程卻有所區別。nn 1nn n 1。n6n 數據類型與運算結果的關系整型數的除法得到的
14、結果仍是整型數,小數部分將被去掉,例如:522而不是 2.5。浮點數的除法得到的仍是浮點數,例如: 5.02.02.55.022.5C 語言的基本語句C 語言的特點C 變量說明語句變量明句主作就是義量型其式是類型明符量1量2;例intnumber;char a,b,c; float t1;賦值語句賦值語句是將常量或算術表達式的運算結果賦給變量,其格式是: 變量名常量或算術表達式;例如:int number; number10;voidmain()voidmain()int int total; n11; n22; n33;totaln1n2n3;/* */基本輸入輸出語句printf()和 s
15、canf()是 C 語言的基本輸入輸出函數,都放在標準函數庫中,為了使用它們, 應在程序開頭加上:#include基本輸入輸出語句就是直接調用這兩個基本輸入輸出函數。輸出語句一般格式是:rf 控制串(或格式串)是用雙引號括起來的輸出格式控制說明。控制串中每一個變量都應當與后面相應的某個表達式對應。控制串分兩部分,即:要顯示的字符和格式串。格式串以“%”開頭,后跟格式碼。格式串與參數一一對應。含有不同格式碼的格式串表示顯示不同的內容,如下所示:%c%s%d%o%x%u%f%e格式碼前可加修改量以便更好地控制顯示格式,主要有:字符寬度控制,例如:%4d4 %10s10 精度控制,例如:%10.4f
16、10 4 位%5.7s5 7 位L 或h%Ld%hd%Lf顯示位置默認為右對齊,若加負號(即“”),則為左對齊,例如:%d%d 左對齊顯示十進制整數例如:例如:prinft(“Welcomen”);與前例不同是后面加了一個換行符。例如:int number10;printf(“The number is %dn”,number); 應顯示:The number is 10例如:floatvaluel,value2,value3; value12.3;printf(“The average of %of and %f and %f is %fn”,value1,value2,value3, (v
17、alue1value2value3)3.0);應顯示:The average of 2.3 and 4.5 and 6.7 is 4.5%d 和%f 表示在相應的位置顯示的數據類型,且一一對應。%d 表示要顯示整型數,%f 表示要顯示浮點型數。輸入語句一般格式是:f(1()printf()%int number; scanf(“%d”,&number);其中,%d 表示應以整型格式輸入,&number 表示指向 number 的地址。注意:控制串中的非空白符,例如:scanf(“%d,%d”,&i,&j)上式中“%d”之間有逗號,輸入時也應加逗號。還可用修改控制域寬,例如:%20s 就只取前
18、20 個字符%s 取全串例如 :float average; scanf(“%f”,&average);其中,%f 表示應以浮點型格式輸入,&average 表示指向average 的地址。第2 章流程控制控制表達式程序的流程走向是由條件表達式的值控制決定的。表達式總是有值的。邏輯表達式邏輯表達式由變量、常量和邏輯關系運算符構成,用以表示變量的邏輯關系。輯與 (AND)&輯或 (OR)|輯非(NOT)!邏輯表達式只有兩種可能的取值,真假必取其一。假者取值為 0;真者取值為 1。關系運算符!關系表達式也只有兩種可能的取值,例如: ab0(false)值為真(true),取值 1。運算操作符的結合
19、性和優先級例如,處理表達式ab*c 時,*優先于,相當于 a(b*c)。abc 是將 bc 結果賦給 a又如:a*bc 相當于 aa*(bc)。單操作數的運算操作符(自增 1),(自減 1),(負號)的結合性也都從右向左。例如,i相當于(i),而不是(i)關于運算符的優先級低于算術運算符,例如:abc 等同于 a(bc)for 循環語句for 循環語句的一般格式為:for(初始化表達式;循環條件;循環表達式)循環體語句塊#includestdio.hvoid main()int n#includestdio.hvoid main()int n;for (n1;n100;n) printf(“%
20、dn”,n);/*循環體語句*/r 循環條件是一個邏輯表達式,若該式取值為真即條件滿足,則繼續執行循環;否則, for 語句執行過程(4)返回第(2)步。includestdio.hvoid main()includestdio.hvoid main()int n,result; result1;for(n1;n10;n)result*n printf(“%d!%dn”,n,result);/*語句*/#include main()inti;fori=32;i127;i+)/*#include main()inti;fori=32;in)printf(“The first number is
21、biggern”);if 語句復合的 if 語句格式為:if(邏輯表達式)語句塊 1 else語句塊 2若滿足邏輯關系,即邏輯表達式的值為真,則執行語句塊 1;否則,執行語句塊 2。2.9#include main()int m,n;printf(“Please input two numbersn”); scanf(“%d %d”,&m,&n);if(mn)printf(“The first number is biggern”); else/* mn */printf(“The first number is biggern”);例 2.10:檢查閏年* This determines i
22、f a year is a leap yaer * #includemain()int x;printf(“Please input two numbersn”);scanf(“%d”,&x); if(x%40&x%100!0|x%400=0)printf(“%d is a leap yearn”,x); else/* printf(“%d is not a leapyearn”,x);可見,這種復合的 if 語句是等同于兩個簡單的 if 語句,即:if(邏輯表達式)句塊if(表達)2if 語句在 if 語句的語句塊中還可包含 if 語句,這就形成嵌套的 if 語句。其格式為:if(邏輯表達式
23、 1)if(邏輯表達式 2)語句塊 1elseelse語句塊 2語句塊 3-1(x0)void main ( )int x,y;scanf (%d,&x); if (x0)和(x=0)*/ elsey=1;/*else 括(x0) */printf (x=%d,y=%dn,x,y);if 與else else, else else if if if(邏輯表達式 1)if(邏輯表達式 2)else-if else語句塊 1語句塊 2else if_else1)語句塊 1else if(邏輯表達式 2)語句塊 2else if(邏輯表達式 3)語句塊 3else語句塊 n例 2.12:用 else
24、-if 語句,寫一個程序,輸入一個數 x,打印出符號函數 sign(x)的值。符號函數為sign(x)10 x0#includevoidmain()int number,sign;printf(“Please type in a number x”); scanf(“%d”,&number); if(number0 */ sign0;elsesign1; printf(“sign(x)%dn”,sign);條件表達式運算符條件表達式運算符的一般格式為:條件 ? 表達式 1:表達式 21 表達式 2 的值作為整個條件表達式的運算結果。例 2.13:求最大值.#include main()int
25、a,b,c;scanf(“%d %d”,&a,&b);c(ab)?a:b;/*取a 和b 者給cprintf(“The is %d”,c);break 語句break for,while,do switch break 例2.14:九法表#includemain()int i,j; for(i1;i9;i)for(j1;ji)break;/*大乘時出循環printf(“%d“,i*j);printf(“n”);其結果將打出三角形的乘法表,即1243694812169 18 27 36 45 54 63 72 81continue 語句continue 語句執行后,在本次循環中其他語句均不執行,
26、轉而繼續執行循環體的下一次循環。在 whiledo 循環中意味著立即轉入條件測試,在 for 循環中意味著立即轉到執行 i,而進入下一次重復。例 2.15:只做正數的累加而跳過負數#include main()int a,i,n,sum; scanf(“%d”,&n); sum0;for(i0;in;i) scanf(“%d”,&a); if(a0)continue; suma;printf(“The sum%dn”,sum);switch 語句switch 語句的一般格式為:switch(表達式)case 1 break;case 2 break;case n break;default:語
27、句塊 n1 break;它是根據表達式為不同的值而執行不同的語句塊,可以看成是特殊的 else_if 語句。即:if(表達式常量 1)語句塊 1else if(表達式常量 2)語句塊 2if(表達式常量 n)語句塊 n else語句塊 n1但用 switch 語句則更方便,實際上也用得更多一些。第3 章數組與字符串一維數組數組及其特點te數組是相關變量的有序集合,其中所有的變量具有相同的數據類型。數組的特點:一維數組說明和下標型明符數名其中,size 為數組的大小,即組成該數組元素的個數。C 語言中,數組的下標從 0 開始,到 size1 為止。例如:int x50 到4 共5 0143.1(
28、Fibonacci)16 項#include void main()#include void main()t6,; Fibonacci00; Fibonacci11; -i1for(i0;i16;i)printf(“%d,”,Fibonaccii); printf(“n”);執行結果:0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,510,多維數組多維數組說明格式為:型明符數組e1ee其中,size1,size2,sizen 為數組各維的大小。組成該組元素的總個數應為 size1 size2sizen。例如:t001020 009 019099例 3.2 將
29、一個二維數組行和列元素互換,存入另一個二維數組里#include void main ()static int a23=1,2,3,4,5,6;static int b32,i,j; printf(array a : n);#include void main ()static int a23=1,2,3,4,5,6;static int b32,i,j; printf(array a : n);for (i=0;i=1;i+)for (j=0;j=2;j+)/*循環變量作為行坐標*/*循環變量作為列坐標*/printf(%5d,aij);bji=aij;*/printf(n);printf(
30、array b : n); for (i=0;i=2;i+)for (j=0;j=1;j+)/*循環變量作為行坐標*/*循環變量作為列坐標*/printf(%5d,bij);printf(n);數組元素初始化數組的初始化C 語言允許在說明時對全局數組和靜態數組初始化,即給各個元素賦以初始值,例如:void main()int counters50,1,2,3,4; char ctM50,372,9,0,0,8,732,intx50,1,2;*0*當給出初始值的個數少于數組全部元素個數時,未列出的后若干個初始值默認為 0。有時,不直接給出數組大小,作為變長數組出現,也照樣可以初始化。例如:int
31、 a1,2,3,4,5; floatf1.2,2.5,3.8,4.0; char char error“read errorn”;字符串字符串要用一維字符數組處理, 實質上就是以空字符結尾的字符數組。以空字符結尾的字符數組空字符就是 NULL,即0。一個字符串可看成結尾為0的不定長的一維字符數組。例如:“a”等同于a,0 “等同于0“ “等同于,0“Hello!n”等同于H,e,1,1,o,!,n,0字符串常量可采用類似于變長數組初始化處理。intA0,1,2,3,4;static char xH,e,l,l,0,!,0;0char x“Hello”;可用%s 的格式顯示一個以0結尾的字符串。
32、系統顯示字符串遇到空格符0時,就結束該字符串的顯示。例如:static char x“Hello!”; printf(“%sn”,x);此語句的執行結果,將顯示:Hello字符串的輸入可用%s 的格式輸入一個字符串。例如:char s120; scanf(“%s”,s1);在1 輸入字符串時,遇到空格或回車則結束。用 scanf()輸入字符或字符串時,遇到空格或回車結束。這不便于文字處理,一般用getchar()函數輸入單字符。例如:#include void main轉義字符char ch; chgetchar();一些特殊字符,須用反斜線來轉義,例如:0NULb退格n回車換行r回車不換行t
33、橫向制表v縱向制表單引號”雙引號f換頁反斜線例 3.3 輸出一個鉆石圖形。main ()static chardiamond5=/*/ , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*;int i,j;fori=0;i5;i+)/* */運行結果:forj=0;j5;j+)/*printf(%c,diamondij);printf(n);*例3.4統輸的文字多個詞。/*“L6-8 */ #includestdio.h main()char string81;int i,num=0,word=0; char c;gets(string);/* string */ fori
34、=0;(c=stringi)!=0;i+)ifc/* c elseifword=0)/* c c */word=1;num+;printf(Thereare%dwordsinthelinen,num);字符串函數C string.h string.h#include 字符函數和字符轉換及運算1. 字符函數C 語言編譯器的字符函數放在文件ctype.h ctype.h, #include這類函數主要是用于字符類別判斷及轉換,例如:isalnum(ch)若ch 為母數,返非零;則返零。islower(ch)是小字,返非值;則返零。tolower(ch)字轉成寫例 3.5 (ASCII )。/*L6
35、-9*/ main ()char string20;charstr320;/*inti;for (i=0;i0)/* 比較 strcpy(string,str0);/* 串制到string */ elsestrcpy(string,str1);ifstrcpy(string,str2);printf(nthe largest string is:n%sn,string);第4 章函數與變量C C C C 程序設計的一般形式1. C 語言程序的一般格式全局變量說明main()部量明行)fn(形參定義)局部變量說明執行語句例 4.1:輸出 fa(n)函數值#include intfa(intn)/
36、* int*/ifn0)return1);/* else return0);main()int a;printf(請輸入數據:n);scanf(“%d”,&a);printf(“n%dn”,fa(a);/* a n */例 4.2:將輸入的大寫字母轉換為小寫*a stringinlowercaes#includecharuptolow();/* uptolow()*/ voidmain()char ch; doprintf(“Please type in a lettern”); scanf(“%c”,&ch); printf(“%c”,uptolow(ch);/* while(ch!);*格
37、符結束printf(“n”);charuptolow(chark)/* */if(kA&k) kaA; return(k);函數C 語言程序的基本構件C :(2)(3)例 4.3:求任意兩個整數的階乘之和void main()int number1,number2,result; int factorial();printf(“Please type number1 and number2”);scanf(“%d %d”,&number1,&number2); resultfactorial(number1)factorial(number2); printf(“number1!+ numbe
38、r2! %d”,result);intfactorial(intn)/* */int result11; while(n!0)result1 * n;n-;returnresult1;*result1 *類型說明符 函數名(形參定義)局部變量說明函數體語句注意:函數也可能不需要傳遞參數,這時只保留括號,也無需對形參說明。形參表內可含有多個變量,用逗號分隔開。例如:float sum(float a,float b)return(ab);例 4.4 函數 power()實現 xn,其中 n 是整數#include double power(double xintn)/* */double p;
39、if (n0)for (p=1.0; n0; n-) p=p*x;else p=1.0;return(p);/* 函值*/void main ()double m;mpower(12.0,2);/* */ printf(“n %en”,m);printf(“n 計算結果為:%en”,power(12.0,3);函數返回值函數返回值的類型說明型明符數名()voidf(b)f(b)return有返回值的函數需要用返回語句來傳送返回值。return;或return(返回變量名或表達式值);,return printmessage()printf(“programming is fun n”); re
40、turn;2) 從函數返回調用點,并返回函數的值。例如:計算階乘factorial3(int n)int result1; return(result);while(n! 0)result*n-;return(result);在 return 語句括號內的 retult 是被返回的變量, 帶回函數值。函數的調用函數的參數函數定義格式為:類型說明符 函數名(形參表) 形參說明函數體函數的調用格式為:函數名(實參表)注意:(); (2)(3) 函數返回值只能有一個,要想得到多個參數 a1,a2,值, 則需定義全局變量 a1, a2,或用地址指針操作。函數調用順序及類型說明4.5float sum(
41、floata,floatb)/* */return(ab);void main()float first,second; first1.0; second2.0;printf(“%fn”,sum(first,second);/* */注意:簡單的函數適于放在前頭。因主函數中未對函數定義,放在后頭易出錯。在主函數中說明函數類型,對該函數的定義放在后面。例 4.6:調用函數求兩數之和。void main()floatfirst,second,sum();/* sumfirst1.0;second2.0; printf(“%fn”,sum(first,second);float sum(floata
42、,floatb)/* sum(a,b*/return(ab);遞歸函數與遞歸調用遞歸函數有些函數可用遞歸定義,稱為遞歸函數。例:n 的階乘遞歸調用n!1n0 時n*(n1)!時遞歸函數的計算程序,可采用遞歸調用算法實現。例如:計算 n 的階乘foctorial4(intn)int if(n0)result1;elseresultn*foctorial4(n1);/* returnresult;外部函數和內部函數(了解)基本概念存儲類是extern,static(extern)標符函名形表)如intfun(inta,intb) /*義fun 內函,類為int*/ externintf1(inta
43、,intb)/*義f1 部數*/intf2(inta,intb)/*f2 */4.7 file1.c(1)#include externprime();/ void main()intnumber;printf(“請輸入一個正整數:n”); scanf(“%d”,&number);if (prime(number)printf(“n %d 是素數.”,number); elseprintf(“n %d 不是素數.”,number);file2.c(源文件 2)intprime(intnumber)*/int flag=1,n;for (n=2;nnumber/2 & flag=1;n+) if
44、(number%n=0)flag =0;return flag;變量的存儲類型局部變量例 4.8:#includemain()intx;/*/x1; func1(); func2();printf(“x%dn”,x);/* 1*/func1()intx;/*x10;return;func2();floatx;/*x1.2;return;其中,局部變量 x 在三個函數中彼此無關。執行結果:x110 x21.2 x1例4.9:局變量x 變化#include main()int x1;int x2;int x3;printf(“x1%dn”,x);/*3*/*釋 放 x 值 3 */ printf(
45、“x2%dn”,x);/*輸出為2 /*x 2 */printf(“x3%dn”,x);/*1 */靜態局部變量靜態局部變量局限于定義它的函數之內,但并不隨函數的退出而消失。例 4.10:靜態局部變量*Program to local and variables*#includemain()int i; for(i0;i5;i)as();as()執行結果:int 1v0;static int sv0; *靜態局部變量每次調用的保留上次調用的值 * printf(“local%d,static%dn”,1v,sv);1v; sv; return;靜態局部變量的特點:全局變量(全程變量)定義在所有
46、函數之外,可供所有函數訪問的變量,稱為全程變量或全局變量。例4.11:求入的乘。#include intnumber;* 定義number 變量main()printf(“Please type in the number n”); scanf(“%d”,&number); printf(“%d!%d”,number,factorial2();factorial2()intresult1;* 定義result 局部量* while(number!0)/* 接用變量number */result*number; number-;return(result);函數 factorial2()沒有形參
47、,可直接對全程變量 number 進行處理,函數調用時也不需要實參。例 4.12 程序分析(1)#includemain ()inti,j=1;/* main 定變量*/for (i=0;i3;i+) /* 使用 main 中定義的變量 i */int i=0;i=i+j+;/* i */ printf(%d,i/* i */printf(%ddn,i,j);/* main i*/程序的輸出結果: 1,2,3,3,4(2)#include intfunc();inti=5;/* */void main ()inti,x;/* 自變量x=10;for (i=0;i3;i+) /* 使用 main
48、 中定義的變量 i */int x=1;printf(%d,+x);/* x x=func();printf(%d, n,x);int func()printf(%d, ,i); i+;return(i);程序執行結果:2,5,2,6,2,7,10#include voidinner();#include voidinner();void char c=A; void main()int i;for (i=0; i3; i+)inner();st_pr(); printf(%c;,c); c+;void inner ()char c=a; printf(%c,c); c+;voidst_pr(
49、)static char c=Z; printf(%c,c);c-;程序執行后的輸出結果:aZA;aYB;寄存器變量Register明符量1)2)register int i; for(i=0;iLIMIT;i+)#include int fac(int n)register int i,f=1; for(i=1;i=n;i+) f=f*i;#include int fac(int n)register int i,f=1; for(i=1;i=n;i+) f=f*i;return(f);main()int i; for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);第
50、5 章指針指針和地址指針是 C 語言中一個極其重要的概念,也是 C 語言程序設計的難點。指針的定義()。C 指針變量和指針運算符指針變量及其說明型明符*變名;例如:int*P;說明針量P 向int 類型量指針. char*s;說明針量s 向char 變的針。float*f;說明針量f 指向float 類型量指。Double*d;d double int pa;pa int pa int*fpi();fpi()int Int(*pfi)();pfi int 0 0 NULL 在C 指針運算符&和*指針變量雖是正的整數值,但不是整數類型變量。指針變量最基本的運算符是&和*。&它的作用是返回后隨變量
51、(操作數)的內存地址。請注意,它只能用于一個具體的變量或數組元素,不可用于表達式。例:int *p; int m; m=200; p=&m;這是將整數類型變量 m 的地址賦給整數類型的指針變量p。(2) *取值它的作用是返回其后隨地址(指針變量所表達的地址值)中的變量值。例:int *p; int m; int n; m=200; p=&m; n=*p;p (m)m=np。&與*運算符互為逆運算。對指針變量 px 指向的目標變量*px 實行取址運算:&(*px)其結果就是 px。對變量 x 的地址實行取值運算:*(&x)其結果就是 x。注意,x 與*px 同級別可寫成 x=*px 或*px=x
52、。px 與&x 同級別可寫成 px=&x,但決不可寫成&x=px,也不能寫成 px=x。指針的初始化和賦值運算針初化往指針定說同完,初化般式: 型明符針量始址值;例如:請注意:charc;char*charp=&c;: 必須加以定義說明。 必須經過初始化。 未經過初始化的指針變量禁止使用。&指針變量可以進行賦值運算,這種賦值運算操作也僅限制在同類之間才可實現。例 5.1:指針變量的引用。void main()intx=10int*p1=&x,*p2;/* p1 向 x */ p2=p1;/*p2 向 xprintf(“%dn”,*p2);執行結果應顯示:10例 5.2:指針變量的運算。void
53、 main()char /*c char*charp=&c;/*c charp */ printf(“%c%cn”,c,*charp);c=B;/*c printf(“%c%cn”,c,*charp);*charp=a;/*將指針變量 charp 所指向地址的內容改為printf(“%c%cn”,c,*charp);執行結果應顯示:AA aasizeof 運算符sizeof 運算符可以準確地得到在當前所使用的系統中某一數據類型所占字節數。sizeof 運算的格式:sizeof(類型說明符)其值為該類型變量所占字節數。用輸出語句可方便地打印出有關信息,例如:printf(“%dn”,sizeof
54、(int);printf(“%dn”,sizeof(float); printf(“%dn”,sizeof(double);指針的算術運算只有如下四種:,1 1 指針自增運算意味著指針向后移動一個數據的位置,指向的地址為原來地址sizeof(類型說明符)。例如:int i,*p; p=&i; p;結果是 p 指向了變量 i 的地址sizeof(int)。加()n sizeof()*n()正整數 n sizeof()*n。指向同一種數據類型的指針,才有可能進行各種關系運算。指針的關系運算符包括有:,!,。它們實際所進行的是兩個指針所指向的地址的比較。0 0(NULL)pp=0 p!=0 p 使用
55、指針編程中的常見錯誤main()intx=0;*p=x;/*/*p 未被初始化。main()float x,y; short int *p;p=&x;/*y=*p;x,y 與*p 數據類型不符。void main()int x,*p; x=10p=x錯在以普通變量 x 賦給指針變量 p。局變的址始化態指變,如: intglo;func()int1oc1,1oc2; intint *1p=&1oc1; int*rp&1oc2;用局部變量 1oc1 去初始化靜態的指針變量 1p 是錯誤的。指針與函數參數例 5.3:x 和y 的值互換。#include swap1(int x,int y)int t
56、emp; temp=x#include swap1(int x,int y)int temp; temp=x; x=y; y=temp;void main()int a,b; a=10; b=20; printf(“a=d%db=%dn”,a,b);a=10b=20雖然,swap1()x y x,y y a b 改用指針作為參數,也就是用變量的地址作為參數,即所謂“傳址”(或稱為“傳名”) 的調用,就可改變相應地址中的變量。#include swap2(int *px,int *py)inttemp; temp=*px;*px=*py#include swap2(int *px,int *py
57、)inttemp; temp=*px;*px=*py;*py=temp;void main()inta,b; a=10; b=20;swap2(&a,&b);/*printf(“a=%db=%dn”,a,b);執行結果:a=20b=10a 與 b 的地址,即&a 與&b 并未交換,但其值已被交換。指針、數組和字符串指針指針和數組inta10;則在內存中占有從一個基地址開始的一塊足夠大的連續的空間,以包容 a0,a1, a9。基地址(或稱為首地址)是 a0存放的地址。其他依下標順序排列。若定義一個指針:int*p;則意味著:p=&a0;即p 指 向 a0 p1 指向 a1 p2 指向 a2pi=
58、&ai;pi 指向ai(i=0,9)(1)C 當作a0p=a+i p=&ai0 (2) p a p=ap+i ai,a+i ai。這樣,ai與*(p+i)或*(a+i)可看成是等價的,可互相替代使用。注意:a p=aa=p, p+a+。字符串指針C char char char #include strlen( char *s)intn; for(n=0;*s!=0#include strlen( char *s)intn; for(n=0;*s!=0;s) n+return(n);void main()char str=“Hello!printf(“%cn”,*str); printf(“%
59、dn”,strlen(str); printf(“%cn”,*(str+1);執行結果:H6e定義字符指針可以直接用字符串作為初始值,來初始化字符指針。例如:char *message=“Hello!”;或char *message; message=“Hello!”;chartext80;則不可寫成:text=“Hello!”;因為,此處 text 是數組名,而不是指針,只能按字符數組初始化操作。即:chartext80=“Hello!”;當字符串常量作為參數(實參)傳遞給函數時,實際傳遞的是指向該字符串的指針,并未進行字符串拷貝。例如:例 5.6:向字符指針賦字符串void main()執
60、行結果:chars=“Hello!”;/*s char *p;while(*s!=0) printf(“%c”,*s+);printf(“n”);p=“Good-bye!”;/*while(*p!=o)printf(“%c”,*p+); printf(“n”)Hello! Good-bye!此例中字符串是逐個字符輸出,也可以字符指針為參量,作字符輸出,例如:printf(“%s”,s);或printf(“%s”,p);scanf()5.7strcomp()。strcomp(char *s,char *t)for(;*s=*t;s+,t+) if(*s=o)return(0);return(*s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省無錫市積余中學2025年初三年級8月摸底考試數學試題含解析
- 重慶市江津區2025年初三第五次適應性訓練數學試題試卷含解析
- 重慶市重點中學2025年初三下學期期末仿真模擬生物試題含解析
- 互聯網時代干部培訓策略與實施
- 棗強中學高一上學期第三次月考生物試題
- 目標控制程序培訓資料
- 2025租賃合同范本:測量儀器出租合同
- 2025筆記本電腦買賣合同
- 2025財經大學服務合同(教室租賃類)
- 2025年建筑項目基礎施工合同范本
- 導線的連接精品課件
- 論提高行政效率的途徑 開題報告
- 059.商業計劃書和可行性報告精制食油廠年產萬噸精制山茶油項目可行性研究報告
- 米度盾構導向系統
- [說明]心血管內科(心內科)_見習教案_6_動脈粥樣硬化和冠狀動脈粥樣硬化性心臟病
- Q∕GDW 11257.3-2020 熔斷器技術規范 第3部分:跌落式熔斷器
- 汽車焊接夾具設計外文文獻翻譯
- 濃縮機的選擇與計算
- 滬教版六年級下冊單詞表
- 紅星美凱龍租賃合同
- 最新投標書密封條
評論
0/150
提交評論