第8章-指針課件_第1頁
第8章-指針課件_第2頁
第8章-指針課件_第3頁
第8章-指針課件_第4頁
第8章-指針課件_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第八章指針北京郵電大學(xué)出版社第八章指針北京郵電大學(xué)出版社內(nèi)容提要指針與指針變量指針與函數(shù)指針與數(shù)組指針與字符串指針數(shù)組與命令行參數(shù)內(nèi)容提要指針與指針變量基本概念--地址地址:內(nèi)存單元的編號(圖示)數(shù)據(jù)在內(nèi)存中的存儲(圖示)

定義變量-->分配內(nèi)存單元(將變量名轉(zhuǎn)換為地址)-->賦值綜合圖示基本概念--地址地址:內(nèi)存單元的編號(圖示)基本概念--指針變量的三要素:名字、類型與值每個(gè)變量都通過變量名與相應(yīng)的存儲單元相連系,具體分配哪些單元給變量,由C編譯系統(tǒng)完成變量名到對應(yīng)內(nèi)存單元地址的變換變量分配存儲空間的大小由類型決定變量的值則是指相應(yīng)存儲單元的內(nèi)容數(shù)據(jù)的讀寫根據(jù)變量的地址讀寫內(nèi)存單元的內(nèi)容指針(pointer)(圖示)變量的地址基本概念--指針變量的三要素:名字、類型與值基本概念—間接訪問直接存儲:根據(jù)變量地址存取變量值變量地址內(nèi)存單元

間接存儲:根據(jù)指針變量存取變量值指針變量變量地址內(nèi)存單元變量訪問圖示基本概念—間接訪問直接存儲:根據(jù)變量地址存取變量值指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例k=i;--直接訪問

k=*i_pointer;--間接訪問10例k=i;k=*i_pointer;指針變量…...…...2000200420062005整型基本概念—指向指針和指針變量指針:是一個(gè)變量的地址指針變量:用來存儲變量地址(指針)的變量指向變量的地址(指針)變量的內(nèi)存單元基本概念—指向指針和指針變量指針變量--(1)變量的指針:變量的地址指針變量:用來存儲變量地址的變量指針變量另一變量指針與指針變量指針變量--(1)變量的指針:變量的地址指針變量--(2)指針變量的定義一般形式:[存儲類型]

數(shù)據(jù)類型*指針名;合法標(biāo)識符指針變量本身的存儲類型指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量不是‘*’運(yùn)算符例int*p1,*p2;float*q;staticchar*name;注意:1、int*p1,*p2;

與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時(shí)所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值指針變量--(2)指針變量的定義合法標(biāo)識符指針變量本身的存儲指針變量--(3)指針變量的類型決定了它所能指向的變量的類型指針變量存放的是所指向的某個(gè)變量的地址值,而普通變量保存的是該變量本身的值指針變量并不固定指向一個(gè)變量,可指向同類型的不同變量兩個(gè)指針運(yùn)算符:&*&:取變量的地址p=&i;*:取指針?biāo)赶虻膬?nèi)容j=*p;指針變量--(3)指針變量的類型決定了它所能指向的變量的類型指針變量--(4)

注意:*與&具有相同的優(yōu)先級,結(jié)合方向從右到左。這樣,&*p即&(*p),是對變量*p取地址,它與&a等價(jià);p與&(*p)等價(jià),a與*(&a)等價(jià)…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer

=

&i

=

&(*i_pointer)i

=

*i_pointer

=

*(&i)指針變量--(4)注意:*與&具有相同的優(yōu)先級,結(jié)指針運(yùn)算--(1)指針變量的初始化一般形式:[存儲類型]

數(shù)據(jù)類型*指針名=初始地址值;賦給指針變量,不是賦給目標(biāo)變量例inti;int*p=&i;變量必須已說明過類型應(yīng)一致例int*p=&i;inti;例inti;int*p=&i;int*q=p;用已初始化指針變量作初值例main(){inti;staticint*p=&i;..............}(

)不能用auto變量的地址去初始化static型指針指針運(yùn)算--(1)指針變量的初始化賦給指針變量,例in指針運(yùn)算--(2)指針的賦值運(yùn)算將變量地址值賦給指針變量(舉例)相同類型的指針變量之間的賦值(舉例)

綜合示例1指針運(yùn)算--(2)指針的賦值運(yùn)算綜合示例1例main(){inti=10;int*p;

*p=i;printf(“%d”,*p);}危險(xiǎn)!例main(){inti=10,k;int*p;

p=&k;*p=i;printf(“%d”,*p);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量i10指針變量p200120022003隨機(jī)例main()危險(xiǎn)!例main()指針變指針運(yùn)算--(3)零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:int*p=0;

p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態(tài)比較

例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量指針運(yùn)算--(3)零指針與空類型指針p指向地址為0的單元,#指針運(yùn)算--(4)指針的算術(shù)運(yùn)算加減運(yùn)算:一個(gè)指針可以加、減一個(gè)整數(shù)n,其結(jié)果與指針?biāo)笇ο蟮臄?shù)據(jù)類型有關(guān)。指針變量的值(地址)增加或減少“n×sizeof(指針類型)”

(舉例)指針運(yùn)算--(4)指針的算術(shù)運(yùn)算指針運(yùn)算--(5)指針的關(guān)系運(yùn)算和基本類型變量一樣,指針能進(jìn)行關(guān)系運(yùn)算例如:p>q,p<q,p==q,p!=q,p>=q等指針的關(guān)系運(yùn)算在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè)p、q是指向同一數(shù)組的兩個(gè)指針,執(zhí)行p>q的運(yùn)算,其含義為,若表達(dá)式結(jié)果為真(非0值),則說明p所指元素在q所指元素之后。或者說q所指元素離數(shù)組第一個(gè)元素更近些。指針進(jìn)行關(guān)系運(yùn)算之前,指針必須初始化,另外,只有同類型的指針才能進(jìn)行比較指針運(yùn)算--(5)指針的關(guān)系運(yùn)算指針進(jìn)行關(guān)系運(yùn)算之前,指針必指針運(yùn)算--(6)指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),但有前置后置、先用后用的考慮,務(wù)請小心。

例如:

inta[10],*p=a,*x;

x=p++;/*x第一個(gè)元素分量,p指向第二個(gè)元素*/x=++p;/*x、p均指向數(shù)組的第二個(gè)分量*/*

p++相當(dāng)于*(p++)。*(p++)與(*p)++含義不同,前者表示地址自增,后者表示當(dāng)前所指向的數(shù)據(jù)自增。指針運(yùn)算--(6)指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),2.*&a的含意是什么?(答:a)3.(*p)++相當(dāng)于什么?(答:a++)思考:1.若有定義inta,*p;執(zhí)行了“p=&a”,則:“&*p”的含意是什么?(答:相當(dāng)于&a)2.*&a的含意是什么?思考:(答:相當(dāng)于&a)多級指針二級指針-說明形式:-(舉例)

存儲類型數(shù)據(jù)類型**指針名多級指針二級指針存儲類型數(shù)據(jù)類型**指針名多級指針定義:指向指針的指針一級指針:指針變量中存放目標(biāo)變量的地址p1&p2&i3P2(指針變量)i(整型變量)例int**p1;

int*p2;inti=3;p2=&i;p1=&p2;**p1=5;二級指針:指針變量中存放一級指針變量的地址例int*p;

inti=3;p=&i;*p=5;&i3P(指針變量)i(整型變量)一級指針單級間接尋址二級指針一級指針目標(biāo)變量二級間接尋址多級指針p1&p2&i3P2(指針變量)i(整型變量)例定義形式:[存儲類型]

數(shù)據(jù)類型**指針名;如char**p;例inti,**p;p=&i;(

)//p是二級指針,不能用變量地址為其賦值指針本身的存儲類型最終目標(biāo)變量的數(shù)據(jù)類型*p是p間接指向?qū)ο蟮牡刂?*p是p間接指向?qū)ο蟮闹道齣nti=3;

int*p1;

int**p2;p1=&i;p2=&p1;**p=5;ip1p23&i&p1**p2,*p1*p2多級指針例三級指針int***p;

四級指針char****p;定義形式:[存儲類型]數(shù)據(jù)類型**指針名;例i指針作為函數(shù)參數(shù)函數(shù)行形參為指針變量,指針變量作實(shí)參(舉例1)函數(shù)形參為指針變量,變量地址作為實(shí)參(舉例2)

注1:在函數(shù)中進(jìn)行對形參指針的交換不能影響到實(shí)參(舉例3)

注2:函數(shù)中交換值時(shí)不能使用無初值的指針變量作臨時(shí)變量。(舉例4)指針作為函數(shù)參數(shù)函數(shù)行形參為指針變量,指針變量作實(shí)參指針函數(shù)指針函數(shù):是指返回值為指針的函數(shù)定義形式:類型名*函數(shù)名(參數(shù)表列)

;例如:int*fun(inta,intb) {

函數(shù)體語句

}程序舉例

指針函數(shù)指針函數(shù):是指返回值為指針的函數(shù)指向函數(shù)的指針(1)一個(gè)函數(shù)包括一組指令序列存儲在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這個(gè)函數(shù),這樣通過這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這種指針變量稱為指向函數(shù)的指針變量指向函數(shù)的指針變量定義:數(shù)據(jù)類型(*指針變量名)()

如:int(*p)();用指針調(diào)用函數(shù)的形式:(*指針變量)(實(shí)參表)程序舉例指向函數(shù)的指針的使用步驟指向函數(shù)的指針(1)一個(gè)函數(shù)包括一組指令序列存儲在某一段內(nèi)存指向函數(shù)的指針(2)注意:用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒有參數(shù)類型說明,C編譯系統(tǒng)也無法進(jìn)行類型檢查,因此,在使用這種形式調(diào)用函數(shù)時(shí)要特別小心。實(shí)參一定要和指針?biāo)负瘮?shù)的形參類型一致。函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指針每次指向不同的函數(shù)時(shí),可執(zhí)行不同的函數(shù)來完成不同的功能指向函數(shù)的指針(2)注意:指向一維數(shù)組的指針(1)數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地址指向數(shù)組的指針的定義方法與指向基本類型變量的指針的定義方法相同,例如:inta[10]={1,3,5,7,9};int*p;p=&a[2];(把數(shù)組元素a[2]的地址賦給指針變量p)p=a;(把數(shù)組的首地址賦給指針變量p)指向一維數(shù)組的指針(1)數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組指向一維數(shù)組的指針(2)C語言規(guī)定:數(shù)組名代表數(shù)組首地址,是一個(gè)地址常量。因此,下面兩個(gè)語句等價(jià):p=&a[0];p=a;在定義指針變量的同時(shí)可賦初值:inta[10],*p=&a[0];(或int*p=a;)等價(jià)于:int*p;p=&a[0];兩句。指向一維數(shù)組的指針(2)C語言規(guī)定:數(shù)組名代表數(shù)組首地址,是指向一維數(shù)組的指針(3)指向數(shù)組的指針變量p&a[0]13151719pa[0]:a[9]p[9]a+0p+1

或a+1p+9

或a+9*(a+9)或*(p+9)指向一維數(shù)組的指針(3)指向數(shù)組的指針變量p&a[0]131指向一維數(shù)組的指針(4)通過指針引用數(shù)組元素

*p=5;表示對p當(dāng)前所指的數(shù)組元素賦以一個(gè)值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡單地加1)。p+1意味著使p的原值(地址)加d個(gè)字節(jié)(d為一個(gè)數(shù)組元素所占的字節(jié)數(shù))。如果p的初值為&a[0],則:p+i和a+i就是a[i]的地址,或者說它們指向a數(shù)組的第i個(gè)元素(圖示)。*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即a[i]。指向數(shù)組的指針變量也可以帶下標(biāo),如p[i]與*(p+i)、a[i]等價(jià)指向一維數(shù)組的指針(4)通過指針引用數(shù)組元素指向一維數(shù)組的指針(5)例:用三種方法輸出數(shù)組全部元素。(1)下標(biāo)法main(){ inta[10]; inti; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d",a[i]);}指向一維數(shù)組的指針(5)例:用三種方法輸出數(shù)組全部元素。指向一維數(shù)組的指針(6)(2)通過數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值main(){ inta[10]; inti; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d",*(a+i));}指向一維數(shù)組的指針(6)(2)通過數(shù)組名計(jì)算數(shù)組元素地址,輸指向一維數(shù)組的指針(7)(3)用指針變量指向數(shù)組元素main(){ inta[10]; int*p,i; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(p=a;p<(a+10);p++) printf("%d",*p

);}三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而使用指針法則執(zhí)行效率更高圖示指向一維數(shù)組的指針(7)(3)用指針變量指向數(shù)組元素三種方法指向一維數(shù)組的指針(8)使用指針變量時(shí),應(yīng)注意:指針變量可實(shí)現(xiàn)使本身的值改變。P++合法;但a++不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運(yùn)行中是固定不變的。)要注意指針變量的當(dāng)前值main(){inta[10];int*p,i;p=a;for(;p<a+10;p++)scanf("%d",p);printf("\n");for(;p<(a+10);p++)printf("%d",*p);}不能&p增加:p=a;指向一維數(shù)組的指針(8)使用指針變量時(shí),應(yīng)注意:main()指向一維數(shù)組的指針(9)*p++相當(dāng)于*(p++),因?yàn)?與++優(yōu)先級相同,且結(jié)合方向從右向左,其作用是先獲得p指向變量的值,然后執(zhí)行p=p+1;*(p++)與*(++p)意義不同,后者是先p=p+1,再獲得p指向的變量值若p=a,則輸出*(p++)是先輸出a[0],再讓p指向a[1];輸出*(++p)是先使p指向a[1],再輸出p所指的a[1](*p)++表示的是將p指向的變量值+1舉例指向一維數(shù)組的指針(9)*p++相當(dāng)于*(p++),因?yàn)?與例inta[]={1,2,3,4,5,6,7,8,9,10},*p=a,i;

數(shù)組元素地址的正確表示:

(A)&(a+1)(B)a++(C)&p(D)&p[i]

數(shù)組名是地址常量p++,p--(

)a++,a--(

)a+1,*(a+2)()例inta[]={1,2,3,4,5,6,7,8,9指向二維數(shù)組的指針a[0]a[1]a[2]aa+1a+2chara[3][4];*a*(a+1)*(a+2)數(shù)組元素是長度為4的數(shù)組a、a+1、a+2都是指針,它們的基類型是長度為4的字符數(shù)組,它們與下面定義的指針p同類型char(*p)[4];a是一個(gè)長度為3的數(shù)組指向二維數(shù)組的指針a[0]a[1]a[2]aa+1a+2ch對于二維數(shù)組:(1)a是數(shù)組名,包含三個(gè)元素

a[0],a[1],a[2](2)每個(gè)元素a[i]

又是一個(gè)一維數(shù)組,包含4個(gè)元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]基類型行指針與列指針a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1對于二維數(shù)組:aa+1a+2*(*(a+0)+1)*(a[0對二維數(shù)組inta[3][4],有a-----二維數(shù)組的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i

&a[i],表示第i行首地址,指向行a[i]

*(a+i)

&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2對二維數(shù)組inta[3][4],有a+i=&a[i]inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1

(2)&a[1][0](3)a[1](4)*(a+1)(5)(int*)(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2inta[3][4];a[0][0]a[0][1]a[1表示形式含義a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值表示形式含義a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),指向二維數(shù)組的指針變量(1)指向數(shù)組元素的指針變量。這種變量的定義與普通指針變量定義相同,其類型與元素?cái)?shù)值類型相同如:int*p,a[3][4]; p=&a[1][2];指向一維數(shù)組(二維數(shù)組的一行)的指針,也稱行指針定義形式為:類型標(biāo)識符(*指針變量名)[元素個(gè)數(shù)]如:int(*p)[4];

指向二維數(shù)組的指針變量(1)指向數(shù)組元素的指針變量。這種變量指向二維數(shù)組的指針變量(2)注意:(1)int(*p)[4];定義一個(gè)指針變量p,p指向包含4個(gè)元素的一維數(shù)組。(2)p+i與*(p+i)的區(qū)別:

p+i是指向第i行的指針(第i行的首地址);

*(p+i)是指向第i行第1個(gè)元素的地址;兩者數(shù)值相等,但含義不同:p+i的增值將以行長為單位,而*(p+i)增值將以元素長度為單位指向二維數(shù)組的指針變量(2)注意:指向二維數(shù)組的指針變量(3)即:p+i+1將指向第i行再下一行的首地址,而*(p+i)+1將指向第i行首元素的下一個(gè)元素地址。(見下圖)設(shè)inta[3][4],(*p)[4];p=a;P,aP+1P+2a[0]a[1]a[2]如果p先指向a[0],則p+1不是指向a[0][1],而是指向a[1]指向二維數(shù)組的指針變量(3)即:p+i+1將指向第i行再下一字符串的指針表示法指向字符串的指針稱字符指針 定義形式:char*指針名利用指針來對字符串進(jìn)行操作:通過在定義時(shí)初始化指針變量使指針指向一個(gè)字符串

程序舉例

用指針變量實(shí)現(xiàn)對字符串的訪問程序舉例

字符串的指針表示法指向字符串的指針稱字符指針字符串?dāng)?shù)組字符串?dāng)?shù)組:數(shù)組中的每個(gè)元素都是一個(gè)存放字符串的數(shù)組字符串?dāng)?shù)組可以用一個(gè)二維字符數(shù)組來存儲例如:charlanguage[3][10]

數(shù)組的第一個(gè)下標(biāo)決定字符串的個(gè)數(shù),第二個(gè)下標(biāo)是字符串的最大長度(實(shí)際最多9個(gè)字符,‘\0’占一位置)

程序舉例字符串?dāng)?shù)組字符串?dāng)?shù)組:數(shù)組中的每個(gè)元素都是一個(gè)存放字符串的數(shù)指針數(shù)組(1)指針數(shù)組是指針變量的集合

定義形式:類型標(biāo)識符*數(shù)組名[數(shù)組長度說明]

如:int*p[10];

內(nèi)存存儲示例字符數(shù)組和指針變量,需要注意事項(xiàng):字符數(shù)組中每個(gè)元素可存放一個(gè)字符,而字符指針變量存放字符串首地址,千萬不要認(rèn)為字符串是存放在字符指針變量中的對字符數(shù)組而言,與普通數(shù)組一樣,不能對其進(jìn)行整體賦值,只能給各個(gè)元素賦值,而字符指針變量可以直接用字符串常量賦值舉例

指針數(shù)組(1)指針數(shù)組是指針變量的集合指針數(shù)組(2)注意:

(1)字符數(shù)組中每個(gè)元素可存放一個(gè)字符,而字符指針變量存放字符串首地址,而不是存放在字符指針變量中。

(2)對字符數(shù)組,與普通數(shù)組一樣,不能對其進(jìn)行整體賦值,只能給各個(gè)元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,若有如下定義:

chara[10];

char*p;

則語句a=”computer”;是非法的,因?yàn)閿?shù)組名a是一個(gè)常量指針,不能對其賦值。只能對各個(gè)元素分別賦值:

a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’;

但語句:p=”computer”;是合法的。指針數(shù)組(2)注意:

(1)字符數(shù)組中每個(gè)元素可指針數(shù)組與命令行參數(shù)(1)在操作系統(tǒng)命令狀態(tài)下可以輸入程序或命令使其運(yùn)行,稱命令行狀態(tài)。輸入的命令(或運(yùn)行程序)及該命令(或程序)所需的參數(shù)稱為命令行參數(shù)如:copyfdfscopy是文件拷貝命令,fd、fs是命令行參數(shù)main函數(shù)是可以有參數(shù)的,但與普通函數(shù)不同帶形參的main()函數(shù)的一般形式是:main(intargc,char*argv[])形參argc記錄命令行中字符串的個(gè)數(shù),argv是一個(gè)字符型指針數(shù)組,每一個(gè)元素順序指向命令行中的一個(gè)字符串指針數(shù)組與命令行參數(shù)(1)在操作系統(tǒng)命令狀態(tài)下可以輸入程序或指針數(shù)組與命令行參數(shù)(2)main()函數(shù)的形參與實(shí)參main()函數(shù)由系統(tǒng)自動(dòng)調(diào)用,而不是被程序內(nèi)部的其它函數(shù)調(diào)用,main()函數(shù)所需的實(shí)參不可能由程序內(nèi)部得到,而是由系統(tǒng)傳送main()函數(shù)所需的實(shí)參與形參的傳遞方式也與一般函數(shù)的參數(shù)傳遞不同,實(shí)參是在命令行與程序名一同輸入,程序名和各實(shí)際參數(shù)之間都用空格分隔格式為:執(zhí)行程序名參數(shù)1參數(shù)2……參數(shù)n形參argc為命令行中參數(shù)的個(gè)數(shù)(包括執(zhí)行程序名),其值大于或等于1,而不是象普通C語言函數(shù)一樣接受第一個(gè)實(shí)參形參argv是一個(gè)指針數(shù)組,其元素依次指向命令行中以空格分開的各字符串即:第一個(gè)指針argv[0]指向的是程序名字符串,argv[1]指向參數(shù)1,argv[2]指向參數(shù)2,……,argv[n]指向參數(shù)舉例指針數(shù)組與命令行參數(shù)(2)main()函數(shù)的形參與實(shí)參綜合示例例輸入一個(gè)十進(jìn)制正整數(shù),將其轉(zhuǎn)換成二進(jìn)制、八進(jìn)制、十六進(jìn)制數(shù)輸出分析:將十進(jìn)制數(shù)n轉(zhuǎn)換成r進(jìn)制數(shù)的方法是:n除以r取余數(shù)作為轉(zhuǎn)換后的數(shù)的最低位。若商不為0,則商繼續(xù)除以r,取余數(shù)作為次低位……,以此類推,直到商為0為止對于十六進(jìn)制數(shù)中大于9的六個(gè)數(shù)字是用A,B,C,D,E,F來表示所得余數(shù)序列轉(zhuǎn)換成字符保存在字符數(shù)組a中字符‘0’的ascii碼是48,故余數(shù)0~9只要加上48就變成字符‘0’~‘9’了;余數(shù)中大于9的數(shù)10~15要轉(zhuǎn)換成字母,加上55就轉(zhuǎn)換成‘A’、‘B’、‘C’、‘D’、‘E’、‘F’了由于求得的余數(shù)序列是低位到高位,而屏幕顯示先顯示高位,所以輸出數(shù)組a時(shí)要反向進(jìn)行綜合示例例輸入一個(gè)十進(jìn)制正整數(shù),將其轉(zhuǎn)換成二進(jìn)制、八進(jìn)制、綜合示例(2)#include"stdio.h"main(){inti,radix;longn;chara[33];voidtrans10_2_8_16(charb[],longm,intbase);printf("\nInputradix(2,8,16):");/*輸入轉(zhuǎn)換基數(shù)*/scanf("%d",&radix);printf("\nInputapositiveinteger:");/*輸入被轉(zhuǎn)換的數(shù)*/scanf("%ld",&n);

trans10_2_8_16(a,n,radix);for(i=strlen(a)-1;i>=0;i--)/*逆向輸出字符串*/printf("%c",*(a+i));/**(a+i)即a[i]*/puts("\n");}綜合示例(2)#include"stdio.h"voidtrans10_2_8_16(char*p,longm,intbase){intr;while(m>0){r=m%base;/*求余數(shù)*/if(r<10)*p=r+48;/*小于10的數(shù)轉(zhuǎn)換成字符后送p指向的元素*/else*p=r+55;/*數(shù)10~15轉(zhuǎn)換成A~F后送p指向的元素*/m=m/base;p++;/*指針下移*/}*p='\0';/*在最后加上字符串結(jié)束標(biāo)志*/}輸入:Inputradix(2,8,16):16Inputapositiveinteger:435678輸出:6A5DEvoidtrans10_2_8_16(char*p,lo本章結(jié)束再見!同學(xué)們:本章結(jié)束再見!同學(xué)們:*(p+i)a數(shù)組a[0]a[1]a[2]a[i]a[9]pp+1,a+1p+i,a+ip+9,a+9綜上所述,引用一個(gè)數(shù)組元素有二法:(1)下標(biāo)法:如a[i]形式;(2)指針法:如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。*(p+i)a數(shù)組a[0]a[1]a[2]a[i]a[9]p變量與地址程序中:inti;

floatk;

內(nèi)存中每個(gè)字節(jié)有一個(gè)編號-----地址ik

編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對程序中數(shù)據(jù)存儲空間的抽象…...…...2000200120022005內(nèi)存02003變量與地址程序中:inti;內(nèi)存中每個(gè)字節(jié)有一個(gè)指針與指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針指針變量

變量的內(nèi)容

變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量指針與指針變量…...…...200020042006200main(){inta=18,*p=&a;

printf(“a=%d\n”,a);printf(“*p=%d\n”,*p);}a=18*p=18指針變量的初始化4000pa(4000)18*pmain()指針變量的初始化4000pa(4000)18*內(nèi)存的地址編號0000101111000001000000001110101101110000200220032004200520060000………內(nèi)存的地址編號00001011110000010000000內(nèi)存中數(shù)據(jù)的存儲(1)main(){inti=1,j=2,k=3;printf("%d,%d,%d",i,j,k);}F9開始編譯內(nèi)存中數(shù)據(jù)的存儲(1)main()F9開始編譯內(nèi)存中數(shù)據(jù)的存儲(2)inti=1,j=2,k=3;(編譯)2021467-18-2921ijk20022004200620082010Ctrl+F9運(yùn)行內(nèi)存中數(shù)據(jù)的存儲(2)inti=1,j=2,k=內(nèi)存中數(shù)據(jù)的存儲(3)inti=1,j=2,k=3;(運(yùn)行)123-2921ijk20022004200620082010內(nèi)存中數(shù)據(jù)的存儲(3)inti=1,j=2,k=3內(nèi)存中數(shù)據(jù)的存儲(4)inti=1,j=2,k=3;(實(shí)際情況)ijk200220032004200520060000000100000000000000100000000000000011000000002007內(nèi)存中數(shù)據(jù)的存儲(4)inti=1,j=2,k=內(nèi)存中數(shù)據(jù)的存儲(6)

(程序結(jié)束,恢復(fù)原狀)2021467-18-292120022004200620082010內(nèi)存中數(shù)據(jù)的存儲(6)(程序結(jié)束,恢復(fù)原狀)20變量的訪問例

i=3;-----直接訪問指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問20變量的訪問例i=3;-----直接202直接訪問inti=1,j=2,k=3;1-2921i2002(&i)2004200620082010202直接訪問inti=1,j=2,k=3;1-2921指針—變量的地址inti=1,j=2,k=3;123-29212002(&i)2004(&j)2006(&k)20082010ijk指針—變量的地址inti=1,j=2,k=3間接訪問inti=1;p=&i;2002(&i)p20023000(&p)1ip2002p(3000)

1i(2002)

p(3000)

2002間接訪問inti=1;p=&i;2指向inti=1;i2002(&i)2004200620001指向inti=1;i2002指針運(yùn)算inti=1,j;int*p;p=&i,j=*p;i2002(&i)200430001jp20021指針運(yùn)算inti=1,j;in指針變量的類型inti=5;floatj=2.5;int*point;point=&i;(語法正確)point=&j;(語法錯(cuò)誤)指針變量的類型inti=5;指針的賦值運(yùn)算(1)inta,b,*pa,*pb;a=12;b=18;pa=&a;pb=&bapabpb&apa12a*pa&b18b*pbpb指針的賦值運(yùn)算(1)inta,b,*pa,*pb;ap指針的賦值運(yùn)算(2)&apa12a*pa&b18b*pbpb注意:只有相同類型的指針變量才能相互賦值,如pf=pa;是不允許的。因?yàn)閜a是整型指針,pf是浮點(diǎn)型指針inta,b,*pa,*pb;float*pf;a=12;b=18;pa=&a;pb=&b;pb=pa;指針的賦值運(yùn)算(2)&apa12a*pa&b18b*pbpb例輸入兩個(gè)數(shù),并使其從大到小輸出main(){int*p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}運(yùn)行結(jié)果:a=5,b=9max=9,min=5…...…...指針變量p1

指針變量p20002008200220042006

指針變量p2

整型變量b

整型變量a5200692008200620082006例輸入兩個(gè)數(shù),并使其從大到小輸出main()運(yùn)行結(jié)果:a例:指針的算術(shù)運(yùn)算

int*p,a=2,b=4,c=6;p=&a;p=p+2246a(4000)b(4002)c(4004)2464000p2464004pa(4000)b(4002)c(4004)a(4000)b(4002)c(4004)對于不同基類型的指針,指針變量“加上”或“減去”一個(gè)整數(shù)n所移動(dòng)的字節(jié)數(shù)是不同的。例如:floata[10],*p=a,*x;p=p+3;/*實(shí)際上是p加上3*4個(gè)字節(jié)賦給x,x依然指向數(shù)組的第三個(gè)分量*/加減運(yùn)算常用于數(shù)組的處理。對指向一般數(shù)據(jù)的指針,加減運(yùn)算無實(shí)際意義。例如:inta[10],*p=a,*x;x=p+3;/*實(shí)際上是p加上3*2個(gè)字節(jié)賦給x,x指向數(shù)組的第三個(gè)分量*/例:指針的算術(shù)運(yùn)算246a(4000)b(4002)c(40多級指針#inlude<stdio.h>mian(){

inta=22,*p,**pp;p=&a;pp=&p;printf(“*p=%d\n”,*p);printf(“**pp=%d\n”,**pp);}假設(shè)變量a的地址為4000,指針p的地址為4100,二級指針pp的地址為4800。程序執(zhí)行結(jié)果:*p=22**pp=22&p=4100&a=400022pp(4800)p(4100)a(4000)多級指針#inlude<stdio.h>程序執(zhí)行結(jié)果:&pswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);

pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}…...20002008200A200220042006200C200E2010...59整型變量a

整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例

將數(shù)從大到小輸出swap(int*p1,int*p2)…...20swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}…...20002008200A200220042006200C200E2010...59整型變量a

整型變量b(main)指針pointer_1指針pointer_22000200259例

將數(shù)從大到小輸出運(yùn)行結(jié)果:9,5地址傳遞swap(int*p1,int*p2)…...20指針做函數(shù)參數(shù)(2)#inlude<stdio.h>main(){

inta,b;voidswap(int*p1,int*p2);scanf(“%d%d”,&a,&b);swap(&a,&b);printf(“\na=%d,b=%d\n=”,a,b);}程序執(zhí)行結(jié)果:輸入:1222

輸出:a=22,b=12

voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}指針做函數(shù)參數(shù)(2)#inlude<stdio.h>程序執(zhí)運(yùn)行結(jié)果:5,9例

將數(shù)從大到小輸出swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("%d,%d",*pointer_1,*pointer_2);}…...20002008200A200220042006200C200E2010...59整型a

整型b(main)pointer_1pointer_22000200220002002COPY(swap)指針p1指針p2指針p****2000地址傳遞20002002結(jié)論:在函數(shù)中進(jìn)行對行參指針的交換不會影響到實(shí)參數(shù)運(yùn)行結(jié)果:5,9例將數(shù)從大到小輸出swap(int*p1swap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);

pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf("\n%d,%d\n",a,b);}運(yùn)行結(jié)果:9,9編譯警告!結(jié)果不對!intx;int*p=&x;x;例

將數(shù)從大到小輸出…...20002008200A200220042006200C200E2010...59整型變量a

整型變量b(main)指針pointer_1指針pointer_2200020029920002002COPY(swap)指針p1指針p2指針p****假設(shè)2000指針變量在使用前必須賦值!swap(int*p1,int*p2)運(yùn)行結(jié)果:9,9指針函數(shù)#include〈stdio.h〉voidmain(){inta,b,*p;int*min(intx,inty);/*函數(shù)提前引用說明*/int*minp(int*,int*);/*函數(shù)提前引用說明*/scanf(″%d,%d″,&a,&b);p=min(a,b);/*返回最小值指針*/printf(″\nmin=%d″,*p);/*輸出最小值*/p=minp(&a,&b);/*注意minp的形參類型*/printf(″\nminp=%d″,*p);/*輸出最小值*/}程序執(zhí)行結(jié)果:輸入:1510

輸出:min=10minp=10int*min(intx,inty){

if(x<y)return(&x);/*x的地址作為指針函數(shù)的返回值*/

elsereturn(&y);}int*minp(int*x,int*y){int*q;q=*x<*y?x:y;return(q);

/*指針變量q作為指針函數(shù)的返回值*/}

返回值的類型要與函數(shù)類型一致指針函數(shù)#include〈stdio.h〉程序執(zhí)行結(jié)果:i指向函數(shù)的指針(1)#include〈stdio.h〉#defineM8voidmain(){floatsumf,sump;floata[M]={11,2,-3,4.5,5,69,7,80};float(*p)();/*定義指向函數(shù)的指針p*/floatmax(floata[],intn);/*函數(shù)聲明*/p=max;/*函數(shù)名(函數(shù)入口地址)賦給指針p*/sump=(*p)(a,M);/*用指針方式調(diào)用函數(shù)*/sumf=max(a,M);/*用函數(shù)名調(diào)用max()*/printf(″sump=%.2f\n″,sump);printf(″sumf=%.2f\n″,sumf);}程序執(zhí)行結(jié)果:輸出:sump=80.00sumf=80.00floatmax(floata[],intn){intk;floats;s=a[0];for(k=0;k<n;k++)if(s<a[k])s=a[k];returns;}指向函數(shù)的指針(1)#include〈stdio.h〉程序指向函數(shù)的指針(2)步驟一:定義一個(gè)指向函數(shù)的指針變量,形如-

float(*p)()步驟二:為函數(shù)指針賦值,格式如下-

p=函數(shù)名;

注意:賦值時(shí)只需給出函數(shù)名,不要帶參數(shù)步驟三:通過函數(shù)指針調(diào)用函數(shù),函數(shù)格式如下-

s=(*p)(實(shí)參)指向函數(shù)的指針(2)步驟一:定義一個(gè)指向函數(shù)的指針變量,形如利用定義時(shí)初始化指針變量voidmain(){ char*p=″computer″;

printf(″%s″,p);}利用定義時(shí)初始化指針變量voidmain()指針變量對字符串的訪問#include〈string,h〉voidmain(){ inti,n; chara[]=″computer″; charb[10],*p,*q; p=a; q=b; scanf(″%d″,&n); if(strlen(a)>=n)p+=n-1;/*指針指向要復(fù)制的第一個(gè)字符*/ for(;*p!=′\0′;p++,q++) *q=*p; *q=′\0′;/*字符串以′\0′結(jié)尾*/ printf(″Stringa:%s\n″,a); printf(″Stringb:%s\n″,b);}輸入:3↙輸出:computermputer指針變量對字符串的訪問#include〈string,h〉字符串?dāng)?shù)組charlanguage[3][10

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論