




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本章目錄7.1指針的概念7.2指針變量和函數(shù)7.3指針變量和數(shù)組7.4指針數(shù)組指針是C語(yǔ)言的一種數(shù)據(jù)類型,在C語(yǔ)言中處于重要的地位。正確、靈活地應(yīng)用指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、動(dòng)態(tài)地分配內(nèi)存、方便地使用字符串、高效地使用數(shù)組。熟練地應(yīng)用指針可以使C程序簡(jiǎn)潔、緊湊、應(yīng)用效果好。7.1指針的概念指針的概念包括指針和指針變量的關(guān)系、指針和函數(shù)、指針和數(shù)組的使用等。7.1.1指針和指針變量的關(guān)系
一個(gè)變量的地址稱為該變量的指針。1.地址指內(nèi)存中存儲(chǔ)單元的編號(hào):1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(容量為1字節(jié))。為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編號(hào)就是存儲(chǔ)單元的“地址”。每個(gè)存儲(chǔ)單元都有一個(gè)唯一的地址。2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。內(nèi)存單元的編號(hào)(地址),與變量名對(duì)應(yīng)。內(nèi)存單元的內(nèi)容:即變量的值。7.1指針的概念到目前我們學(xué)過(guò)的基本數(shù)據(jù)類型int型、float型、double型、char型等,內(nèi)存分配的存儲(chǔ)單元分別是2個(gè)字節(jié)、4個(gè)字節(jié)、8個(gè)字節(jié)、1個(gè)字節(jié)等。前面我們已經(jīng)介紹了變量的概念,每個(gè)變量都有自己的存儲(chǔ)地址。定義變量的同時(shí),把存儲(chǔ)單元的起始地址作為變量的地址(指針)。指針變量指專門存放變量地址的變量。為了更好的理解指針和指針變量,下面舉例說(shuō)明:inta;編譯系統(tǒng)會(huì)為它分配2個(gè)字節(jié)存儲(chǔ)單元即1000H和1001H,1000H就是變量a的地址。如果有一個(gè)變量存放變量a的地址,那這個(gè)變量就是指針變量pa。如圖7-17.1指針的概念我們可以直接給變量a賦初值2,即通過(guò)變量a的地址訪問(wèn)a,這種方式稱“直接訪問(wèn)”。當(dāng)然還可以通過(guò)指針變量pa訪問(wèn)變量a,這種訪問(wèn)方式稱“間接訪問(wèn)”。10001000H1001H變量a指針變量pa……圖7-17.1指針的概念7.1.2指針變量定義定義指針變量的一般形式為基類型*指針變量名指針變量與普通變量類似,在程序中若要使用指針變量,必須先進(jìn)行定義后使用。例如:
int*p1,i;(定義p1為指向整型變量的指針變量)char*p2,c;(定義p2為指向字符型變量的指針變量)
float*p3,f;(定義p3為指向?qū)嵭妥兞康闹羔樧兞浚﹊nt、char、float分別稱為指針變量p1、p2、p3的“基類型”,7.1指針的概念
“基類型”只是指指針變量所指變量的類型,不是指針變量的類型。指針變量只是存放指向變量的地址,由于內(nèi)存地址都是整型常量,所以指針變量在內(nèi)存中只占2個(gè)字節(jié)。由上可知,定義指針變量的同時(shí)也可以定義其他類型的變量,它們?cè)谡Z(yǔ)法上的差別僅在于前者在變量名多了一個(gè)“*”號(hào)。要弄清楚指針變量的含義和作用,還必須弄清楚以下幾個(gè)概念。1.指針變量名:指針變量名不包括“*”號(hào),因?yàn)椤?”號(hào)不能用于標(biāo)識(shí)符。因此,在*p1中,“*”和p1不是一個(gè)整體,不要把*p2、*p3等看作指針變量名,指針變量名是p2、p3等。2.指針變量的值:其初值不定,當(dāng)初始化或賦值后,其值表示另一個(gè)變量的地址。7.1指針的概念7.1.3和指針有關(guān)運(yùn)算符指針運(yùn)算包括兩個(gè)運(yùn)算符1.取地址運(yùn)算符(&)單目運(yùn)算符(&)用來(lái)求出運(yùn)算對(duì)象的地址,利用它可以把一個(gè)變量的地址賦給指針變量??梢允褂貌煌姆椒ńo一個(gè)指針變量賦值。例如有定義和賦值:
inta=5,*pa;pa=&a;將變量a的地址賦給指針變量pa,也就是使pa指向了變量a。7.1指針的概念2.指針運(yùn)算符(*)也叫間接訪問(wèn)運(yùn)算符,單目運(yùn)算符,當(dāng)它和指針變量參與運(yùn)算時(shí),表示指針變量所指的內(nèi)容,即實(shí)現(xiàn)“取內(nèi)容”操作。inta=5,b,*pa;pa=&a;
若b=*pa-1;則b=4;注意:*在不同的地方作用有時(shí)是不一樣的。若出現(xiàn)在變量定義的部分,*說(shuō)明pa是指針變量;出現(xiàn)在其他操作部分中*pa表示pa所指向的變量a。3.取地址運(yùn)算符(&)和指針運(yùn)算符(*)互為逆運(yùn)算。7.1指針的概念7.1.4、指針變量賦值(初始化)可以使用不同的方法給一個(gè)指針變量賦值。
1.通過(guò)取地址運(yùn)算符(&)獲得地址值例如有如下定義和賦值:
inta=5,*p,*q;p=&a;
它建立了如圖7-2所示的邏輯關(guān)系
pa&a5圖7-2因此當(dāng)有語(yǔ)句:p=&a;時(shí),scanf((″%d″,&a);和scanf(″%d″,p)是等價(jià)的。7.1指針的概念2.通過(guò)指針變量獲得地址值可以通過(guò)賦值運(yùn)算,如圖7-3。把一個(gè)指針變量中的地址值賦給另一個(gè)指針變量,從而使這兩個(gè)指針變量指向同一地址。例如,若有上面的定義,則語(yǔ)句:
q=p;使指針變量q中也存放了變量a的地址,也就是說(shuō)指針變量p和q都指向了整型變量a。使用時(shí)應(yīng)注意:賦值號(hào)兩邊指針變量的基類型必須相同。paq
&a5
&a圖7-37.1指針的概念3.給指針變量賦“空”值
p=NULL;NULL是在stdio.h頭文件中定義的預(yù)定義符,因此在使用NULL時(shí),應(yīng)該在程序的前面出現(xiàn)預(yù)定義行:#include″stdio.h″。NULL的代碼值為0,應(yīng)當(dāng)注意:1.指針變量只能存放地址,不能把一個(gè)整型量賦給指針變量。如p=5;是錯(cuò)的。應(yīng)該通過(guò)取地址運(yùn)算符“&”把一個(gè)地址賦給指針變量。2.應(yīng)避免使用沒(méi)有賦值的指針變量,沒(méi)有賦值的指針變量雖不會(huì)導(dǎo)致編譯出錯(cuò),但可能導(dǎo)致無(wú)法預(yù)料的災(zāi)難性后果。我們將在后面的例子中講解。7.1指針的概念7.1.5指針變量的引用
講過(guò)和指針有關(guān)的&和*兩種運(yùn)算符,通過(guò)它們就可以應(yīng)用指針變量了。例7.1通過(guò)指針變量訪問(wèn)變量#include<stdio.h>main(){inta,b,*p1,*p2;a=10;b=20;p1=&a;/*把變量a的地址賦給指針變量p1*/p2=&b;/*把變量b的地址賦給指針變量p2*/printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);}7.1指針的概念程序的運(yùn)行結(jié)果為:[說(shuō)明]1.在程序的第二行定義了兩個(gè)指針變量p1和p2,但它們并未指向任何整型變量。在程序的第4、5兩行將兩個(gè)整型變量a和b的地址分別賦給了指針變量p1和p2,使p1和p2分別指向了a和b,如圖7-4所示。
p1ap2b&a&a&a&a*p1*p1圖7-47.1指針的概念
2.程序的第7行輸出的是*p1和*p2,即指針變量p1、p2所指變量,也就是變量a和b。因此,程序中的兩個(gè)printf函數(shù)的功能是相同的。
3.在程序中兩次出現(xiàn)*p1和*p2,它們的意義是不同的。第2行出現(xiàn)的*p1和*p2表示定義了兩個(gè)指針變量,它們前面的“*”表示p1和p2是兩個(gè)指針變量。而第7行出現(xiàn)的*p1和*p2表示的是p1和p2所指向的變量,即a和b。
4.注意不要將程序的第4、5行寫成*p1=&a; *p2=&b;因?yàn)槭菍和b的地址賦給指針變量p1和p2。在C語(yǔ)言中,運(yùn)算符“*”的不同作用示例。7.1指針的概念
例7.2#include<stdio.h>main(){inta=5,b,*pa;/*符號(hào)*用于定義指向整型變量的指針變量pa*/pa=&a;b=*pa;/**pa在賦值符號(hào)右邊,取指針變量pa所指向的變量a的內(nèi)容*/*pa=a*7;/**pa在賦值符號(hào)左邊,將a*7的結(jié)果存入指針變量pa所指向的變量a中*/printf(“a=%d,b=%d*pa=%d\n”,a,b,*pa);/*在雙引號(hào)中的*號(hào)作為普通字符*/printf("adda=%p,addpa=%p\n",&a,&pa);}7.1指針的概念程序的運(yùn)行結(jié)果為:
注意:a和pa的地址不一定是上面的結(jié)果,依據(jù)當(dāng)時(shí)運(yùn)行結(jié)果而定。由例子,可歸納出符號(hào)“*”在C語(yǔ)言中有以下4種用法:1.用作一個(gè)普通ASCII字符,如上述程序中第6行語(yǔ)句在雙引號(hào)中的*號(hào)作為普通字符。2.在算術(shù)表達(dá)式中用作雙目乘法運(yùn)算符,如程序第5行中的a*7。3.用于定義指針變量,如程序第2行中的*pa,定義pa為一指針變量。這里的“*”不是運(yùn)算符,表示變量pa為指針變量。
7.1指針的概念4.在地址表達(dá)式中用作“間接訪問(wèn)”運(yùn)算符,此處的“*”號(hào)是一個(gè)單目運(yùn)算符,用于“左存右取”由地址表達(dá)式所指向的變量的內(nèi)容。如程序第4、5行中的*pa和第6行中雙引號(hào)外邊的*pa中的“*”號(hào)。由程序注釋可知,第5行中的*pa的作用和第4、6兩行中的*pa的作用是不相同的。即,當(dāng)*pa出現(xiàn)在賦值運(yùn)算符“=”的左邊時(shí),代表將右邊的值存入由指針變量pa所指向的地址單元;而在其他位置作“間接訪問(wèn)”運(yùn)算符時(shí),代表取出由指針變量pa所指向的地址單元的內(nèi)容。符號(hào)“*”的4種不同作用,容易混淆的是后兩種作用,大家可從它們所處的不同位置加以區(qū)分。這里請(qǐng)讀者牢記,“*”后必須跟一個(gè)地址表達(dá)式,指針變量pa代表一個(gè)地址,所以*pa是有意義;而普通變量a不是地址,因此,*a是無(wú)意義的。不要期望得到*a的輸出,這只會(huì)引起編譯出錯(cuò)。7.1指針的概念思考:1.若已執(zhí)行了“pa=&a”,則:“&*pa”的含意是什么?2.*&a的含意是什么?3.(*pa)++相當(dāng)于什么?7.1指針的概念7.1.6指針變量的運(yùn)算1.指針變量自增、自減1指針變量的自增1是使指針變量指向前一個(gè)變量的位置,自減1是使指針變量指向后一個(gè)變量的位置。因而,對(duì)于char*、int*、float*、double*等不同的指針變量類型,實(shí)際不是加/減數(shù)字1,而是分別應(yīng)加/減1、2、4、8字節(jié)即一個(gè)存儲(chǔ)單元。pp+1a[0]a[1]a[2]a[3]a[4]a[9]…..p+3inta,=5,*p;p=&a;如圖7-5所示5變量apP+1圖7-5pP+1P+3a[0]a[1]a[0]a[0]…a[8]圖7-67.1指針的概念2.指針運(yùn)算和數(shù)組指針運(yùn)算在數(shù)組中應(yīng)用得最多。例如p指向int型數(shù)組,且p=&a[1];
則p+1指向a[2]p+3指向a[4]見(jiàn)圖7-63.指針變量相減兩個(gè)指針變量相減的含義是求得兩個(gè)地址在內(nèi)存中的相隔距離(存儲(chǔ)單元個(gè)數(shù)加1)。能做相減運(yùn)算的充要條件為:兩個(gè)指針不但要指向同一數(shù)據(jù)類型的目標(biāo),而且要求所指對(duì)象是唯一的,一般應(yīng)用于數(shù)組。兩個(gè)指針變量相加則毫無(wú)實(shí)際意義。7.2指針變量和函數(shù)指針變量和函數(shù)的關(guān)系包括指針變量和函數(shù)參數(shù)、指針變量和返回指針值的函數(shù)。7.2.1指針變量和函數(shù)參數(shù)函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將指針變量的值(該指針變量所指變量的地址)傳送到另一個(gè)函數(shù)中。學(xué)過(guò)函數(shù)的讀者一定知道,C語(yǔ)言函數(shù)參數(shù)都是單項(xiàng)值傳遞,只能是實(shí)參傳遞給形參而不能反過(guò)來(lái),如果想改變實(shí)參變量中的值,最好的方法用指針變量作為函數(shù)的參數(shù)。例7.3學(xué)校臨時(shí)決定讓正在上課的301教室和307教室的學(xué)生互換教室。用指針變量作為函數(shù)的參數(shù)。#include<stdio.h>voidhuhuan(int*p1,int*p2){7.2指針變量和函數(shù)intt;t=*p1
;*p1=*p2
;*p2=t
;}main(){intjs301=56,js307=60;printf("jishi301=%d,jiaoshi307=%d\n",js301,js307);huhuan(&js301,&js307);printf("jishi301=%d,jiaoshi307=%d\n",js301,js307);}運(yùn)行結(jié)果:7.2指針變量和函數(shù)[說(shuō)明]
如果將huhuan函數(shù)寫成以下形式就會(huì)出問(wèn)題:
voidhuhuan(int*p1,int*p2){int*t;*t=*p1;/*此語(yǔ)句有問(wèn)題*/*p1=*p2;*p2=*t;}
請(qǐng)讀者自己上機(jī)運(yùn)行,看一下結(jié)果。注意:當(dāng)一個(gè)指針變量沒(méi)有具體指向時(shí),不能給該指針變量所指單元賦值。同時(shí),調(diào)用函數(shù)時(shí),不能企圖通過(guò)改變形參指針變量的值而使實(shí)參指針變量的值發(fā)生變化。7.2指針變量和函數(shù)7.2.2指針變量和返回指針值的函數(shù)函數(shù)有類型,也就是函數(shù)的返回值類型。函數(shù)可以返回整型、實(shí)型、字符型等數(shù)據(jù),也可以返回指針類型的的數(shù)據(jù)。此時(shí)函數(shù)的定義的一般形式如下:類型標(biāo)識(shí)符*函數(shù)名(參數(shù)列表)例如:
int*zhizhen(intx,inty)zhizhen是函數(shù)名,函數(shù)調(diào)用它返回一個(gè)指向整型的指針。其中最前面的int表示返回的指針指向的是整形數(shù)據(jù),*表示它后面的函數(shù)zhizhen()是指針類型函數(shù),x,y是函數(shù)zhizhen的形式參數(shù)。例7.4將兩個(gè)教室的學(xué)生合并到一個(gè)教室,函數(shù)帶回教室的地址。7.2指針變量和函數(shù)#include<stdio.h>int*hebing(int*a,int*b){*a=*a+*b;returna;}main(){intjs1,js2;scanf("%d,%d",&js1,&js2);printf("%d\n",*hebing(&js1,&js2));}
運(yùn)行結(jié)果如下:7.3指針變量和數(shù)組C語(yǔ)言中指針和數(shù)組的關(guān)系很密切,任何能用數(shù)組完成的操作都可以用指針來(lái)實(shí)現(xiàn),正確使用指針變量來(lái)引用和處理數(shù)組元素,能夠使程序簡(jiǎn)單明了,效率更高。7.3.1一維數(shù)組和指針變量1.?dāng)?shù)組與指針變量的關(guān)系C語(yǔ)言規(guī)定,任何一個(gè)數(shù)組的數(shù)組名表示該數(shù)組的首地址,即地址常量或叫指針常量。所以數(shù)組中的元素的地址可以通過(guò)數(shù)組名加上一個(gè)整數(shù)來(lái)表示。例如定義
inta[5],*p;*a*(a+1)*(a+2)a[0]a[1]a[2]
圖7-7pp+1p+2aa+1a+2編譯系統(tǒng)為數(shù)組a分配連續(xù)的存儲(chǔ)單元,如圖7-77.3指針變量和數(shù)組pP+1P+2aa+1a+2*a*a+1*a+2a[0]a[1]a[3]a,a+1,a+2…表示相應(yīng)元素的地址*a,*(a+1),*(a+2)…表示相應(yīng)數(shù)組元素即a[0],a[1],a[2]…現(xiàn)執(zhí)行語(yǔ)句:p=a;這樣把數(shù)組a的首地址賦給了指針變量p,或者說(shuō)p指向了數(shù)組a,數(shù)組a中的各元素地址可以用指針變量p加上一個(gè)整數(shù)來(lái)表示,即p+0,p+1,p+2…,相應(yīng)的數(shù)組元素為*(p+0),*(p+1),*(p+2)…。當(dāng)然也可以像數(shù)組元素形式表示p[0],p[1],p[2]…7.3指針變量和數(shù)組2.指針變量引用數(shù)組元素綜上所述,數(shù)組元素的表示方法有:下標(biāo)法,如a[i];指針?lè)?,?(a+i),*(p+i)其中a是數(shù)組名,p是指向數(shù)組的指針變量。例7.5某班級(jí)5名學(xué)生成績(jī)輸出。
#include<stdio.h>main(){inti,a[5]={90,97,85,70,64},*p;/*定義一位數(shù)組a,并賦初值*/p=a;/*指針變量p指向數(shù)組aprintf("p=%x,a=%x\n",p,a);/*輸出數(shù)組a的首地址*/for(i=0;i<5;i++)printf("a[%d]=%d",i,a[i]);/*下標(biāo)法輸出*/printf("\n");for(i=0;i<5;i++)printf("p[%d]=%d",i,p[i]);printf("\n");7.3指針變量和數(shù)組
for(i=0;i<5;i++)printf("*(a+%d)=%d",i,*(a+i));/*指針?lè)ㄝ敵?/printf(“\n”);for(i=0;i<5;i++)printf("*(p+%d)=%d",i,*(p+i));printf("\n");for(i=0;i<5;i++)printf(“p[%d]=%d”,i,*p++);/*逐個(gè)移動(dòng)指針變量p輸出數(shù)組元素*/printf("\n");}
運(yùn)行結(jié)果:7.3指針變量和數(shù)組注意:數(shù)組a與指針變量p的值以當(dāng)時(shí)運(yùn)行結(jié)果為準(zhǔn)。從上面的例子可以看出:
1)指針變量p指向數(shù)組a時(shí),a[i]、*(a+i)、*(p+i)輸出結(jié)果相同,在程序中可以互換使用。需要說(shuō)明的是,C編譯系統(tǒng)對(duì)a[i]、*(a+i)、*(p+i)的處理方法是相同的,即按照相同的地址計(jì)算出數(shù)組元素的地址,因此三種方法的執(zhí)行效率是相同的。
2)指針變量p可以進(jìn)行p++運(yùn)算,而對(duì)于數(shù)組名a不能用a++運(yùn)算,因?yàn)閿?shù)組名代表的是數(shù)組的首地址,是地址常量。
3)注意指針的初始化和指向,逐個(gè)移動(dòng)指針變量p輸出數(shù)組元素時(shí),輸出a[4]時(shí),p的當(dāng)前值指向的是數(shù)組a下面的單元。上面的程序改為:#include<stdio.h>main(){inti,a[5],*p;/*定義一位數(shù)組a*/p=a;
7.3指針變量和數(shù)組
for(i=0;i<=4;i++)scanf("%d",p++);for(i=0;i<5;i++)printf("%d",*p++);printf("\n");}
運(yùn)行結(jié)果:7.3指針變量和數(shù)組程序中p的指針在輸入數(shù)據(jù)之后,沒(méi)有從新指向數(shù)組a,正確程序如下,請(qǐng)讀者自己上機(jī)運(yùn)行。
#include<stdio.h>main(){inti,a[5],*p;/*定義一位數(shù)組a*/p=a;for(i=0;i<4;i++)scanf("%d",p++);p=a;for(i=0;i<5;i++)printf("%d",*p++);printf("\n");}7.3指針變量和數(shù)組3.?dāng)?shù)組名作為函數(shù)參數(shù)在C程序中,可以用數(shù)組名作函數(shù)的實(shí)參和形參。數(shù)組名作為函數(shù)參數(shù)時(shí)將數(shù)組的起始地址傳遞過(guò)去,形參一定是相應(yīng)指針類型。例7.6將數(shù)組a中n個(gè)整數(shù)按相反順序存放。#include<stdio.h>voidinv(intx[],intn){inti,j,t,m;m=(n-1)/2;for(i=0;i<=m;i++){j=n-1-i;t=x[i];x[i]=x[j];7.3指針變量和數(shù)組x[j]=t;}}main(){inti,a[10]={5,3,8,7,2,6,0,9,1,4};;printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");inv(a,10);printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}7.3指針變量和數(shù)組程序運(yùn)行結(jié)果如下:[說(shuō)明]1)在本程序的main函數(shù)中定義了一個(gè)一維數(shù)組a并賦以初值,在調(diào)用函數(shù)時(shí)使用了語(yǔ)句
inv(a,10);表示將數(shù)組名(即數(shù)組的首地址)和數(shù)組元素的個(gè)數(shù)作為實(shí)參傳遞給形參變量x和n。在被調(diào)函數(shù)inv中定義x為形參數(shù)組名,它得到的是實(shí)參數(shù)組的首地址,本例中的inv函數(shù)的首部也可以寫成voidinv(int*x,intn)其作用是相同的。2)在用數(shù)組名作為函數(shù)的實(shí)參時(shí),形參可以是數(shù)組名,也可以是指針變量;在用指向數(shù)組的指針作為函數(shù)的實(shí)參時(shí),形參可以是數(shù)組名,也可以是指針變量。:7.3指針變量和數(shù)組7.3.2二維數(shù)組和指針變量
前面已經(jīng)講過(guò)了二維數(shù)組的定義,現(xiàn)在講解指針可以指向二維數(shù)組。1.指向數(shù)組元素的指針變量定義一個(gè)二維數(shù)組:
inta[2][3]={1,2,3,4,5,6};二維數(shù)組元素在內(nèi)存中是按行存放的,對(duì)于上面的定義我們可以認(rèn)為a是數(shù)組名,數(shù)組包括2行即2個(gè)元素a[0],a[1]。每個(gè)元素又是一維數(shù)組,包含3個(gè)元素。aa[0]a[1]123456圖7-87.3指針變量和數(shù)組例7.7用指針變量輸出2個(gè)班級(jí)的學(xué)生成績(jī)
#include<stdio.h>
main(){
floata[2][3]={97,89,56,99,77,88},*p;for(p=a[0];p<a[0]+6;p++)
{
if((p-a[0])%3==0)printf("\n"); printf("%6.0f",*p);
}
}運(yùn)行結(jié)果:7.3指針變量和數(shù)組上面的例子改為
#include<stdio.h>main(){floata[2][3]={97,89,56,99,77,88},*p;for(p=&a[0][0];p<&a[0][0]+6;p++){if((p-a[0])%3==0)printf("\n"); printf("%6.0f",*p);}}7.3指針變量和數(shù)組2.指向包含m個(gè)元素的一維數(shù)組的指針變量定義:類型標(biāo)識(shí)符(*指針變量名)[m];例如int(*p)[3];其中p是指針變量,它指向包含3個(gè)整數(shù)元素的一維數(shù)組。注意:*p兩邊的括號(hào)不能省,否則表示指針數(shù)組。例7.6輸出某個(gè)班級(jí)某名學(xué)生的成績(jī)。#include<stdio.h>main(){floata[2][3]={97,89,56,99,77,88},(*p)[3];inti,j;p=a;/*數(shù)組的首地址賦給p*/scanf("%d,%d",&i,&j);printf("a[%d][%d]=%6.0f",i,j,*(*(p+i)+j));/*訪問(wèn)第I行第j列元素*/}7.3指針變量和數(shù)組
運(yùn)行結(jié)果:
注意:p是一個(gè)指向一維數(shù)組的指針變量,i的變化是以一維數(shù)組的長(zhǎng)度為單位,而p+i指的第i行。7.3指針變量和數(shù)組7.3.3字符串和指針變量前面的章節(jié)講述的字符串,本小節(jié)介紹指針和字符串的關(guān)系。1.指向字符串的指針變量使指針指向一個(gè)字符串的方法主要有以下幾種:1)通過(guò)賦初值使指針指向一個(gè)字符串
char*ps=″Hello!″;2)通過(guò)賦值運(yùn)算使字符指針指向字符串
char*ps;ps=″Hello!″;也可以通過(guò)指針變量之間的賦值使指針指向字符串。例如:
char*ps1,*ps2=″Hello!″;ps1=ps2;使ps1也指向了ps2所指向的字符串。還可以將字符數(shù)組名賦給字符指針變量而使其指向字符串。例如:char*ps1,s[]=″Hello!″;ps1=s;7.3指針變量和數(shù)組例7.8用指針?lè)▽⒆址產(chǎn)復(fù)制為字符串b。
#include"stdio.h"main(){chara[20],b[20],*p1,*p2;inti;gets(a);/*輸入一串字符*/for(p1=a,p2=b;*p1!='\0';p1++,p2++)*p2=*p1;*p2='\0';puts(b);}
運(yùn)行結(jié)果:7.3指針變量和數(shù)組2.指向字符串的指針作函數(shù)參數(shù)將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以采用指針傳遞的方法。例7.9用函數(shù)調(diào)用實(shí)現(xiàn)字符串的連接。#include<stdio.h>voidstr_cat(char*p1,char*p2){while(*p1!='\0')p1++;/*找目標(biāo)字符串的結(jié)束標(biāo)志′\0′*/while(*p2!='\0'){*p1=*p2;/*將字符串2連接到字符數(shù)組中*/p1++;p2++;}*p1='\0';/*在連接后的字符串后面添補(bǔ)′\0′*/}7.3指針變量和數(shù)組
main()
{
chara[80],b[80];
gets(a);
gets(b);
str_cat(a,b);
puts(a);
}運(yùn)行結(jié)果:程序中的str_cat函數(shù)還可寫成如下形式:
viodstr(chat*p1,char*p2)
{while(*p1)p1++;
while(*p2)*p1++=*p2++;
*p1='\0';}7.4指針數(shù)組
指針數(shù)組的每個(gè)元素都是一個(gè)指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個(gè)字符串,使字符串處理更加方便、靈活。7.4.1指針數(shù)組定義和引用
1.指針數(shù)組定義數(shù)據(jù)類型標(biāo)識(shí)符*數(shù)組名[元素個(gè)數(shù)];
char*p[3];其中p是數(shù)組名,包含3個(gè)元素,每個(gè)數(shù)組元素都是字符型指針變量。在定義數(shù)組時(shí)進(jìn)行初始化:
char*p[3]={”Beijing”,”Tianjin”,”Shanghai”};P[0]P[1]P[2]Beijing\0tianjin\0shanghai\0圖7-97.4指針數(shù)組如圖所示,其中p[0]指向字符串”Beijing”,p[1]指向字符串”Tianjin”,p[2]指向字符串”Shanghai”。經(jīng)過(guò)上面的定義后,我們就可以像普通指針那樣來(lái)使用指針數(shù)組了。2.指針數(shù)組引用在C語(yǔ)言中,指針數(shù)組常用來(lái)處理二維或多維數(shù)組。例7.10輸出我國(guó)四個(gè)直轄市名稱
#include<stdio.h>
main()
{
charcity[4][10]={"Beijing","tianjin","shanghai",
"chongqing"};inti;for(i=0;i<4;i++)printf("%s\n",city[i]);
}
運(yùn)行結(jié)果:7.4指針數(shù)組在定義二位數(shù)組時(shí),二維個(gè)數(shù)必須是大于或等于字符串的字符個(gè)數(shù),但由于字符串長(zhǎng)度不一致,使很多存儲(chǔ)單元未被利用,存儲(chǔ)單元的利用率太低。而用數(shù)組指針來(lái)處理會(huì)改善這種情況,指針數(shù)組的各個(gè)元素所指向的字符串長(zhǎng)度沒(méi)有限制。上面的程序可以寫成
#include<stdio.h>
main()
{
char*p[4]={"Beijing","tianjin","shanghai","chongqing"};
inti;
for(i=0;i<4;i++)
printf("%s\n",p[i]);
}7.4指針數(shù)組7.4.2用作main函數(shù)的形參指針數(shù)組的一個(gè)重要的應(yīng)用是作為main函數(shù)的形參,在前面所接觸到的程序中,main函數(shù)是不帶參數(shù)的,總是寫成
main()括號(hào)中時(shí)空的。實(shí)際上main函數(shù)可以有參數(shù)的,這個(gè)參數(shù)可以認(rèn)為是main函數(shù)的形式參數(shù)。C語(yǔ)言規(guī)定main函數(shù)的參數(shù)只能有兩個(gè),習(xí)慣上這兩個(gè)參數(shù)寫為argc和argv。因此,main函數(shù)的函數(shù)頭可寫為:main(argc,argv)。C語(yǔ)言還規(guī)定argc(第一個(gè)形參)必須是整型變量,argv(第二個(gè)形參)必須是指向字符串的指針數(shù)組。加上形參說(shuō)明后,main函數(shù)的函數(shù)頭應(yīng)寫為:
main(intargc,char*argv[])由于main函數(shù)不能被其它函數(shù)調(diào)用,因此不可能在程序內(nèi)部取得實(shí)際值。那么在何處把實(shí)參值賦予main函數(shù)的形參呢?實(shí)際上main函數(shù)的參數(shù)值是從操作系統(tǒng)命令行上獲得的。當(dāng)我們要運(yùn)行一個(gè)可執(zhí)行文件時(shí),在DOS提示符下鍵入文件名,再輸入實(shí)際參數(shù)即可把這些實(shí)參傳送到main的形參中去。7.4指針數(shù)組DOS提示符下命令行的一般形式為:
C:\>可執(zhí)行文件名參數(shù)參數(shù)……;但是應(yīng)該特別注意的是,main的兩個(gè)形參和命令行中的參數(shù)在位置上不是一一對(duì)應(yīng)的。因?yàn)閙ain的形參只有二個(gè),而命令行中的參數(shù)個(gè)數(shù)原則上未加限制。argc參數(shù)表示了命令行中參數(shù)的個(gè)數(shù)(注意:文件名本身也算一個(gè)參數(shù)),argc的值是在輸入命令行時(shí)由系統(tǒng)按實(shí)際參數(shù)的個(gè)數(shù)自動(dòng)賦予的。例如有命令行為:
C:\>chengxubeijingtianjingshanghaichongqing由于文件名chengxu本身也算一個(gè)參數(shù),所以共有5個(gè)參數(shù),因此argc取得的值為5。argv參數(shù)是字符串指針數(shù)組,其各元素值為命令行中各字符串(參數(shù)均按字符串處理)的首地址。指針數(shù)組的長(zhǎng)度即為參數(shù)個(gè)數(shù)。7.5程序舉例例7.11求任意兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù)。
#include<stdio.h>
intzuida(inta,intb)
{
inti,t;
if(a>b)
{
t=a;
a=b;
b=t;
}
for(i=a;i>=2;i--)
if(a%i==0&&b%i==0)
break;
returni;7.5程序舉例
}
intzuixiao(inta,intb)
{
inti,t;if(a<b)
{
t=a;
a=b;
b=t;
}
for(i=a;i<=a*b;i++)
if(i%a==0&&i%b==0)
break;
returni;
}7.5程序舉例
main()
{
inta,b,c,d;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 青海日用陶瓷品項(xiàng)目可行性研究報(bào)告-圖文
- 2025年精密合金冷軋鋼帶項(xiàng)目投資可行性研究分析報(bào)告
- 24 風(fēng)娃娃(教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版語(yǔ)文二年級(jí)上冊(cè)
- 2025年度資產(chǎn)評(píng)估與財(cái)務(wù)分析合同
- 聚苯乙烯保溫板行業(yè)深度研究報(bào)告
- 2025年雕塑創(chuàng)作行業(yè)深度研究分析報(bào)告
- 配電變壓器項(xiàng)目投資建設(shè)規(guī)劃立項(xiàng)報(bào)告
- 2025年度激光打印機(jī)行業(yè)應(yīng)用解決方案合同
- 無(wú)償租用合同范本
- 2025年度社區(qū)健康醫(yī)療服務(wù)合作協(xié)議4篇
- 高空作業(yè)考試題(帶答案)
- 北師大版數(shù)學(xué)八年級(jí)上冊(cè)1.1探索勾股定理 同步練習(xí)【基礎(chǔ)版】(附答案解析)
- 《會(huì)計(jì)信息系統(tǒng)應(yīng)用》-課件 王新惠 模塊二 供應(yīng)鏈管理系統(tǒng)
- 美容院會(huì)員積分營(yíng)銷方案
- 水利水電工程金屬結(jié)構(gòu)制作與安裝安全技術(shù)規(guī)程
- DL5000-火力發(fā)電廠設(shè)計(jì)技術(shù)規(guī)程
- 第一節(jié)-原核生物與真核生物DNA的復(fù)制課件
- 2024年4月自考03708中國(guó)近現(xiàn)代史綱要試題
- 深部熱療與免疫治療聯(lián)合治療腫瘤
- 2024年貴銀金融租賃公司招聘筆試參考題庫(kù)附帶答案詳解
- 眼電生理在視網(wǎng)膜疾病診斷中的應(yīng)用
評(píng)論
0/150
提交評(píng)論