




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1C語言基礎(chǔ)與提高2intafloatba=3;b=5;若將p中地址換成3AC0(B的地址),則可以通過p來訪問B3a3AB05b3AC03AB0p變量變量的訪問方式直接訪問間接訪問:定義一個(gè)變量p,存放a的地址,通過p來訪問a§2.1指針第2頁/共24頁第1頁/共24頁3如:p為指針變量,它存放整型變量a的首地址,
則稱指針變量p指向整型變量a。3a3AB05b3AC03AB0p指針變量存放地址的變量指針變量的類型指針?biāo)赶騼?nèi)存單元中存放的數(shù)據(jù)的類型§2.1指針第3頁/共24頁第2頁/共24頁4int*p,a,b;p=&a;int*p1,*p2,a;p1=&a;p2=p1;int*p1;p1=NULL;或p1=0;指針變量指針變量的賦值用變量地址給指針變量賦值(使用到地址符&)變量的類型必須與指針變量類型相同用相同類型的指針變量賦值若不賦值,則指針變量的值是隨機(jī)的賦空值NULLint*p1p1=0X1234§2.1指針第4頁/共24頁第3頁/共24頁5①printf():從右到左計(jì)算參數(shù)②(*q)++和*(q++)兩者不同
內(nèi)容++地址++若有:inta=5,*p=&a;寫出下面表達(dá)式的結(jié)果,并找出等價(jià)的表達(dá)式&*p*&a(*p)++&a
a*p++*(p++)a++牢記下列等價(jià)式:int*p=&a;&*pp*&aa
&ap*pa要求:*后一定是指針變量;§2.1指針指針變量指針變量的運(yùn)算規(guī)則&與*優(yōu)先級(jí)相同,右結(jié)合示例說明…...…...200020002004200820122apq2000voidmain()
{inta=2,*p=&a,*q=&a;printf(“%d,%d\n”,*p++,*(q++));p=&a,q=&a;printf(“%d,%d\n”,*p,(*q)++);}結(jié)果:22
32第5頁/共24頁第4頁/共24頁6#include<stdio.h>voidswap(intx,inty){intt;t=x;x=y;y=t;}voidmain(){inta=3,b=5;swap(a,b);printf(“%d%d\n”,a,b);}#include<stdio.h>voidswap(int*x,int*
y){intt;t=*
x;
*
x=*
y;
*
y=t;}voidmain(){inta=3,b=5;swap(&a,&b);printf(“%d%d\n”,a,b);}voidswap(int*x,int*
y){int*t;t=x;x=y;
y=t;}voidswap(int*x,int*
y){int*t;
*
t=*
x;
*
x=*
y;
*
y=*
t;}*t未賦初值,系統(tǒng)會(huì)隨機(jī)給值,可能指向一個(gè)已有數(shù)據(jù)的存儲(chǔ)單元,再執(zhí)行交換,就會(huì)破壞已有數(shù)據(jù)?!?.1指針指針變量指針變量作函數(shù)參數(shù)示例:編寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換第6頁/共24頁第5頁/共24頁7§2.1指針指針數(shù)組定義:數(shù)據(jù)類型標(biāo)識(shí)符*數(shù)組名[元素個(gè)數(shù)];如:int*pi[10];由于“[]”比“*”的優(yōu)先級(jí)高,所以數(shù)組名先與“[元素個(gè)數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個(gè)元素是指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”說明指針的目標(biāo)變量的數(shù)據(jù)類型。指針數(shù)組是一個(gè)數(shù)組,它的每個(gè)元素都是指針數(shù)組指針(指向一維數(shù)組的)定義:數(shù)據(jù)類型標(biāo)識(shí)符(*變量名)[元素個(gè)數(shù)];如:inta[][4]={0,1,2,3,10,11,12,13,20,21,22,23};int(*lp)[4]=a;“
*
”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個(gè)數(shù)?!皵?shù)據(jù)類型標(biāo)識(shí)符”定義一維數(shù)組元素的類型。數(shù)組指針是一個(gè)指針,它指向一個(gè)數(shù)組注意:數(shù)組名是一個(gè)常量,是一個(gè)指向數(shù)組首元素的指針。第7頁/共24頁第6頁/共24頁8整型值整型變量整型變量地址一級(jí)指針變量一級(jí)指針變量地址二級(jí)指針變量§2.1指針二級(jí)指針定義:數(shù)據(jù)類型標(biāo)識(shí)符**指針變量名;如:inta,*p=&a,**pp=&p;說明:“
**指針變量名
”相當(dāng)于*(*指針變量名),在括號(hào)中定義了一個(gè)指針變量,括號(hào)外的“*”,說明指針變量(即二級(jí)指針)的目標(biāo)變量是一個(gè)指針類型數(shù)據(jù),“數(shù)據(jù)類型標(biāo)識(shí)符”是目標(biāo)變量(即一級(jí)指針)所指向的數(shù)據(jù)的類型,也就是最終目標(biāo)變量的類型a的內(nèi)容a&ap&ppp、*p、**pp、*pp應(yīng)用示例寫一個(gè)函數(shù)交換兩個(gè)字符串voidswap(char*pp1,char*pp2){ char*p;p=pp1; pp1=pp2; pp2=p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(p1,p2); printf("%s%s",p1,p2);}voidswap(char*pp1,char*pp2){
char*p;*p=*pp1; *pp1=*pp2; *pp2=*p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(p1,p2); printf("%s%s",p1,p2);}voidswap(char**pp1,char**pp2){ char*p;p=*pp1; *pp1=*pp2; *pp2=p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(&p1,&p2); printf("%s%s",p1,p2);}第8頁/共24頁第7頁/共24頁9§2.1指針指針型函數(shù)定義:數(shù)據(jù)類型標(biāo)識(shí)符*函數(shù)名(
形參表);
如:char*max(char*p,char*q);因?yàn)椤?)”優(yōu)先級(jí)比“*”高,所以“函數(shù)名”與右側(cè)的括號(hào)“()”結(jié)合,表示是一個(gè)函數(shù),“
數(shù)據(jù)類型標(biāo)識(shí)符*
”則定義了函數(shù)的返回值類型。示例char*max(char*p,char*q){charszTemp[1024];if(strcmp(p,q)<0){strcpy(szTemp,q);}else{strcpy(szTemp,p);}returnszTemp;}staticcharszTemp[1024];char*max(char*p,char*q){returnstrcmp(p,q)<0?q:p;}第9頁/共24頁第8頁/共24頁10§2.1指針函數(shù)指針定義:數(shù)據(jù)類型標(biāo)識(shí)符(
*
函數(shù)指針變量名
)(
形參表);
如:int(*CALLBACK)(void*pPara);調(diào)用形式:(*函數(shù)指針變量名)(實(shí)參表);如:intiRet=(*CALLBACK)(p);“
*
函數(shù)指針變量名
”必須用圓括號(hào)括起來,否則就成為聲明一個(gè)指針型函數(shù)了。“(*函數(shù)指針變量名)”右側(cè)的括號(hào)“()”表示指針變量所指向的目標(biāo)是一個(gè)函數(shù),“數(shù)據(jù)類型標(biāo)識(shí)符”是定義指針變量所指向的函數(shù)的類型。函數(shù)名代表函數(shù)的起始地址(即該函數(shù)的程序代碼段在內(nèi)存中所占用的存儲(chǔ)空間的首地址,也稱函數(shù)入口),是一個(gè)指針常量。應(yīng)用示例實(shí)現(xiàn)一個(gè)回調(diào)函數(shù),并調(diào)用之intcalcSum(inti1,inti2){returni1+i2;}intcalcProduct(inti1,inti2){returni1*i2;}typedefint(*CALL_BACK)(int,int);voidmain(){CALL_BACKfunc;func=calcSum;printf("Thesumof3and4is:%d",(*func)(3,4));func=calcProduct;printf("Theproductof3and4is:%d",(*func)(3,4));}第10頁/共24頁第9頁/共24頁11作用:在對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類宏定義
#define文件包含
#include條件編譯
#if--#else--#endif等格式:“#”開頭占單獨(dú)書寫行語句尾不加分號(hào)§2.2編譯預(yù)處理第11頁/共24頁第10頁/共24頁12如#defineYES1
#defineNO0
if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);1
宏定義不帶參數(shù)宏定義一般形式#define宏名(標(biāo)識(shí)符)[宏體](字符串)功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)宏展開:預(yù)編譯時(shí),用宏體來替換宏名---不作語法檢查如#defineYES1
#defineNO0
#definePI3.1415926
#defineOUTprintf(“Hello,World”);說明:1.定義位置:任意(一般在函數(shù)外面)2.作用域:從定義命令到文件結(jié)束3.#undef可終止宏名作用域格式:#undef宏名例#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域5.宏定義可嵌套,不能遞歸例#defineMAXMAX+10()4.引號(hào)中的內(nèi)容與宏名相同也不置換例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開:printf(“2*PI=%f\n”,3.14159*2);6.宏定義中使用必要的括號(hào)()例#defineWIDTH80#defineLENGTH
WIDTH+40var=LENGTH*2;宏展開:var=80+40*2;()()例#defineWIDTH80#defineLENGTH
WIDTH+40var=LENGTH*2;宏展開:var=WIDTH+40*2var=80+40*27.只是簡(jiǎn)單替代,標(biāo)識(shí)符不占內(nèi)存空間8.一般宏名使用大寫字母形式.第12頁/共24頁第11頁/共24頁13帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體例#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”說明:1.宏展開:不僅宏體替換,還要進(jìn)行形參替換2.宏體及各形參外一般應(yīng)加括號(hào)()3.宏名與參數(shù)之間不能有空格例#defineS(a,b)a*b
………..
area=S(3,2);宏展開:area=3*2;不能加空格例#definePOWER(x)x*x
x=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:z=((x+y)*(x+y));①②③第13頁/共24頁第12頁/共24頁14#include<stdio.h>#defineSTR(s) #s#defineSCIENTIFIC_NOTATION(a,b) (int)(a##e##b)#defineVERSION(major,minor) major##.##minorintmain(){ printf(STR(itisastring)); //輸出:itisastring
printf(“%d\n”,SCIENTIFIC_NOTATION(2,3));//輸出:2000
printf(“\n%.1f\n”,VERSION(5,3)); //輸出:5.3
return0;}# 把宏參數(shù)變?yōu)橐粋€(gè)字符串,## 把兩個(gè)宏參數(shù)粘合在一起.\ 續(xù)行符4.符號(hào)“#”、“##”和“\”#defineDECLARE_CALLBACK_EX1(id,arg1_type)\staticgint_onSignaledEx1##id(GtkWidget*pWidget,\ arg1_typearg1,gpointerpPara)\{\returnCmdTarget::invoke(pWidget,\(gpointer)arg1,pPara,CmdTarget::CBK_EX);\};第14頁/共24頁第13頁/共24頁15#include<stdio.h>#defineTOW(2)#defineMUL(a,b)(a*b)intmain(){//printf("%d*%d=%d\n",(2),(2),((2)*(2)));printf("%d*%d=%d\n",TOW,TOW,MUL(TOW,TOW));}#include<stdio.h>#defineSTR(s) #s#defineSAMPLE itisastringintmain(){ printf(STR(SAMPLE)); //printf("SAMPLE"); return0;}#include<stdio.h>#define_STR(s) #s#defineSTR(s) _STR(s)#defineSAMPLE itisastringintmain(){ printf(STR(SAMPLE)); //printf(“itisastring"); return0;}注意:當(dāng)宏參數(shù)是另一個(gè)宏的時(shí)候
,凡宏定義里有用'#'或'##'的地方宏參數(shù)不會(huì)再展開第15頁/共24頁第14頁/共24頁16#defineMAX(x,y)(x)>(y)?(x):(y)…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}<>5.用宏定義可以實(shí)現(xiàn)和函數(shù)同樣的功能第16頁/共24頁第15頁/共24頁17帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間編譯前程序運(yùn)行時(shí)參數(shù)類型無類型問題定義實(shí)參,形參類型程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間第17頁/共24頁第16頁/共24頁182
文件包含功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cBABA處理過程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯<>直接按標(biāo)準(zhǔn)目錄搜索(存放C的庫函數(shù)頭文件)“”先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄可指定路徑第18頁/共24頁第17頁/共24頁19被包含文件內(nèi)容源文件(*.c)頭文件(*.h)宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說明等文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c第19頁/共24頁第18頁/共24頁20例文件包含舉例/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))#include<stdio.h>#include“c:\powers.h"#defineMAX_POWER10voidmain(){intn;printf("numberexp1\texp2\texp3\texp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t%3d\t%4d\t%5d\n",n,sqr(n),cube(n),quad(n));}第20頁/共24頁第19頁/共24頁213
條件編譯概念:在某個(gè)條件成立的情況下才對(duì)某一部分進(jìn)行編譯。三種格式:格式二形式:作用:如果標(biāo)識(shí)符沒有被#define命令定義過,則對(duì)程序段1進(jìn)行編譯,否則對(duì)程
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 私人教練與學(xué)員健身成果合同
- 租賃住宅合同范本簡(jiǎn)版
- 南京勞動(dòng)合同模板合同范本(勞務(wù)派遣律師定制)
- 資產(chǎn)收購合同
- 歷史文化名城拍攝許可合同
- 廣告宣傳合同范文
- 商品供應(yīng)合同范本
- 批發(fā)業(yè)渠道管理與拓展考核試卷
- D打印技術(shù)在汽車輕量化設(shè)計(jì)的應(yīng)用考核試卷
- 工業(yè)控制計(jì)算機(jī)在智能機(jī)器人編程與控制中的實(shí)踐考核試卷
- 護(hù)理分級(jí)標(biāo)準(zhǔn)
- 水池維修改造方案
- 國(guó)網(wǎng)陜西省電力有限公司高校畢業(yè)生招聘考試試題及答案
- 非公司企業(yè)法人章程范本樣本
- 《高溫熔融金屬吊運(yùn)安全規(guī)程》(AQ7011-2018)
- 電機(jī)與拖動(dòng)(高職)全套教學(xué)課件
- 散裝液體危險(xiǎn)貨物申報(bào)員培訓(xùn)講義
- 山東春季高考-汽車專業(yè)必備考試題庫(學(xué)校)
- 返家鄉(xiāng)社會(huì)實(shí)踐
- 小學(xué)生網(wǎng)絡(luò)安全省公開課金獎(jiǎng)全國(guó)賽課一等獎(jiǎng)微課獲獎(jiǎng)?wù)n件
- 2022小學(xué)語文新課程標(biāo)準(zhǔn)模擬測(cè)試題六份答案
評(píng)論
0/150
提交評(píng)論