版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
.PAGE.C語言最重要的知識(shí)點(diǎn)復(fù)習(xí)資料!總體上必須清楚的:
1>程序結(jié)構(gòu)是三種:順序結(jié)構(gòu),循環(huán)結(jié)構(gòu)<三個(gè)循環(huán)結(jié)構(gòu)>,選擇結(jié)構(gòu)<if和switch>
2>讀程序都要從main<>入口,然后從最上面順序往下讀<碰到循環(huán)做循環(huán),碰到選擇做選擇>。
3>計(jì)算機(jī)的數(shù)據(jù)在電腦中保存是以二進(jìn)制的形式.數(shù)據(jù)存放的位置就是它的地址.
4>bit是位,是指為0或者1。byte是指字節(jié),一個(gè)字節(jié)=八個(gè)位.
5>一定要記住二進(jìn)制如何劃成十進(jìn)制。
概念??嫉降模?/p>
1、編譯預(yù)處理不是C語言的一部分,不再運(yùn)行時(shí)間,占編譯時(shí)間。C語言編譯的程序稱為源程序,它以ASCII數(shù)值存放在文本文件中。
2、每個(gè)C語言程序中main函數(shù)是有且只有一個(gè)。
3、在函數(shù)中不可以再定義函數(shù)。
4、算法的是一定要有輸出的,他可以沒有輸入。
5、break可用于循環(huán)結(jié)構(gòu)和switch語句,continue只用于循環(huán)。
6、逗號(hào)運(yùn)算符的級(jí)別最低。第一、二章C語言基礎(chǔ)及簡單程序設(shè)計(jì)c語言由什么構(gòu)成;〔函數(shù):一個(gè)C語言程序由一個(gè)至多個(gè)函數(shù)組成,main<>是主函數(shù),該函數(shù)既是入口又是出口〔一個(gè)入口,一個(gè)出口數(shù)據(jù)類型:基本數(shù)據(jù)類型<整型,字符,實(shí)型,枚舉型>,占用內(nèi)存的字節(jié)數(shù),表示范圍常量:123,0101<沒有8和9>,0x41,'1',-2.30,-1.2E+5在一個(gè)字節(jié)內(nèi),字符通整型,整型通字符合法的用戶標(biāo)識(shí)符考查:
合法的要求是由字母,數(shù)字,下劃線組成,并且第一個(gè)必須為字母或則是下劃線。
關(guān)鍵字不可以作為用戶標(biāo)識(shí)符號(hào)。main
define
scanf
printf都不是關(guān)鍵字。迷惑你的地方If是可以做為用戶標(biāo)識(shí)符。因?yàn)镮f中的第一個(gè)字母大寫了,所以不是關(guān)鍵字。實(shí)型數(shù)據(jù)的合法形式:考試口訣:e前e后必有數(shù),e后必為整數(shù)。.2.333e-1就是合法的,且數(shù)據(jù)是2.333×10-1。字符和字符串?dāng)?shù)據(jù)的合法形式::
'1'是字符占一個(gè)字節(jié),"1"是字符串占兩個(gè)字節(jié)<含有一個(gè)結(jié)束符號(hào)>。
'0'的ASCII數(shù)值表示為48,'a'的ASCII數(shù)值是97,'A'的ASCII數(shù)值是65。轉(zhuǎn)義字符的考查〔p28:轉(zhuǎn)義符\:'\n','\0','\ddd','\xdd'等強(qiáng)制類型轉(zhuǎn)換:
一定是〔inta不是
int〔a,注意類型上一定有括號(hào)的。
注意〔int〔a+b和〔inta+b的區(qū)別。前是把a(bǔ)+b轉(zhuǎn)型,后是把a(bǔ)轉(zhuǎn)型再加b。
自加、自減表達(dá)式:假設(shè)a=5,++a〔是為6,a++〔為5;
運(yùn)行的機(jī)理:++a是先把變量的數(shù)值加上1,然后把得到的數(shù)值放到變量a中,然后再用這個(gè)++a表達(dá)式的數(shù)值為6,而a++是先用該表達(dá)式的數(shù)值為5,然后再把a(bǔ)的數(shù)值加上1為6,再放到變量a中。進(jìn)行了++a和a++后在下面的程序中再用到a的話都是變量a中的6了。
考試口訣:++在前先加后用,++在后先用后加。逗號(hào)表達(dá)式:優(yōu)先級(jí)別最低;表達(dá)式的數(shù)值逗號(hào)最右邊的那個(gè)表達(dá)式的數(shù)值。如〔2,3,4的表達(dá)式的數(shù)值就是4。位運(yùn)算的考查:口訣:先轉(zhuǎn)二進(jìn)制再運(yùn)算
總的處理方法:〔先把十進(jìn)制變成二進(jìn)制再變成十進(jìn)制。
例1:chara=6,b;
b=a<<2;
這種題目的計(jì)算是先要把a(bǔ)的十進(jìn)制6化成二進(jìn)制,再做位運(yùn)算。
例2:在沒有舍去數(shù)據(jù)的時(shí)候,<<左移一位表示乘以2;>>右移一位表示除以2。%符號(hào)兩邊要求是整數(shù)。不是整數(shù)就錯(cuò)了。變量:變量的命名規(guī)則滿足標(biāo)識(shí)符的命名規(guī)則,區(qū)分大小寫,關(guān)鍵字<p7>除外,變量的定義一般都要放在函數(shù)或程序的開頭位置〔即先定義后使用分號(hào):表示一個(gè)語句結(jié)束變量的定義:類型名變量名列表;<不同的類型要寫成兩句>,定義的時(shí)候給值成為變量的初始化,初始化的時(shí)候不能連等〔如inta=b=c=1;是錯(cuò)的!inta,b,c;a=b=c=1;是對(duì)的。變量的賦值:變量名=表達(dá)式或變量名復(fù)合賦值運(yùn)算符表達(dá)式<復(fù)合賦值運(yùn)算符:+=,*=,^=,...>,如:xyz+2=c行嗎?不行〔賦值表達(dá)式左邊只能是變量!賦值的時(shí)候可以連等。輸入一個(gè)字符:x=getchar<>,putchar<x>,有這兩個(gè)函數(shù)及FILE時(shí)一定要加上#include<stdio.h>//標(biāo)準(zhǔn)輸入輸出的頭文件包含getch<>,表示暫停程序運(yùn)行,可直接查看結(jié)果,否則運(yùn)行完后不顯示結(jié)果〔需按ALT+F5。printf<"xxxxxxxxxxxxxxx">;或printf<"格式控制符",變量列表>;變量列表不加&scanf<"格式控制符",地址列表>,地址列表可為數(shù)組名、指針變量名及普通變量名〔普通變量名前要加加&。printf<"%m.nf",32.6789>scanf的格式控制符中,除了逗號(hào),一般不加其他字符;一定要記住,有逗號(hào)時(shí)輸入要加逗號(hào),否則:數(shù)據(jù)用空格隔開,字符連著輸入;沒有"%m.nf"的寫法,只有"%mf"的寫法,
float型用"%f",double型用"%lf",longdouble用"%Lf"不同類型的數(shù)值型數(shù)據(jù)進(jìn)行混合運(yùn)算不同類型的數(shù)值型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),先要把低數(shù)據(jù)類型向高數(shù)據(jù)類型轉(zhuǎn)換,成為同一類型后才進(jìn)行運(yùn)算。橫向箭頭表示必須進(jìn)行的轉(zhuǎn)換。逗號(hào)運(yùn)算符是最低的運(yùn)算符常量不能++、--;例:b=<a=1,a++,a++>,又例:b=<a=2>+<a=3>,又例:a=1;b=<++a>+<++a>=與==的區(qū)別〔賦值和等號(hào)在C語言中,對(duì)于邏輯運(yùn)算,非零的數(shù)〔不管實(shí)數(shù)還是整數(shù)都認(rèn)為是真的,真的就是
1,假的就是0;關(guān)系運(yùn)算的結(jié)果是邏輯值〔真為1假為0。運(yùn)算符:運(yùn)算符的優(yōu)先序〔p246:成單算移關(guān)于,異或邏條賦逗。運(yùn)算符的結(jié)合性〔p246:條件、單目、賦值運(yùn)算符?!瞤rintf輸出也是自右而左運(yùn)算『所有運(yùn)算符』成員運(yùn)算:<"<>",[],->,結(jié)構(gòu)體成員.>成員運(yùn)算:<"<>",[],->,結(jié)構(gòu)體成員.>單目運(yùn)算:<!,-,++,--,取值*,取址&,位取反~>算術(shù)運(yùn)算:<*,/,%>級(jí)別高于<+,->位移運(yùn)算:<<<,>>>關(guān)系運(yùn)算:<>,>=,<,<=>級(jí)別高于<==,!=>位與運(yùn)算:<&>位異或運(yùn)算:<^>位或運(yùn)算:<|>邏輯運(yùn)算:<&&>級(jí)別高于<||>條件運(yùn)算:<?:>賦值算:<=,+=,...,<<=,>>=,&=,|=,^=>逗號(hào)運(yùn)算:<,>例如.以下程序的運(yùn)行結(jié)果是structst{intn;floatx;}*p;voidmain<>{structstarr[3]={{10,5.6},{12,7.1},{14,6.7}};p=arr;printf<"%d\n",++p->n>;p++;printf<"%d,%.2f\n",p->n,p->x>;}A>12B>11C>11D>1212,7.1010,5.6012,7.1014,6.70第三、四章選擇和循環(huán)結(jié)構(gòu)C程序一般采用自頂向下的編寫格式,模塊化<函數(shù)>C程序結(jié)構(gòu)有三種:順序,選擇<分支>,循環(huán){}:用在函數(shù),或復(fù)合語句分支結(jié)構(gòu)〔或選擇結(jié)構(gòu)[if結(jié)構(gòu)和switch結(jié)構(gòu)]if分支結(jié)構(gòu)單分支: if<表達(dá)式>語句;或if<表達(dá)式>{語句組}雙分支:if<表達(dá)式>語句1;else語句2;多分支if:if<表達(dá)式1>語句1;elseif<表達(dá)式2>語句2;...elseif<表達(dá)式n-1>語句n-1;else語句n;多分支switch:switch<x> {casex1:語句1;[break;]...casexn:語句n;[break;]default:語句;[break;]}例:main<>{intc;while<<c=getchar<>>!='\n'>{switch<c-'2'>{case0:case1:putchar<c+4>;case2:putchar<c+4>;break;case3:putchar<c+3>;default:putchar<c+2>;break;}}printf<"\n">;}當(dāng)輸入:247<回車>,程序的輸出結(jié)果是〔。<A>689<B>6689<C>66778<D>66887switch總結(jié):其語義是:先計(jì)算出表達(dá)式的值,用此值與哪個(gè)case后的常量表達(dá)式的值相一致,則執(zhí)行那個(gè)case后的語句組,如果語句組后有break語句則直接退出switch結(jié)構(gòu),如語句組執(zhí)行后沒有break語句則繼續(xù)執(zhí)行后續(xù)case后的語句組,直到遇到break語句退出switch結(jié)構(gòu),如沒有break語句則會(huì)執(zhí)行后續(xù)所有case或default后的語句組再退出switch結(jié)構(gòu)。若計(jì)算出表達(dá)式的值與case后的所有常量表達(dá)式的值都不同則只執(zhí)行default及之后的語句組一直執(zhí)行到最后〔若遇break則終止退出switch結(jié)構(gòu),如沒有default語句則直接退出switch結(jié)構(gòu)。循環(huán)語句:<1>for<表達(dá)式1;表達(dá)式2;表達(dá)式3>或for<表達(dá)式1;表達(dá)式2;表達(dá)式3>{循環(huán)體語句組;循環(huán)體語句;...[break;]/*用于結(jié)束當(dāng)層循環(huán),跳到當(dāng)層循環(huán)后面的語句。*/...[continue;]/*用于結(jié)束當(dāng)次循環(huán),跳過當(dāng)次循環(huán)后面的語句,進(jìn)入下次循環(huán)。*/...}<2>while<表達(dá)式>while<表達(dá)式>{循環(huán)體語句組;循環(huán)體語句;...[break;]...[continue;]...}<3>do{循環(huán)體語句組;...[break;]...[continue;]...}while<表達(dá)式>;例:for<i=1;i<=10;i++>for<i=1;i<=10;i++>{{if<i%2==0>break;if<i%2==0>continue;printf<"%d",i>; printf<"%d",i>;}}循環(huán)嵌套:從外循環(huán)進(jìn)來,內(nèi)循環(huán)結(jié)束后,再到外循環(huán),如此反復(fù),直到外循環(huán)結(jié)束x=0;或x=0;for<i=1;i<=2;i++>for<i=1;i<=2;i++>for<j=1;j<=i;j++>{j=1;x+=i*j;while<j<=i>{x+=i*j;j++;}}break可用于switch和循環(huán)語句,一個(gè)break只退出一層;而continue只對(duì)循環(huán)有效記住:質(zhì)數(shù)的判斷,斐波那契數(shù)列,輾轉(zhuǎn)相除法,求數(shù)列的和〔有正符號(hào)如何處理?置標(biāo)志位循環(huán)總結(jié):for循環(huán)與while循環(huán)類似,屬于先判斷后執(zhí)行;dowhile,屬于先執(zhí)行后判斷for語句中有三個(gè)表達(dá)式:表達(dá)式1通常用來給循環(huán)變量賦初值;表達(dá)式2通常是循環(huán)條件;表達(dá)式3用來更新循環(huán)變量的值for語句中的各個(gè)表達(dá)式都可以省略,但要注意分號(hào)分隔符不能省略如果省略表達(dá)式2和表達(dá)式3需要在循環(huán)體內(nèi)設(shè)法結(jié)束循環(huán),否則會(huì)導(dǎo)致死循環(huán)break語句用在循環(huán)中時(shí),可以直接終止當(dāng)前循環(huán),將控制轉(zhuǎn)向循環(huán)后面的語句continue語句的作用是跳過循環(huán)體中剩余的語句而執(zhí)行下一次循環(huán)嵌套循環(huán)時(shí),必須將被嵌套的循環(huán)語句完整地包含在外層循環(huán)的循環(huán)體內(nèi)第五章函數(shù)系統(tǒng)函數(shù):數(shù)學(xué)類函數(shù)〔math.h,輸入輸出函數(shù)〔stdio.h,字符串類函數(shù)〔string.h自定義函數(shù):格式類型名函數(shù)名<形式參數(shù)列表>{函數(shù)體 }不寫函數(shù)類型名默認(rèn)為整型如果函數(shù)類型名為void表示無返回值函數(shù)〔不寫return聲明如果調(diào)用函數(shù)寫在被調(diào)函數(shù)之前,且被調(diào)函數(shù)類型名不是整型<或字符型>,則在調(diào)用函數(shù)中或調(diào)用函數(shù)之前應(yīng)該先聲明,如何聲明?聲明:類型名函數(shù)名<形式參數(shù)列表>;聲明函數(shù)的遞歸:直接或者間接調(diào)用自身。〔如階乘全局變量:在函數(shù)外定義的變量,如果定義時(shí)沒給值,默認(rèn)為0局部變量:在函數(shù)內(nèi)定義的變量、形式參數(shù)、復(fù)合語句中定義的變量,如果沒給具體的值,該值不確定對(duì)于全局變量和局部變量主要觀察在函數(shù)中是否被重新定義,若全局變量和局部變量同名,則自動(dòng)屏蔽掉全局變量。函數(shù)調(diào)用時(shí),實(shí)參向形參傳遞:<1>按值傳遞:形參的變化不會(huì)改變實(shí)參的變化?!踩粲蟹祷刂祵⒅祹Щ?否則帶回控制流,函數(shù)的返回值類型與函數(shù)類型一致;<2>按地址傳遞:形參的變化就會(huì)有可能改變實(shí)參的變化。<3>數(shù)組傳遞,通常就把數(shù)組名及數(shù)組元素傳過去如果一個(gè)函數(shù)名為:fun<x>,嚴(yán)禁出現(xiàn):fun<x>=…,不管遞歸與否〔滿足標(biāo)識(shí)符命名returny;或return〔y;不要寫成returny1,y2;靜態(tài)變量:staticintx;<1>沒給值,默認(rèn)為0;<2>始終占用內(nèi)存,其值會(huì)保留下來〔即賦值一次,不再重新賦值,保留上次運(yùn)行結(jié)果[靜態(tài)變量]舉例eg:以下程序的運(yùn)行結(jié)果是〔C。fun3<intx>main<>{staticinta=3;{intk=2,m=1,n;a+=x;n=fun3<k>;returna;n=fun3<m>;}printf<"%d\n",n>;}A、3B、4C、6D、9宏定義:#define標(biāo)識(shí)符字符串,宏一定要先替換后計(jì)算分帶參和無參宏定義無參宏定義如#definePx*x//表示碰到P時(shí)用x*x替換帶參宏定義如#defineP〔xx*x//表示碰到P〔x時(shí)用x*x替換[無參宏定義]舉例若有定義:#defineN3+2,則表達(dá)式N*2的值為〔B。A、5B、7C、10D、0解釋:N*2=3+2*2=3+4=7。[帶參宏定義]舉例以下程序運(yùn)行后輸出結(jié)果是〔B。#defineMIN<m,n>m<n?m:nmain<>{inta=3,b=5,c;c=2*MIN<a,b>;printf<"%d",c>;}A、3B、5C、6D、10解釋:c=2*MIN<a,b>=2*a<b?a:b2*3<5?3:5。第六章數(shù)組一維數(shù)組的定義格式為:類型說明符數(shù)組名[常量表達(dá)式];例如:inta[10];常量表達(dá)式可以是整型常量或字符常量或枚舉值或符號(hào)常量表達(dá)式<注意不能包含變量>.例如,下面這樣定義數(shù)組是不行的:舉例:intn;scanf<"%d″,&n>;inta[n];intk,M=5,a[k],b[M];/*不能用變量說明數(shù)組大小*/floata[0]; /*數(shù)組大小為0沒有意義*/intb<2>;/*不能使用圓括號(hào)*/數(shù)組元素下標(biāo)可以是整型常量、變量、變量或整型表達(dá)式。C語言規(guī)定,下標(biāo)的最小值是0,最大值則是數(shù)組大小減1。eg:m[8]中,表示數(shù)組m有8個(gè)元素,下標(biāo)從0開始一直到7。這8個(gè)數(shù)組元素分別是:m[0]、m[1]、m[2]、m[3]、m[4]、m[5]、m[6]、m[7],注意沒有m[8]。對(duì)一維數(shù)組的初始化賦值<1>可以只給部分元素賦初值。沒有賦值的元素:對(duì)于數(shù)值型數(shù)組,自動(dòng)賦初值為0;對(duì)字符型數(shù)組,自動(dòng)賦初值為空字符。<2>只能給元素逐個(gè)賦值,不能給數(shù)組整體賦值。intm[5]={2,2,2,2,2};不能寫成:intm[5]=2;<3>如果給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個(gè)數(shù),其長度等于初值表中數(shù)組元素的個(gè)數(shù)。intm[]={1,2,3,4,5};二維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)1][下標(biāo)2];二維數(shù)組元素的初始化分行初始化:存儲(chǔ)類型符數(shù)據(jù)類型數(shù)組變量名[行常量表達(dá)式][列常量表達(dá)式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};Eg:若有定義:ints[3][4]={{1,2},{0},{3,4,5}};則s[2][1]的值為〔B。A. 3 B.4 C.0 D.1省略一維大?。捍鎯?chǔ)類型符數(shù)據(jù)類型數(shù)組變量名[行常量表達(dá)式][列常量表達(dá)式]={初值表};Eg:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};printf<"%d\n",a[1][2]>;A. 2 B.3 C.6 D.7字符數(shù)組的定義格式:char數(shù)組名[常量表達(dá)式];在c語言中,沒有專門的字符串變量,通常是用一個(gè)字符數(shù)組來存放一個(gè)字符串,由于字符串總是以‘\0’作為串的結(jié)束標(biāo)志,因此當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí),也把結(jié)束符‘\0’存入數(shù)組,并以此作為該字符串結(jié)束的標(biāo)志C語言允許用字符串的方式對(duì)數(shù)組做初始化賦值。有兩種方式:<1>按單個(gè)字符的方式賦初值,其中必須有一個(gè)字符是字符串的結(jié)束標(biāo)記〔但字符數(shù)組可以不包括’\0’。如chars[]={‘1’,’2’,’3’,’\0’};<2>直接在初值表中寫一個(gè)字符串常量。如chars[]={"123"};{}可以省略chars[]={‘1’,’2’,’3’,’\0’};<=>chars[]={"123"};<=>chars[]="123";設(shè)已定義chars[]="\"Name\\Address\023\n";,則字符串所占的字節(jié)數(shù)是〔B。A.19 B.16 C.18 D.14字符串的常用串函數(shù)strlen函數(shù)——測(cè)試字符串長度格式:strlen〔字符數(shù)組;功能:測(cè)試指定字符串的實(shí)際長度〔不含字符串結(jié)束標(biāo)志‘\0’,并返回字符串的長度其中,函數(shù)的參數(shù)可以是字符型數(shù)組名或字符串常數(shù),函數(shù)的返回值是字符串的長度。strlen得到的是有效字符的個(gè)數(shù)〔不包括‘\0’sizeof得到的是整個(gè)數(shù)組的長度〔包括‘\0’strcat函數(shù)——字符串連接函數(shù)格式:strcat<字符數(shù)組1,字符數(shù)組2>;功能:把字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,同時(shí)刪去字符串1的串標(biāo)志‘\0’,組成新的字符串。該函數(shù)返回值是字符數(shù)組1的首地址strcmp函數(shù)——字符串比較函數(shù)格式:strcmp<字符串1,字符串2>;功能:字符串1和字符串2可以是字符型數(shù)組名或字符串常量。按照ASCII碼順序比較兩個(gè)數(shù)組中的字符串,并由函數(shù)返回值返回比較結(jié)果strcpy函數(shù)——字符串拷貝函數(shù)格式:strcpy<字符數(shù)組1,字符數(shù)組2>;功能:把字符數(shù)組2中的字符串拷貝到字符數(shù)組1中。字符串結(jié)束標(biāo)志‘\0’也一同拷貝。字符數(shù)組2也可以是一個(gè)字符串常量,這時(shí)相當(dāng)于把一個(gè)字符串賦予一個(gè)字符數(shù)組注意:字符數(shù)組1必須定義的足夠大,以便能容納被復(fù)制的字符串,字符數(shù)組1的長度不應(yīng)該小于字符串2的長度;字符數(shù)組1必須寫成數(shù)組名形式,字符數(shù)組2可以是字符數(shù)組名,也可以是一個(gè)字符串常量;有時(shí)只需要復(fù)制字符數(shù)組2中前面若干個(gè)字符,這些用strcpy函數(shù)也能實(shí)現(xiàn)。如:strcpy〔m1,m2,3表示將m2前面3個(gè)字符復(fù)制到m1中,從而取代m1中最前面的3個(gè)字符。冒泡排序、直接排序、交換排序楊輝三角、矩陣轉(zhuǎn)置〔矩陣轉(zhuǎn)置只要循環(huán)一半就可以。一維數(shù)組倒序存放、矩陣轉(zhuǎn)置只要循環(huán)一半就可以指針本章主要內(nèi)容:指針的概念、定義和引用、指針與函數(shù)、指針與數(shù)組、指針與字符串、指針數(shù)據(jù)類型小結(jié)指針變量的本質(zhì)是用來放地址,而一般的變量是放數(shù)值的。
int
*p中
*p和p的差別:
*p可以當(dāng)做變量來用;*的作用是取后面地址p指向的數(shù)值,p是當(dāng)作地址來使用。
*p++和〔*p++的之間的差別:改錯(cuò)題目中很重要
*p++是地址會(huì)變化;〔*p++是數(shù)值會(huì)要變化。指針變量的定義:一般形式為:類型符*指針變量名;如:int*p;指針變量的引用。兩種基本的指針運(yùn)算:&:取變量的地址*:指針運(yùn)算符〔或稱"間接訪問"運(yùn)算符指針變量作函數(shù)參數(shù)[例7.3]用函數(shù)實(shí)現(xiàn)兩個(gè)變量的交換voidswap<int*p1,int*p2>{ int*t;t=*p1; *p1=*p2; *p2=t;}main<>{ inta=5,b=9;swap<&a,&b>;printf<"a=%d,b=%d\n",a,b>;}指針函數(shù)〔函數(shù)的返回值為指針一般定義為:類型符*函數(shù)名<參數(shù)表>{……}[例7.4]把兩個(gè)數(shù)中的最大值設(shè)為0int*max<int*q1,int*q2>{return*q1>*q2?q1:q2;}main<>{ intx=5,y=9,*p;p=max<&x,&y>;*p=0;printf<"x=%d,y=%d\n",x,y>;}函數(shù)指針〔用一個(gè)指針變量存儲(chǔ)一個(gè)函數(shù)入口地址,即指向函數(shù),這樣的指針稱函數(shù)指針定義形式為:類型符<*函數(shù)指針變量><>;如:int<*p><>;使函數(shù)指針指向一個(gè)函數(shù),一般的格式為:函數(shù)指針變量=函數(shù)名;如:p=max;調(diào)用函數(shù)。一般格式為:<*函數(shù)指針><實(shí)參表>如:c=<*p><a,b>;[例7.5]通過函數(shù)指針調(diào)用函數(shù)intmax<intx,inty>{returnx>y?x:y;}intmin<intx,inty>{returnx<y?x:y;}main<>{ inta=5,b=9,c,d;int<*p><>;//定義函數(shù)指針p=max;//指向函數(shù) c=<*p><a,b>;//調(diào)用函數(shù)p=min; d=<*p><a,b>; printf<"Max=%d,Min=%d\n",c,d>;}指針與數(shù)組的關(guān)系一個(gè)變量有地址,一個(gè)數(shù)組包含若干個(gè)數(shù)組元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址,這個(gè)地址就可以用指針來實(shí)現(xiàn)存儲(chǔ)。如有:inta[5],*p,*q;p=&a[0];q=&a[2];*p=5;*q=8;則a[0]和a[2]值分別為5和8。C語言規(guī)定:數(shù)組名代表數(shù)組的首地址,也就是第一個(gè)元素a[0]的地址。因此:a&a[0]。若:p=a; /*或?qū)懗蓀=&a[0];*/則:p+1&a[1]*<p+1>a[1]p+i&a[i]*<p+i>a[i]引用一個(gè)數(shù)組元素,可以用下標(biāo)法或指針法。通過數(shù)組的起始地址計(jì)算數(shù)組元素的地址,即*<a+i>或*<p+i>形式。用指針變量處理數(shù)組元素,即p++形式:main<>{ inta[5]={3,8,9,2,6},i,*p; p=a;for<i=0;i<5;i++>{ printf<"%d",*p>; p++;}}[例7.5]指針運(yùn)算符"*"與增1運(yùn)算符"++"同時(shí)作用于一個(gè)指針變量的情況。main<>{inti,a[]={11,22,33,44,55,66},*p=a;printf<"%3d,",<*p>++>;11printf<"%3d,",*p++>;12printf<"%3d,",*++p>;33printf<"%3d\n",++*p>;34for<p=a;p<a+6;p++>printf<"%3d,",*p>;122234445566printf<"\n">;getch<>;}2、通過指針引用二維數(shù)組元素<1>二維數(shù)組和數(shù)組元素的地址inta[3][4]={{1,2,3,4},{6,7,8,9},{11,12,13,14}}
a[0]a[1]a[2]則a<=>&a[0],a+1<=>&a[1],a+2<=>&a[2]對(duì)于一維數(shù)組名為a[0],則a[0]<=>&a[0][0],a[0]+1<=>&a[0][1].所以第0行第1列的地址表示為a[0]+1.所以a[i]+j是第i行第j列元素的地址&a[i][j],又a[i]等價(jià)于*<a+i>所以在二維數(shù)組里*<a+i>+j和a[i]+j都表示地址。<2>通過地址訪問二維數(shù)組假設(shè)有如下定義:inta[3][5],i,j;則二維數(shù)組a中的任一元素a[i][j],可以用下述表達(dá)式之一來引用表示:*<a[i]+j>由上述知a[i]+j是第i行第j列元素的地址,因此*<a[i]+j>與a[i][j]等價(jià)*<*<a+i>+j>,*<a+i>+j也是第i行第j列元素的地址,因此*<*<a+i>+j>與a[i][j]等價(jià)<*<a+i>>[j],相當(dāng)于先取*<a+i>+j地址,再取其內(nèi)的值,所以與a[i][j]等價(jià)*<&a[0][0]+5*i+j>由于每行5個(gè)元素,&a[0][0]+5*i+j就是第i行第j列元素的地址,因此*<&a[0][0]+5*i+j>也與a[i][j]等價(jià)*<&a[0][0]+5*i+j><=>*<a[0]+5*i+j><=>*<*a+5*i+j><=>a[i][j]<3>通過指向元素指針訪問二維數(shù)組如:inta[3][5],i,j,*p;p=&a[0][0];或p=*a;或p=a[0];則a[i][j]等價(jià)于*<p+i*5+j>等價(jià)于p[i*5+j]數(shù)組名作函數(shù)參數(shù)的指針解釋[例7.7]對(duì)形參數(shù)組改為指針。intarray_max<intx[],intn>{ inti,m=x[0]; for<i=1;i<n;i++> if<m<x[i]>m=x[i]; returnm;}main<>{ inta[]={8,7,55,23,49},max; max=array_max<a,5>; printf<"Max=%d\n",m>;}指針數(shù)組一般說明形式為:類型符*數(shù)組名[數(shù)組大小];如:int*p[5];[例7.8]指針數(shù)組的簡單使用main<>{ inta[5]={1,3,5,7,9}; int*num[5],i;for<i=0;i<5;i++>num[i]=&a[i];for<i=0;i<5;i++>printf<"%d",*num[i]>;}多級(jí)指針有:inta,*p=&a;若使:q=&p;則q是就指向指針變量的指針變量,稱q為二級(jí)指針。二級(jí)指針定義的一般形式為:類型符**指針變量名;如:int**q;則:a=5;或*p=5;或**q=5;結(jié)果相同。同樣可以有三級(jí)、四級(jí)指針等等,我們把二級(jí)及二級(jí)以上的指針稱為多級(jí)指針。[例7.9]數(shù)組的輸出main<>{ inta[5]={1,3,5,7,9}; int*b[5],i,**p; for<i=0;i<5;i++> b[i]=&a[i]; p=b; for<i=0;i<5;i++> printf<"%d",**p++>;}指針與字符串字符串的表示形式char字符數(shù)組名[數(shù)組元素個(gè)數(shù)]如有: charstr[80]="China",*p=str; printf<"%s",str>;printf<"%s",p>;printf<"%s","China">;用%s輸入/輸出字符串時(shí),只需要知道字符串的開始地址即可。使p指向字符串的開始地址,可寫成:char*p="China";字符指針作函數(shù)參數(shù)[例7.11]將例7.10改用函數(shù)完成intStrLen<char*s>{intn=0;while<*s++>n++;returnn;}main<>{ charstr[]="abc",*p; intlen; p=str;len=StrLen<p>;printf<"%s的長度為%d\n",p,len>;}運(yùn)行結(jié)果:abc的長度為3返回字符串的函數(shù)[例7.13]改寫字符串復(fù)制函數(shù)char*StrCopy<char*str1,char*str2>{char*p=str1;while<<*str1=*str2>!=’\0’>{str1++;str2++;}returnp;}main<>{chars1[80],s2[]="abc";printf<"復(fù)制之后的字符串:%s\n",StrCopy<s1,s2>>;}復(fù)制之后的字符串:abc字符指針數(shù)組[例7.14]將若干字符串輸出main<>{ char*str[]={"Word","Excel","Outlook"};inti; for<i=0;i<3;i++>printf<"%s\n",str[i]>;}[例7.15]使用多級(jí)指針完成若干字符串輸出main<>{ char*str[]={"Word","Excel","Outlook"};char**p; for<p=str;p<str+3;p++>printf<"%s\n",*p>;}輸出:WordExcelOutlook字符指針與字符數(shù)組的討論占用的內(nèi)存空間不同charstr[80]; char*p;初始化的概念不同charstr[80]="abc"; char*p="abc";數(shù)組名是常量,字符指針是變量str=str+2; /*Error*/ p=str+2; /*Ok*/字符數(shù)組有一塊確定的、連續(xù)的內(nèi)存單元;而指針只有一個(gè)字的內(nèi)存單元。所以:charstr[80],*p;scanf<"%s",str>; /*Ok*/scanf<"%s",p>; /*error*/指針數(shù)據(jù)類型小結(jié)各種指針定義小結(jié)intx; 整型變量xint*p; 整型指針pinta[n]; a是一個(gè)整型數(shù)組,有n個(gè)元素int*p[n]; p是一個(gè)整型指針數(shù)組,有n個(gè)元素intf<>; f是一個(gè)函數(shù),返回一個(gè)整型值int*p<>; p是一個(gè)函數(shù),返回一個(gè)整型變量的地址int<*p><>; p為一個(gè)指針,它可以指向一個(gè)整型函數(shù)int**p; p為一個(gè)二級(jí)指針,它存儲(chǔ)另一個(gè)指針的地址指針運(yùn)算小結(jié)1、指針變量加、減一個(gè)整數(shù),指的是移到向上或向下一個(gè)單位的地址例如:p++、p--、p+i、p-i、p+=i、p-=i等。2、指針變量賦值如有:inta,*p1,*p2,array[10],max<>,<*p3><>;則:p1=&a; /*取變量a的地址,使p1指向a*/ p2=array; /*p2指向array數(shù)組的起始地址*/ p1=&array[4]; /*p1指向array[4]元素*/ p3=max; /*p3指向max函數(shù)*/ p2=p1; /*p2的指向與p1的指向相同*/ p1=2000; /*error,類型不同*/ a=p2; /*error,類型不同*/三名主義:〔考試的重點(diǎn)數(shù)組名:表示第一個(gè)元素的地址。數(shù)組名不可以自加自減,它是地址常量名。函數(shù)名:表示該函數(shù)的入口地址。
字符串常量名:表示第一個(gè)字符的地址。一維數(shù)組的重要概念:
對(duì)a[10]這個(gè)數(shù)組的討論。
1、a表示數(shù)組名,是第一個(gè)元素的地址,也就是元素a[0]的地址。
2、a是地址常量,所以只要出現(xiàn)a++,或者是a=a+2賦值的都是錯(cuò)誤的。
3、a是一維數(shù)組名,所以它是列指針,也就是說a+1是跳一列。
對(duì)a[3][3]的討論。
1、a表示數(shù)組名,是第一個(gè)元素的地址,也就是元素a[0][0]的地址。
2、a是地址常量,所以只要出現(xiàn)a++,或者是a=a+2賦值的都是錯(cuò)誤的。
3、a是二維數(shù)組名,所以它是行指針,也就是說a+1是跳一行。
4、a[0]、a[1]、a[2]也都是地址常量,不可以對(duì)它進(jìn)行賦值操作,同時(shí)它們都是列指針a[0]+1,a[1]+1,a[2]+1都是跳一列。
5、注意a和a[0]、a[1]、a[2]是不同的,它們的基類型是不同的。前者是一行元素,后三者是一列元素。二維數(shù)組做題目的技巧:
如果有a[3][3]={1,2,3,4,5,6,7,8,9}這樣的題目。
步驟一:把他們寫成:第一列第二列第三列
a[0]1
2
3
->第一行
a[1]
4
5
6—>第二行
a[2]
7
8
9->第三行
步驟二:這樣作題目間很簡單:*<a[0]+1>我們就知道是第一行的第一個(gè)元素往后面跳一列,那么這里就是a[0][1]元素,所以是1。
*<a[1]+2>我們就知道是第二行的第一個(gè)元素往后面跳二列。那么這里就是a[1][2]元素,所以是6。
一定記住:只要是二維數(shù)組的題目,一定是寫成如上的格式,再去做題目,這樣會(huì)比較簡單。
數(shù)組的初始化,一維和二維的,一維可以不寫,二維第二個(gè)一定要寫
inta[]={1,2}合法。inta[][4]={2,3,4}合法。但inta[4][]={2,3,4}非法。二維數(shù)組中的行指針
inta[1][2];
其中a現(xiàn)在就是一個(gè)行指針,a+1跳一行數(shù)組元素。
搭配〔*p[2]指針
a[0],a[1]現(xiàn)在就是一個(gè)列指針。a[0]+1跳一個(gè)數(shù)組元素。搭配*p[2]指針數(shù)組使用
還有記住脫衣服法則:
a[2]
變成
*〔a+2
a[2][3]變成*〔a+2[3]再可以變成
*〔*〔a+2+3
這個(gè)思想很重要!不能對(duì)字符數(shù)組整體賦值,而字符指針允許整體賦值指針p可以p++〔后移或p--〔前移或p+i,而數(shù)組名a只能用,a+i〔注意一維數(shù)組和二維數(shù)組的區(qū)別兩個(gè)地址〔指針可以比較大小,后面大前面??;可以相減表示差幾個(gè)元素對(duì)字符數(shù)組或字符串的操作一般用:while<*s>或while<s[i]>或for<p=a;p<a+n;p++>{…;s++}{…;i++}注意:新生成的字符串是否有結(jié)束符’\0’10.字符串打印:chars1[10],s2[6][10],*s3;一維數(shù)組:printf<"%s",……>;二維數(shù)組:printf<"%s",……>;結(jié)構(gòu)體、共用體和枚舉問題:類型名,成員名,變量名問題:類型名,成員名,變量名sizeof<structstaff>的值?用變量表示worker的年份用指針p表示worker的年份6.結(jié)構(gòu)類型struct[staff]{ charno[5]; charname[10]; charsex; struct {intyear;intmonth;intday;}birthday; floatwages[2];}※通過指針訪問結(jié)構(gòu)體變量的成員①結(jié)構(gòu)變量名.成員名〔名字引用;②結(jié)構(gòu)指針->成員名〔指針引用;③〔*結(jié)構(gòu)指針.成員名〔將指針轉(zhuǎn)化為名字引用;『結(jié)構(gòu)變量占用內(nèi)存情況』結(jié)構(gòu)變量的各個(gè)成員分量在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,所占內(nèi)存大小為結(jié)構(gòu)中每個(gè)成員的占用內(nèi)存的長度之和。聯(lián)合類型〔union表示法同結(jié)構(gòu)類型首地址起共用允許對(duì)第一個(gè)成員賦值共用體變量任何時(shí)刻-只有一個(gè)成員存在共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)〔即字節(jié)數(shù)取最大的共用體變量的定義形式有三種〔類似結(jié)構(gòu)體變量的定義枚舉類型enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};枚舉型僅適應(yīng)于取值有限的數(shù)據(jù)。取值表中的值稱為枚舉元素,枚舉元素是常量。在C編譯器中,按定義的順序取值0、1、2、...。所以枚舉元素可以進(jìn)行比較,比較規(guī)則是:序號(hào)大者為大。例如,上例中的Sun=0、Mon=1、……、Sat=6,所以Mon>Sun、Sat最大。枚舉元素的值也是可以人為改變的:定義時(shí)由程序指定。例如,如果enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};
則Sun=7,Mon=1,從Tue=2開始,依次增1。定義別名typedeftypenewname;用戶定義的類型名已有數(shù)據(jù)類型名類型定義語用戶定義的類型名已有數(shù)據(jù)類型名類型定義語句關(guān)鍵字eg:typedefintX,Y[10],*Z;Xa;Yb;Zc;其中a,b,c各代表什么?整型變量a,整型數(shù)組b[10],整型指針變量c。第九章文件操作與位運(yùn)算6個(gè)位運(yùn)算符:位左移<<、位右移>>、按位取反~、位與&、位或|、位異或^。位運(yùn)算題目計(jì)算是先要把十進(jìn)制化成二進(jìn)制,再做位運(yùn)算。在沒有舍去數(shù)據(jù)的時(shí)候,<<左移一位表示乘以2;>>右移一位表示除以2。所謂"文件"一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合。按文件中數(shù)據(jù)的組織形式來分,可分為文本文件〔即ASCII碼文件和二進(jìn)制文件。文件操作的過程:對(duì)磁盤文件的操作必須"先打開,后讀寫,最后關(guān)閉"。文件的打開方式打開方式含義及說明"r"以只讀方式打開一個(gè)文本文件,只允許讀數(shù)據(jù)"w"以只寫方式打開或建立一個(gè)文本文件,只允許寫數(shù)據(jù)"a"以追加方式打開一個(gè)文本文件,并在文件末尾寫數(shù)據(jù)"r+"以讀寫方式打開一個(gè)文本文件,允許讀和寫"w+"以讀寫方式打開或建立一個(gè)文本文件,允許讀寫"a+"以讀寫方式打開一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)"rb"以只讀方式打開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)"wb"以只寫方式打開或建立一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)"ab"以追加方式打開一個(gè)二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)"rb+"以讀寫方式打開一個(gè)二進(jìn)制文件,允許讀和寫"wb+"以讀寫方式打開或建立一個(gè)二進(jìn)制文件,允許讀和寫"ab+"以讀寫方式打開一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)常用文件操作函數(shù)函數(shù)名功能調(diào)用舉例返回值fopen打開文件文件指針名=fopen<文件名,使用文件方式>;FILE*fp;fp=fopen<"c:\\tc\\source.dat","r">;fclose〔關(guān)閉文件fclose<文件指針變量>;fclose<fp>;成功關(guān)閉返回值為0,如果關(guān)閉出錯(cuò)為EOF<-1>。ferror出錯(cuò)檢測(cè)ferror<文件指針變量>;ferror<fp>;/*默認(rèn)初值為零*/返回0,表示未出錯(cuò);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 微笑服務(wù)的心得體會(huì)5篇
- 電力競(jìng)賽心得體會(huì)
- 2022科學(xué)新課標(biāo)的心得體會(huì)(8篇)
- 青海省海北藏族自治州(2024年-2025年小學(xué)五年級(jí)語文)統(tǒng)編版開學(xué)考試(下學(xué)期)試卷及答案
- 高考文綜區(qū)域地理教案 東亞精講精練 內(nèi)含考向指導(dǎo) 內(nèi)容精析 典例剖析 高考鏈接
- 上海市市轄區(qū)(2024年-2025年小學(xué)五年級(jí)語文)人教版期中考試(下學(xué)期)試卷及答案
- 四年級(jí)數(shù)學(xué)(小數(shù)加減運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案匯編
- 高中化學(xué)《弱電解質(zhì)的電離》說課稿
- s版二年級(jí)語文下冊(cè)全冊(cè)教案
- 湘教版小學(xué)美術(shù)三年級(jí)上冊(cè)全冊(cè)教案
- (零模)徐州市2024~2025學(xué)年上學(xué)期高三期中考試 英語試卷(含答案)
- 四川公安基礎(chǔ)知識(shí)模擬5
- 英語KET官方樣題Test1- Test 2
- 吉林省松原市長嶺縣長嶺鎮(zhèn)2023-2024學(xué)年四年級(jí)上學(xué)期期中道德與法治試卷
- 2023年四川農(nóng)信(農(nóng)商行)招聘筆試真題
- 《紀(jì)念白求恩》說課課件 2024-2025學(xué)年統(tǒng)編版語文七年級(jí)上冊(cè)
- 財(cái)務(wù)管理考試試題及答案
- 汽車機(jī)械基礎(chǔ)-說課課件
- 【課件】第七單元能源的合理利用與開發(fā)新版教材單元分析-九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識(shí) CCAA年度確認(rèn) 試題與答案
- 8《安全記心上》第1課時(shí) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治三年級(jí)上冊(cè)統(tǒng)編版
評(píng)論
0/150
提交評(píng)論