版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本章目錄7.1指針的概念7.2指針變量和函數(shù)7.3指針變量和數(shù)組7.4指針數(shù)組指針是C語言的一種數(shù)據(jù)類型,在C語言中處于重要的地位。正確、靈活地應(yīng)用指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、動態(tài)地分配內(nèi)存、方便地使用字符串、高效地使用數(shù)組。熟練地應(yīng)用指針可以使C程序簡潔、緊湊、應(yīng)用效果好。7.1指針的概念指針的概念包括指針和指針變量的關(guān)系、指針和函數(shù)、指針和數(shù)組的使用等。7.1.1指針和指針變量的關(guān)系
一個變量的地址稱為該變量的指針。1.地址指內(nèi)存中存儲單元的編號:1)計算機(jī)硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元(容量為1字節(jié))。為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個唯一的地址。2)在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。內(nèi)存單元的編號(地址),與變量名對應(yīng)。內(nèi)存單元的內(nèi)容:即變量的值。7.1指針的概念到目前我們學(xué)過的基本數(shù)據(jù)類型int型、float型、double型、char型等,內(nèi)存分配的存儲單元分別是2個字節(jié)、4個字節(jié)、8個字節(jié)、1個字節(jié)等。前面我們已經(jīng)介紹了變量的概念,每個變量都有自己的存儲地址。定義變量的同時,把存儲單元的起始地址作為變量的地址(指針)。指針變量指專門存放變量地址的變量。為了更好的理解指針和指針變量,下面舉例說明:inta;編譯系統(tǒng)會為它分配2個字節(jié)存儲單元即1000H和1001H,1000H就是變量a的地址。如果有一個變量存放變量a的地址,那這個變量就是指針變量pa。如圖7-17.1指針的概念我們可以直接給變量a賦初值2,即通過變量a的地址訪問a,這種方式稱“直接訪問”。當(dāng)然還可以通過指針變量pa訪問變量a,這種訪問方式稱“間接訪問”。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個字節(jié)。由上可知,定義指針變量的同時也可以定義其他類型的變量,它們在語法上的差別僅在于前者在變量名多了一個“*”號。要弄清楚指針變量的含義和作用,還必須弄清楚以下幾個概念。1.指針變量名:指針變量名不包括“*”號,因為“*”號不能用于標(biāo)識符。因此,在*p1中,“*”和p1不是一個整體,不要把*p2、*p3等看作指針變量名,指針變量名是p2、p3等。2.指針變量的值:其初值不定,當(dāng)初始化或賦值后,其值表示另一個變量的地址。7.1指針的概念7.1.3和指針有關(guān)運算符指針運算包括兩個運算符1.取地址運算符(&)單目運算符(&)用來求出運算對象的地址,利用它可以把一個變量的地址賦給指針變量??梢允褂貌煌姆椒ńo一個指針變量賦值。例如有定義和賦值:
inta=5,*pa;pa=&a;將變量a的地址賦給指針變量pa,也就是使pa指向了變量a。7.1指針的概念2.指針運算符(*)也叫間接訪問運算符,單目運算符,當(dāng)它和指針變量參與運算時,表示指針變量所指的內(nèi)容,即實現(xiàn)“取內(nèi)容”操作。inta=5,b,*pa;pa=&a;
若b=*pa-1;則b=4;注意:*在不同的地方作用有時是不一樣的。若出現(xiàn)在變量定義的部分,*說明pa是指針變量;出現(xiàn)在其他操作部分中*pa表示pa所指向的變量a。3.取地址運算符(&)和指針運算符(*)互為逆運算。7.1指針的概念7.1.4、指針變量賦值(初始化)可以使用不同的方法給一個指針變量賦值。
1.通過取地址運算符(&)獲得地址值例如有如下定義和賦值:
inta=5,*p,*q;p=&a;
它建立了如圖7-2所示的邏輯關(guān)系
pa&a5圖7-2因此當(dāng)有語句:p=&a;時,scanf((″%d″,&a);和scanf(″%d″,p)是等價的。7.1指針的概念2.通過指針變量獲得地址值可以通過賦值運算,如圖7-3。把一個指針變量中的地址值賦給另一個指針變量,從而使這兩個指針變量指向同一地址。例如,若有上面的定義,則語句:
q=p;使指針變量q中也存放了變量a的地址,也就是說指針變量p和q都指向了整型變量a。使用時應(yīng)注意:賦值號兩邊指針變量的基類型必須相同。paq
&a5
&a圖7-37.1指針的概念3.給指針變量賦“空”值
p=NULL;NULL是在stdio.h頭文件中定義的預(yù)定義符,因此在使用NULL時,應(yīng)該在程序的前面出現(xiàn)預(yù)定義行:#include″stdio.h″。NULL的代碼值為0,應(yīng)當(dāng)注意:1.指針變量只能存放地址,不能把一個整型量賦給指針變量。如p=5;是錯的。應(yīng)該通過取地址運算符“&”把一個地址賦給指針變量。2.應(yīng)避免使用沒有賦值的指針變量,沒有賦值的指針變量雖不會導(dǎo)致編譯出錯,但可能導(dǎo)致無法預(yù)料的災(zāi)難性后果。我們將在后面的例子中講解。7.1指針的概念7.1.5指針變量的引用
講過和指針有關(guān)的&和*兩種運算符,通過它們就可以應(yīng)用指針變量了。例7.1通過指針變量訪問變量#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指針的概念程序的運行結(jié)果為:[說明]1.在程序的第二行定義了兩個指針變量p1和p2,但它們并未指向任何整型變量。在程序的第4、5兩行將兩個整型變量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。因此,程序中的兩個printf函數(shù)的功能是相同的。
3.在程序中兩次出現(xiàn)*p1和*p2,它們的意義是不同的。第2行出現(xiàn)的*p1和*p2表示定義了兩個指針變量,它們前面的“*”表示p1和p2是兩個指針變量。而第7行出現(xiàn)的*p1和*p2表示的是p1和p2所指向的變量,即a和b。
4.注意不要將程序的第4、5行寫成*p1=&a; *p2=&b;因為是將a和b的地址賦給指針變量p1和p2。在C語言中,運算符“*”的不同作用示例。7.1指針的概念
例7.2#include<stdio.h>main(){inta=5,b,*pa;/*符號*用于定義指向整型變量的指針變量pa*/pa=&a;b=*pa;/**pa在賦值符號右邊,取指針變量pa所指向的變量a的內(nèi)容*/*pa=a*7;/**pa在賦值符號左邊,將a*7的結(jié)果存入指針變量pa所指向的變量a中*/printf(“a=%d,b=%d*pa=%d\n”,a,b,*pa);/*在雙引號中的*號作為普通字符*/printf("adda=%p,addpa=%p\n",&a,&pa);}7.1指針的概念程序的運行結(jié)果為:
注意:a和pa的地址不一定是上面的結(jié)果,依據(jù)當(dāng)時運行結(jié)果而定。由例子,可歸納出符號“*”在C語言中有以下4種用法:1.用作一個普通ASCII字符,如上述程序中第6行語句在雙引號中的*號作為普通字符。2.在算術(shù)表達(dá)式中用作雙目乘法運算符,如程序第5行中的a*7。3.用于定義指針變量,如程序第2行中的*pa,定義pa為一指針變量。這里的“*”不是運算符,表示變量pa為指針變量。
7.1指針的概念4.在地址表達(dá)式中用作“間接訪問”運算符,此處的“*”號是一個單目運算符,用于“左存右取”由地址表達(dá)式所指向的變量的內(nèi)容。如程序第4、5行中的*pa和第6行中雙引號外邊的*pa中的“*”號。由程序注釋可知,第5行中的*pa的作用和第4、6兩行中的*pa的作用是不相同的。即,當(dāng)*pa出現(xiàn)在賦值運算符“=”的左邊時,代表將右邊的值存入由指針變量pa所指向的地址單元;而在其他位置作“間接訪問”運算符時,代表取出由指針變量pa所指向的地址單元的內(nèi)容。符號“*”的4種不同作用,容易混淆的是后兩種作用,大家可從它們所處的不同位置加以區(qū)分。這里請讀者牢記,“*”后必須跟一個地址表達(dá)式,指針變量pa代表一個地址,所以*pa是有意義;而普通變量a不是地址,因此,*a是無意義的。不要期望得到*a的輸出,這只會引起編譯出錯。7.1指針的概念思考:1.若已執(zhí)行了“pa=&a”,則:“&*pa”的含意是什么?2.*&a的含意是什么?3.(*pa)++相當(dāng)于什么?7.1指針的概念7.1.6指針變量的運算1.指針變量自增、自減1指針變量的自增1是使指針變量指向前一個變量的位置,自減1是使指針變量指向后一個變量的位置。因而,對于char*、int*、float*、double*等不同的指針變量類型,實際不是加/減數(shù)字1,而是分別應(yīng)加/減1、2、4、8字節(jié)即一個存儲單元。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.指針運算和數(shù)組指針運算在數(shù)組中應(yīng)用得最多。例如p指向int型數(shù)組,且p=&a[1];
則p+1指向a[2]p+3指向a[4]見圖7-63.指針變量相減兩個指針變量相減的含義是求得兩個地址在內(nèi)存中的相隔距離(存儲單元個數(shù)加1)。能做相減運算的充要條件為:兩個指針不但要指向同一數(shù)據(jù)類型的目標(biāo),而且要求所指對象是唯一的,一般應(yīng)用于數(shù)組。兩個指針變量相加則毫無實際意義。7.2指針變量和函數(shù)指針變量和函數(shù)的關(guān)系包括指針變量和函數(shù)參數(shù)、指針變量和返回指針值的函數(shù)。7.2.1指針變量和函數(shù)參數(shù)函數(shù)的參數(shù)不僅可以是整型、實型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將指針變量的值(該指針變量所指變量的地址)傳送到另一個函數(shù)中。學(xué)過函數(shù)的讀者一定知道,C語言函數(shù)參數(shù)都是單項值傳遞,只能是實參傳遞給形參而不能反過來,如果想改變實參變量中的值,最好的方法用指針變量作為函數(shù)的參數(shù)。例7.3學(xué)校臨時決定讓正在上課的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);}運行結(jié)果:7.2指針變量和函數(shù)[說明]
如果將huhuan函數(shù)寫成以下形式就會出問題:
voidhuhuan(int*p1,int*p2){int*t;*t=*p1;/*此語句有問題*/*p1=*p2;*p2=*t;}
請讀者自己上機(jī)運行,看一下結(jié)果。注意:當(dāng)一個指針變量沒有具體指向時,不能給該指針變量所指單元賦值。同時,調(diào)用函數(shù)時,不能企圖通過改變形參指針變量的值而使實參指針變量的值發(fā)生變化。7.2指針變量和函數(shù)7.2.2指針變量和返回指針值的函數(shù)函數(shù)有類型,也就是函數(shù)的返回值類型。函數(shù)可以返回整型、實型、字符型等數(shù)據(jù),也可以返回指針類型的的數(shù)據(jù)。此時函數(shù)的定義的一般形式如下:類型標(biāo)識符*函數(shù)名(參數(shù)列表)例如:
int*zhizhen(intx,inty)zhizhen是函數(shù)名,函數(shù)調(diào)用它返回一個指向整型的指針。其中最前面的int表示返回的指針指向的是整形數(shù)據(jù),*表示它后面的函數(shù)zhizhen()是指針類型函數(shù),x,y是函數(shù)zhizhen的形式參數(shù)。例7.4將兩個教室的學(xué)生合并到一個教室,函數(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));}
運行結(jié)果如下:7.3指針變量和數(shù)組C語言中指針和數(shù)組的關(guān)系很密切,任何能用數(shù)組完成的操作都可以用指針來實現(xiàn),正確使用指針變量來引用和處理數(shù)組元素,能夠使程序簡單明了,效率更高。7.3.1一維數(shù)組和指針變量1.?dāng)?shù)組與指針變量的關(guān)系C語言規(guī)定,任何一個數(shù)組的數(shù)組名表示該數(shù)組的首地址,即地址常量或叫指針常量。所以數(shù)組中的元素的地址可以通過數(shù)組名加上一個整數(shù)來表示。例如定義
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ù)的存儲單元,如圖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í)行語句:p=a;這樣把數(shù)組a的首地址賦給了指針變量p,或者說p指向了數(shù)組a,數(shù)組a中的各元素地址可以用指針變量p加上一個整數(shù)來表示,即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];指針法,如*(a+i),*(p+i)其中a是數(shù)組名,p是指向數(shù)組的指針變量。例7.5某班級5名學(xué)生成績輸出。
#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));/*指針法輸出*/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++);/*逐個移動指針變量p輸出數(shù)組元素*/printf("\n");}
運行結(jié)果:7.3指針變量和數(shù)組注意:數(shù)組a與指針變量p的值以當(dāng)時運行結(jié)果為準(zhǔn)。從上面的例子可以看出:
1)指針變量p指向數(shù)組a時,a[i]、*(a+i)、*(p+i)輸出結(jié)果相同,在程序中可以互換使用。需要說明的是,C編譯系統(tǒng)對a[i]、*(a+i)、*(p+i)的處理方法是相同的,即按照相同的地址計算出數(shù)組元素的地址,因此三種方法的執(zhí)行效率是相同的。
2)指針變量p可以進(jìn)行p++運算,而對于數(shù)組名a不能用a++運算,因為數(shù)組名代表的是數(shù)組的首地址,是地址常量。
3)注意指針的初始化和指向,逐個移動指針變量p輸出數(shù)組元素時,輸出a[4]時,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");}
運行結(jié)果:7.3指針變量和數(shù)組程序中p的指針在輸入數(shù)據(jù)之后,沒有從新指向數(shù)組a,正確程序如下,請讀者自己上機(jī)運行。
#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ù)組的起始地址傳遞過去,形參一定是相應(yīng)指針類型。例7.6將數(shù)組a中n個整數(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ù)組程序運行結(jié)果如下:[說明]1)在本程序的main函數(shù)中定義了一個一維數(shù)組a并賦以初值,在調(diào)用函數(shù)時使用了語句
inv(a,10);表示將數(shù)組名(即數(shù)組的首地址)和數(shù)組元素的個數(shù)作為實參傳遞給形參變量x和n。在被調(diào)函數(shù)inv中定義x為形參數(shù)組名,它得到的是實參數(shù)組的首地址,本例中的inv函數(shù)的首部也可以寫成voidinv(int*x,intn)其作用是相同的。2)在用數(shù)組名作為函數(shù)的實參時,形參可以是數(shù)組名,也可以是指針變量;在用指向數(shù)組的指針作為函數(shù)的實參時,形參可以是數(shù)組名,也可以是指針變量。:7.3指針變量和數(shù)組7.3.2二維數(shù)組和指針變量
前面已經(jīng)講過了二維數(shù)組的定義,現(xiàn)在講解指針可以指向二維數(shù)組。1.指向數(shù)組元素的指針變量定義一個二維數(shù)組:
inta[2][3]={1,2,3,4,5,6};二維數(shù)組元素在內(nèi)存中是按行存放的,對于上面的定義我們可以認(rèn)為a是數(shù)組名,數(shù)組包括2行即2個元素a[0],a[1]。每個元素又是一維數(shù)組,包含3個元素。aa[0]a[1]123456圖7-87.3指針變量和數(shù)組例7.7用指針變量輸出2個班級的學(xué)生成績
#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);
}
}運行結(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個元素的一維數(shù)組的指針變量定義:類型標(biāo)識符(*指針變量名)[m];例如int(*p)[3];其中p是指針變量,它指向包含3個整數(shù)元素的一維數(shù)組。注意:*p兩邊的括號不能省,否則表示指針數(shù)組。例7.6輸出某個班級某名學(xué)生的成績。#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));/*訪問第I行第j列元素*/}7.3指針變量和數(shù)組
運行結(jié)果:
注意:p是一個指向一維數(shù)組的指針變量,i的變化是以一維數(shù)組的長度為單位,而p+i指的第i行。7.3指針變量和數(shù)組7.3.3字符串和指針變量前面的章節(jié)講述的字符串,本小節(jié)介紹指針和字符串的關(guān)系。1.指向字符串的指針變量使指針指向一個字符串的方法主要有以下幾種:1)通過賦初值使指針指向一個字符串
char*ps=″Hello!″;2)通過賦值運算使字符指針指向字符串
char*ps;ps=″Hello!″;也可以通過指針變量之間的賦值使指針指向字符串。例如:
char*ps1,*ps2=″Hello!″;ps1=ps2;使ps1也指向了ps2所指向的字符串。還可以將字符數(shù)組名賦給字符指針變量而使其指向字符串。例如:char*ps1,s[]=″Hello!″;ps1=s;7.3指針變量和數(shù)組例7.8用指針法將字符串a(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);}
運行結(jié)果:7.3指針變量和數(shù)組2.指向字符串的指針作函數(shù)參數(shù)將一個字符串從一個函數(shù)傳遞到另一個函數(shù),可以采用指針傳遞的方法。例7.9用函數(shù)調(diào)用實現(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);
}運行結(jié)果:程序中的str_cat函數(shù)還可寫成如下形式:
viodstr(chat*p1,char*p2)
{while(*p1)p1++;
while(*p2)*p1++=*p2++;
*p1='\0';}7.4指針數(shù)組
指針數(shù)組的每個元素都是一個指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個字符串,使字符串處理更加方便、靈活。7.4.1指針數(shù)組定義和引用
1.指針數(shù)組定義數(shù)據(jù)類型標(biāo)識符*數(shù)組名[元素個數(shù)];
char*p[3];其中p是數(shù)組名,包含3個元素,每個數(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)過上面的定義后,我們就可以像普通指針那樣來使用指針數(shù)組了。2.指針數(shù)組引用在C語言中,指針數(shù)組常用來處理二維或多維數(shù)組。例7.10輸出我國四個直轄市名稱
#include<stdio.h>
main()
{
charcity[4][10]={"Beijing","tianjin","shanghai",
"chongqing"};inti;for(i=0;i<4;i++)printf("%s\n",city[i]);
}
運行結(jié)果:7.4指針數(shù)組在定義二位數(shù)組時,二維個數(shù)必須是大于或等于字符串的字符個數(shù),但由于字符串長度不一致,使很多存儲單元未被利用,存儲單元的利用率太低。而用數(shù)組指針來處理會改善這種情況,指針數(shù)組的各個元素所指向的字符串長度沒有限制。上面的程序可以寫成
#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ù)組的一個重要的應(yīng)用是作為main函數(shù)的形參,在前面所接觸到的程序中,main函數(shù)是不帶參數(shù)的,總是寫成
main()括號中時空的。實際上main函數(shù)可以有參數(shù)的,這個參數(shù)可以認(rèn)為是main函數(shù)的形式參數(shù)。C語言規(guī)定main函數(shù)的參數(shù)只能有兩個,習(xí)慣上這兩個參數(shù)寫為argc和argv。因此,main函數(shù)的函數(shù)頭可寫為:main(argc,argv)。C語言還規(guī)定argc(第一個形參)必須是整型變量,argv(第二個形參)必須是指向字符串的指針數(shù)組。加上形參說明后,main函數(shù)的函數(shù)頭應(yīng)寫為:
main(intargc,char*argv[])由于main函數(shù)不能被其它函數(shù)調(diào)用,因此不可能在程序內(nèi)部取得實際值。那么在何處把實參值賦予main函數(shù)的形參呢?實際上main函數(shù)的參數(shù)值是從操作系統(tǒng)命令行上獲得的。當(dāng)我們要運行一個可執(zhí)行文件時,在DOS提示符下鍵入文件名,再輸入實際參數(shù)即可把這些實參傳送到main的形參中去。7.4指針數(shù)組DOS提示符下命令行的一般形式為:
C:\>可執(zhí)行文件名參數(shù)參數(shù)……;但是應(yīng)該特別注意的是,main的兩個形參和命令行中的參數(shù)在位置上不是一一對應(yīng)的。因為main的形參只有二個,而命令行中的參數(shù)個數(shù)原則上未加限制。argc參數(shù)表示了命令行中參數(shù)的個數(shù)(注意:文件名本身也算一個參數(shù)),argc的值是在輸入命令行時由系統(tǒng)按實際參數(shù)的個數(shù)自動賦予的。例如有命令行為:
C:\>chengxubeijingtianjingshanghaichongqing由于文件名chengxu本身也算一個參數(shù),所以共有5個參數(shù),因此argc取得的值為5。argv參數(shù)是字符串指針數(shù)組,其各元素值為命令行中各字符串(參數(shù)均按字符串處理)的首地址。指針數(shù)組的長度即為參數(shù)個數(shù)。7.5程序舉例例7.11求任意兩個整數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程審圖合同3篇
- 方合同是可以違約么3篇
- 新版采購年度框架協(xié)議合同3篇
- 旅游度假樓房轉(zhuǎn)租租賃合同
- 教育培訓(xùn)合同范本3篇
- 收款合同范本3篇
- 教育培訓(xùn)機(jī)構(gòu)勞動合同執(zhí)行校長3篇
- 盡職調(diào)查法律合規(guī)指導(dǎo)合同3篇
- 新鮮雞蛋采購契約3篇
- 攜手同行共筑學(xué)子未來承諾書3篇
- JBT 14685-2023 無油渦旋空氣壓縮機(jī) (正式版)
- 2024年遼寧生態(tài)工程職業(yè)學(xué)院單招職業(yè)技能測試題庫各版本
- 中秋國慶慰問品采購?fù)稑?biāo)方案
- 20K607 防排煙及暖通防火設(shè)計審查與安裝
- 《統(tǒng)計建模與R軟件》書本課后習(xí)題答案
- 2024年安徽合肥市建設(shè)工程監(jiān)測中心有限責(zé)任公司招聘筆試參考題庫含答案解析
- 滑雪指導(dǎo)員理論考試復(fù)習(xí)題庫(含答案)
- 幾何畫板在初中二次函數(shù)教學(xué)中的應(yīng)用研究
- 帶你聽懂中國傳統(tǒng)音樂智慧樹知到期末考試答案2024年
- 南京市秦淮區(qū)2022-2023七年級上學(xué)期期中語文試卷及答案
- 學(xué)校歸屬感量表
評論
0/150
提交評論