版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
會計學1C語言程序設計教程第8章8.1指針與指針變量8.2指針與函數(shù)8.3指針與數(shù)組8.4指針與字符串8.5指針數(shù)組與命令行參數(shù)8.6程序舉例第8章指針第1頁/共78頁8.1指針與指針變量8.1.1指針的概念1.內(nèi)存與變量地址內(nèi)存地址:內(nèi)存是計算機用于存儲數(shù)據(jù)的存儲器,以一個字節(jié)作為存儲單元,為了便于訪問,給每個字節(jié)單元一個唯一的編號,第一字節(jié)單元編號為0,以后各單元按順序連續(xù)編號,這些單元編號稱為內(nèi)存單元的地址。變量地址:變量所分配存儲空間的首字節(jié)單元地址(字節(jié)單元編號)。第2頁/共78頁…36781516………A公司B公司C公司一排平房叫地址第3頁/共78頁第4頁/共78頁2.變量的三要素:名字、類型與值每個變量都通過變量名與相應的存儲單元相連系,具體分配哪些單元給變量,由C編譯系統(tǒng)完成變量名到對應內(nèi)存單元地址的變換。
變量分配存儲空間的大小由類型決定。變量的值則是指相應存儲單元的內(nèi)容。
3.內(nèi)存存取方式直接存取:把直接按變量名或地址存取變量值的方式稱為“直接存取”方式。間接存取:通過定義一種特殊的變量專門存放內(nèi)存或變量的地址,然后根據(jù)該地址值再去訪問相應的存儲單元。第5頁/共78頁將要訪問變量a的地址存放在另一個變量p中,當需要訪問變量a時,先取出變量p的內(nèi)容即變量a的地址,再根據(jù)此地址找到變量a所對應的存儲空間。
這種間接的通過變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取”。能夠存放其它變量地址的變量稱作指針變量
通常稱變量p指向變量a,變量a是變量p所指向的對象…400012345400040024800pap(4800)
p(4800)
a(4000)
4000123454000間接存取示意圖第6頁/共78頁4、指針的概念
在C語言中,用指針來表示一個變量指向另一個變量這樣的指向關系。指針和指針變量
指針:是一個變量的地址
指針變量:用來存儲變量地址(指針)的變量如:p即是一個指針變量,它存放的是a的地址4000。第7頁/共78頁8.1.2指針變量的定義與初始化1.指針變量的定義類型標識符*指針變量名;例:float*p1;(定義p1為指向?qū)嵭妥兞康闹羔樧兞?char*p2;(定義p2為指向字符型變量的指針變量)在指針變量定義中,*是一個說明符,它表明其后的變量是指針變量,如p是指針變量,而不要認為“*p”是指針變量。指針變量定義時指定的數(shù)據(jù)類型不是指針變量本身(變量存放的值)的數(shù)據(jù)類型,而是指針變量所指向的對象(或稱目標)的數(shù)據(jù)類型指針變量存放的是所指向的某個變量的地址值,而普通變量保存的是該變量本身的值指針變量并不固定指向一個變量,可指向同類型的不同變量第8頁/共78頁2.指針運算符與地址運算符與指針引用有關的兩個運算符:&與*。
&:取地址運算符
*:指針運算符,或稱指向運算符、間接訪問運算符。指針指向的對象的表示形式:
*指針變量此處*是訪問指針所指對象的運算符,與指針定義時的*不同。第9頁/共78頁3.指針變量初始化若有定義:
inta,*p;語句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。因為這些指針變量還沒有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(nèi)存單元)。指針變量初始化:在定義指針時同時給指針一個初始值如:inta,*p=&a;40003a(4000)p*p第10頁/共78頁4.指針變量的引用
①*指針變量名——代表所指變量的值。②指針變量名——代表所指變量的地址。有定義:inta,*p=&a;用*p來表示p指向的對象a,*p與a是等價的。*p可以象普通變量一樣使用。例如:
a=12;*p=12;scanf("%d",&*p);scanf("%d",p);printf(“%d%d”,*p,a);注意:*與&具有相同的優(yōu)先級,結合方向從右到左。這樣,&*p即&(*p),是對變量*p取地址,它與&a等價;p與&(*p)等價,a與*(&a)等價。第11頁/共78頁8.1.3指針運算1.指針的賦值運算(1)將變量地址值賦給指針變量,使指針指向該變量。設有如下定義:
inta,b,*pa,*pb;float*pf;第一行定義了整型變量a,b及指針變量pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變量,下面語句完成對pa,pb的賦值:
pa=&a;pb=&b;第12頁/共78頁例如:intj,k;int*pointer1,*pointer2;pointer1=&j;pointer2=&k;pointer1jpointer2k第13頁/共78頁(2)相同類型的指針變量間的賦值pa與pb都是整型指針變量,它們間可以相互賦值,如:pb=pa;即pa,pb都指向變量a,此時a、*pa、*pb是等價的。指針指向變化如下圖:注意:只有相同類型的指針變量才能相互賦值,如pf=pa;是不允許的。因為pa是整型指針,pf是浮點型指針。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb第14頁/共78頁(3)給指針變量賦空值
給指針變量賦空值,說明該指針不指向任何變量。
“空”指針值用NULL表示,NULL是在頭文件stdio.h中預定義的常量,其值為0,在使用時應加上預定義行,如:
#include"stdio.h"int*pa=NULL;
亦可以用下面的語句給指針賦“空值”:pa=0;
或:pa=’\0’;
這里指針pa并非指向0地址單元,而是具有一個確定的“空值”,表示pa不指向任何變量。注意:指針雖然可以賦值0,但卻不能把其它的常量地址賦給指針。例如:pa=4000;是非法的。第15頁/共78頁例8.1指針定義與初始化main(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*pointer_1,*pointer_2);}第16頁/共78頁程序運行結果:100,10100,10&a&bbpointer_1pointer_2a*pointer_1*pointer_2第17頁/共78頁例8.2從鍵盤上輸入兩個整數(shù)到a、b,按由大到小輸出。#include<stdio.h>main(){inta,b,*pa=&a,*pb=&b,*p;/*定義指針變量pa、pb,如下頁圖a*/scanf(″%d%d″,&a,&b);if(*pa<*pb){p=pa;/*進行指針交換,如下頁圖b,c*/pa=pb;pb=p;
}printf(″\na=%d,b=%d\n″,a,b);printf(″\nmax=%d,min=%d″,*pa,*pb);/*pa指向大數(shù),pb指向小數(shù)*/}第18頁/共78頁若輸入:1222↙
輸出結果:a=12,b=22
max=22,min=12(b)(c)指針變化示意圖1222ppapb1222ppapbpapbababab第19頁/共78頁2.指針的算術運算(1)加減運算:一個指針可以加、減一個整數(shù)n,其結果與指針所指對象的數(shù)據(jù)類型有關。指針變量的值應增加或減少“n×sizeof(指針類型)”。
加減運算常用于數(shù)組的處理。對指向一般數(shù)據(jù)的指針,加減運算無實際意義。例如:
inta[10],*p=a,*x;
x=p+3;/*實際上是p加上3*2個字節(jié)賦給x,x指向數(shù)組的第三個分量*/
對于不同基類型的指針,指針變量“加上”或“減去”一個整數(shù)n所移動的字節(jié)數(shù)是不同的。例如:
floata[10],*p=a,*x;
p=p+3;/*實際上是p加上3*4個字節(jié)賦給x,x依然指向數(shù)組的第三個分量*/第20頁/共78頁(2)自增自減運算指針變量自增、自減運算具有上述運算的特點,但有前置后置、先用后用的考慮,務請小心。例如:
inta[10],*p=a,*x;
x=p++;/*x第一個元素分量,p指向第二個元素*/x=++p;/*x、p均指向數(shù)組的第二個分量*/*
p++相當于*(p++)。*(p++)與(*p)++含義不同,前者表示地址自增,后者表示當前所指向的數(shù)據(jù)自增。第21頁/共78頁2.*&a的含意是什么?(答:a)3.(*p)++相當于什么?(答:a++)思考:1.若有定義inta,*p;執(zhí)行了“p=&a”,則:“&*p”的含意是什么?(答:相當于&a)第22頁/共78頁3.指針的關系運算與基本類型變量一樣,指針可以進行關系運算。在關系表達式中允許對兩個指針進行所有的關系運算。若p,q是兩個同類型的指針變量,則:p>q,p<q,p==q,p!=q,p>=q都是允許的。指針的關系運算在指向數(shù)組的指針中廣泛的運用,假設p、q是指向同一數(shù)組的兩個指針,執(zhí)行p>q的運算,其含義為,若表達式結果為真(非0值),則說明p所指元素在q所指元素之后?;蛘哒fq所指元素離數(shù)組第一個元素更近些。注意:在指針進行關系運算之前,指針必須指向確定的變量或存儲區(qū)域,即指針有初始值;另外,只有相同類型的指針才能進行比較。第23頁/共78頁8.1.4多級指針
把指向指針型數(shù)據(jù)的指針變量稱為指向指針的指針,或稱多級指針。二級指針的定義形式如下:
數(shù)據(jù)類型**指針變量例如:
inta,*p,**pp;a=22;p=&a;pp=&p;假設變量a的地址為4000,指針p的地址為4100,二級指針pp的地址為4800。a、p、pp三者的關系如上圖。&p=4100&a=400022pp(4800)p(4100)a(4000)第24頁/共78頁8.2指針與函數(shù)8.2.1指針作為函數(shù)參數(shù)利用指針作函數(shù)參數(shù),可以實現(xiàn)函數(shù)之間多個數(shù)據(jù)的傳遞,當形參為指針變量時,其對應實參可以是指針變量或存儲單元地址。
(1)函數(shù)形參為指針變量,用指針變量作為實參
(2)函數(shù)形參為指針變量,用變量地址作為實參例8.3編寫一個交換兩個變量的函數(shù),在主程序中調(diào)用,實現(xiàn)兩個變量值的交換。第25頁/共78頁程序如下:#include<stdio.h>main(){inta,b;int*pa,*pb;voidswap(int*p1,int*p2);/*函數(shù)聲明*/scanf(″%d%d″,&a,&b);pa=&a;/*pa指向變量a*/pb=&b;/*pb指向變量b*/swap(pa,pb);printf(″\na=%d,b=%d\n″,a,b);}或:swap(&a,&b);voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;
}程序運行結果如下:輸入:
1222↙
輸出:a=22,b=12第26頁/共78頁兩點說明:
(1)若在函數(shù)體中交換指針變量的值,實參a、b的值并不改變,指針參數(shù)亦是傳值。例如:
int*p;
p=p1;p1=p2;p2=p;不要希望如此完成處理。
(2)函數(shù)中交換值時不能使用無初值的指針變量作臨時變量。例如:
int*p;*p=*p1;*p1=*p2;*p2=*p;
p無確定值,對p的使用可能帶來不可預期的后果。第27頁/共78頁8.2.2指針函數(shù)指針函數(shù):是指返回值為指針的函數(shù)指針函數(shù)的定義形式:
類型標示符*函數(shù)名(參數(shù))例如:int*fun(inta,intb){函數(shù)體語句}在函數(shù)體中有返回指針或地址的語句,形如:return(&變量名);或return(指針變量);并且返回值的類型要與函數(shù)類型一致。
第28頁/共78頁例8.3分析如下程序main(){inta,b,*p;int*max(intx,inty);scanf(“%d,%d”,&a,&b);p=max(a,b);printf(“max=%d”,*p);}int*max(intx,inty){if(x>y)return(&x);elsereturn(&y);}第29頁/共78頁8.2.3指向函數(shù)的指針
一個函數(shù)包括一組指令序列,存儲在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址可以定義一個指針變量,其值等于該函數(shù)的入口地址,指向這個函數(shù),這樣通過這個指針變量也能調(diào)用這個函數(shù)。這種指針變量稱為指向函數(shù)的指針變量。定義指向函數(shù)的指針變量的一般形式為:
類型標識符(*指針變量名)();例如:
int(*p)();/*指針變量p可以指向一個整型函數(shù)*/float(*q)();/*指針變量q可以指向一個浮點型函數(shù)*/第30頁/共78頁
剛定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦以地址值才能引用。當將某個函數(shù)的入口地址賦給指向函數(shù)的指針變量,就可用該指針變量來調(diào)用所指向的函數(shù)
給函數(shù)指針賦初值:將函數(shù)名(函數(shù)的入口地址值)賦給指針變量例如intm,(*p)();intmax(inta,intb);則可以p=max;/*p指向函數(shù)max()*/指針調(diào)用函數(shù)的一般形式為:
(*指針變量)(實參表);如上例:m=(*p)(12,22);/*比較m=max(12,22);*/第31頁/共78頁注意:
用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒有參數(shù)類型說明,C編譯系統(tǒng)也無法進行類型檢查,因此,在使用這種形式調(diào)用函數(shù)時要特別小心。實參一定要和指針所指函數(shù)的形參類型一致。函數(shù)指針可以作為函數(shù)參數(shù),此時,當函數(shù)指針每次指向不同的函數(shù)時,可執(zhí)行不同的函數(shù)來完成不同的功能
例8.4
函數(shù)max()用來求一維數(shù)組的元素的最大值,在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來實現(xiàn)。第32頁/共78頁程序如下:#include"stdio.h"#defineM8main(){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()函數(shù)*/printf("sump=%.2f\n",sump);printf("sumf=%.2f\n",sumf);}第33頁/共78頁程序接上頁:floatmax(floata[],intn){intk; floats; s=a[0]; for(k=0;k<n;k++) if(s<a[k])s=a[k];returns;}程序運行結果:sump=80.00sumf=80.00第34頁/共78頁指向函數(shù)的指針的使用步驟:(1)
定義一個指向函數(shù)的指針變量,形如:
float(*p)();(2)
為函數(shù)指針賦值,格式如下:
p=函數(shù)名;注意:賦值時只需給出函數(shù)名,不要帶參數(shù)。(3)
通過函數(shù)指針調(diào)用函數(shù),調(diào)用格式如下:
s=(*p)(實參);第35頁/共78頁8.3指針與數(shù)組8.3.1指向一維數(shù)組的指針數(shù)組名是一個常量指針,它的值為該數(shù)組的首地址
1.指向數(shù)組的指針的定義方法與指向基本類型變量的指針的定義方法相同,例如:inta[10]={1,3,5,7,9};int*p;p=&a[2];(把數(shù)組元素a[2]的地址賦給指針變量p)p=a;(把數(shù)組的首地址賦給指針變量p)第36頁/共78頁C語言規(guī)定:數(shù)組名代表數(shù)組首地址,是一個地址常量。因此,下面兩個語句等價:
p=&a[0];p=a;在定義指針變量的同時可賦初值:
inta[10],*p=&a[0];(或int*p=a;)等價于:int*p;p=&a[0];兩句。第37頁/共78頁指向數(shù)組的指針變量p&a[0]13151719pa[0]:a[9]p[9]a+0p+1
或a+1p+9
或a+9*(a+9)或*(p+9)第38頁/共78頁2.通過指針引用數(shù)組元素*p=5;表示對p當前所指的數(shù)組元素賦以一個值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡單地加1)。p+1意味著使p的原值(地址)加d個字節(jié)(d為一個數(shù)組元素所占的字節(jié)數(shù))。如果p的初值為&a[0],則:(1)p+i和a+i就是a[i]的地址,或者說它們指向a數(shù)組的第i個元素(見下頁圖)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即a[i]。(3)指向數(shù)組的指針變量也可以帶下標,如p[i]與*(p+i)、a[i]等價。第39頁/共78頁*(p+i)a數(shù)組a[0]a[1]a[2]a[i]a[9]pp+1,a+1p+i,a+ip+9,a+9綜上所述,引用一個數(shù)組元素有二法:(1)下標法:如a[i]形式;(2)指針法:如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。第40頁/共78頁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]);}例8.5用三種方法輸出數(shù)組全部元素。(1)下標法第41頁/共78頁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));}(2)通過數(shù)組名計算數(shù)組元素地址,輸出元素的值第42頁/共78頁(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
);}三種方法的比較:用下標法比較直觀,能直接知道是第幾個元素;而用指針法則執(zhí)行效率更高。第43頁/共78頁使用指針變量時,應注意:(1)指針變量可實現(xiàn)使本身的值改變。
P++合法;但a++不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運行中是固定不變的。)(2)要注意指針變量的當前值。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;第44頁/共78頁(3)*p++相當于*(p++),因為*與++優(yōu)先級相同,且結合方向從右向左,其作用是先獲得p指向變量的值,然后執(zhí)行p=p+1;(4)*(p++)與*(++p)意義不同,后者是先p=p+1,再獲得p指向的變量值。若p=a,則輸出*(p++)是先輸出a[0],再讓p指向a[1];輸出*(++p)是先使p指向a[1],再輸出p所指的a[1]。(5)(*p)++表示的是將p指向的變量值+1第45頁/共78頁8.3.2二維數(shù)組與多維數(shù)組的指針表示法1.二維數(shù)組的地址設有一個二維數(shù)組a,它有三行四列:inta[3][4];數(shù)組名a:代表整個二維數(shù)組的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(見下頁圖)
第46頁/共78頁數(shù)組名a代表整個二維數(shù)組的首地址:a[0]a[1]a[2]a===19173111971523上圖a數(shù)組包含三個元素:a[0],a[1],a[2].而每個元素又是一個一維數(shù)組,它包含4個元素(即4個列元素),如:a[0]又包含:a[0][0],a[0][1],a[0][2],a[0][3].第47頁/共78頁一維數(shù)組名a[i]:代表第i行的首地址,即第i行中第0列元素的地址(既&a[i][0])。a[i]+j:代表第i行中的第j個元素的地址,即為&a[i][j]。注意:地址變化的單位數(shù)值在不同的場合的實際字節(jié)數(shù)是不同的:“a+1”中的“1”實際代表數(shù)組中一行元素所占的總字節(jié)數(shù);“a[i]+1”中的“1”代表數(shù)組中一個元素所占的字節(jié)數(shù)。
第48頁/共78頁a+2
a數(shù)組a[0]a[1]a[2]aa+1(2000)(2008)(2016)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4個整型數(shù)據(jù)(即1個元素占2個字節(jié)),因此,這里+1
的含義是:+4*2=+8
個字節(jié).第49頁/共78頁
2000120023200452006720089201011201213201415201617201819202021202223aa+1a+2a[0]+1a[0]+2a[0]+3行地址,元素地址的表示法第50頁/共78頁例8.6用指針表示法輸出二維數(shù)組的各元素。#include<stdio.h>main(){staticinta[2][3]={{0,1,2,},{3,4,5}};intk,j,*p;
for(j=0;j<2;j++)/*方式1*/{for(k=0;k<3;k++)printf("%5d",*(a[j]+k));
/*a[j]是j行首地址,a[j]+k是j行k列元素的地址*/putchar(‘\n’);}putchar(‘\n’);第51頁/共78頁接上頁:for(j=0;j<2;j++)/*方式2*/{for(k=0;k<3;k++)printf("%5d",*(*(a+j)+k));
/**(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/putchar(‘\n’);}p=a;/*p指向數(shù)組的第一個元素*/
for(j=0;j<2;j++)/*方式3*/{for(k=0;k<3;k++)printf("%5d",*(p++));/*輸出p所指示的元素*/putchar(‘\n’);}}第52頁/共78頁
輸出的結果是:
012
345
012
345
012
345第53頁/共78頁2.指向二維數(shù)組的指針變量有兩種情況:一是直接指向數(shù)組元素的指針變量;二是指向一個含有m個元素的一維數(shù)組。這兩種不同形式的指針變量,其使用方法不同。指向數(shù)組元素的指針變量,即簡單指針變量,如:
int*p,a[3][4];p=&a[1][2];(2)指向由m個元素組成的一維數(shù)組的指針變量定義形式:類型(*指針變量)[元素個數(shù)]如:int(*p)[4];第54頁/共78頁注意:(1)int(*p)[4];定義一個指針變量p,p指向包含4個元素的一維數(shù)組。(2)p+i與*(p+i)的區(qū)別:
p+i是指向第i行的指針(第i行的首地址);*(p+i)是指向第i行第1個元素的地址;
兩者數(shù)值相等,但含義不同:p+i的增值將以行長為單位,而*(p+i)增值將以元素長度為單位。
第55頁/共78頁即:p+i+1將指向第i行再下一行的首地址,而*(p+i)+1將指向第i行首元素的下一個元素地址。(見下圖)設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]第56頁/共78頁例8.7main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;p=a;scanf("i=%d,j=%d",&i,&j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));}第57頁/共78頁8.4指針與字符串8.4.1字符串的指針表示法回顧:字符串可以保存在字符數(shù)組中,如。
main(){staticcharstring[]="ILoveChina!";printf("%s\n",string);}運行時輸出:ILoveChina!第58頁/共78頁用字符指針指向字符串:字符指針變量的定義:char*指針變量;如:char*p;(1)在定義時初始化指針變量使指針指向一個字符串。
main(){char*string=“ILoveChina!”;(初始化string)printf("%s\n",string);}
運行時也輸出:
ILoveChina!第59頁/共78頁char*str=“Ilovechina”,str1[40];等價于下列兩句:
char*str;str=“Ilovechina”;
以上語句的含義:
定義str為指針變量,它指向字符型數(shù)據(jù),且賦值語句把字符串“Ilovechina”的首地址賦給了指針變量str。對字符串的整體輸出實際上還是從指針所指示的字符開始逐個顯示(系統(tǒng)在輸出一個字符后自動執(zhí)行p++),直到遇到字符串結束標志符‘\0’為止。而在輸入時,亦是將字符串的各字符自動順序存儲在p指示的存儲區(qū)中,并在最后自動加上‘\0’。
Str1=“Ilovechina”;??第60頁/共78頁(2)用指針變量來實現(xiàn)對字符串的訪問
例8.8將一已知字符串第n個字符開始的剩余字符復制到另一字符串中。main(){inti,n;chara[]="computer";charb[10],*p,*q;p=a;q=b;scanf("%d",&n);if(strlen(a)>=n)p+=n-1;/*指針指到要復制的第一個字符*/
第61頁/共78頁for(;*p!='\0';p++,q++)*q=*p;*q='\0';/*字符串以’\0’
結尾*/printf("Stringa:%s\n",a);printf("Stringb:%s\n",b);}輸入:3↙輸出:computermputer考慮一下,若輸出語句改為如下語句會如何?printf(“stringais:%s\n”,p);printf(“stringbis%s\n”,q);第62頁/共78頁8.4.2字符串數(shù)組字符串數(shù)組:是指數(shù)組中的每個元素都是一個存放字符串的數(shù)組。字符串數(shù)組可以用一個二維字符數(shù)組來存儲。例如:charlanguge[3][10];數(shù)組的第一個下標決定字符串的個數(shù),第二個下標是字符串的最大長度(實際最多9個字符,‘\0’占一位置)。可以對字符串數(shù)組賦初值。例如:charlanguge[3][10];={“Basic”,“c++”,“pascal”}第63頁/共78頁8.5指針數(shù)組與命令行參數(shù)8.5.1指針數(shù)組
指針數(shù)組:是指針變量的集合。即它的每一個元素都是指針變量,且都具有相同的存儲類別和指向相同的數(shù)據(jù)類型。指針數(shù)組的定義形式為:
類型標識符*數(shù)組名[數(shù)組長度說明];例如:
int*p[10];由于[]比*的優(yōu)先級高,因此p先與[10]結合成p[10],而p[10]正是數(shù)組的定義形式,共有10個元素。最后p[10]與*結合,表示它的各元素可以指向一個整型變量。第64頁/共78頁指針數(shù)組廣泛應用于對字符串的處理例如有定義:
char*p[3];定義了一個具有三個元素p[0],p[1],p[2]的指針數(shù)組。每個元素都可以指向一個字符數(shù)組,或字符串。若利用數(shù)組初始化,則:char*p[3]={“Basic”,“c++”,“pascal”};
P[0]指向字符串“Basic”;P[0]指向字符串“c++”;P[0]指向字符串“pascal”;第65頁/共78頁例8.9字符指針數(shù)組的賦值
#defineNULL0main(){staticchara[]=“Fortran”;staticcharb[]=“COBOL”;staticcharc[]=“Pascal”;inti;char*p[4];p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;for(i=0;p[i]!=NULL;i++)printf(“Language%dis%s\n”,i+1,p[i]);}第66頁/共78頁例8.10有若干本書,將書名按字典順序排序#include<stdio.h>#include<string.h>main(){char*bname[]={"ProgramminginANSIC","BASIC","VisualC++6.0Programming","TRUBOC2.0"};inti,m;voidsort(char*name[],int);m=sizeof(bname)/sizeof(char*);/*字符串個數(shù)*/sort(bname,m);/*排序,改變指針的連接關系*/printf("\n");for(i=0;i<m;i++)/*輸出排序結果*/printf("%8s",bname[i]);}第67頁/共78頁voidsort(char*name[],intn)/*選擇排序*/
{char*t;
inti,j,k;/*k記錄每趟最小值下標*/
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)k=j;/*第j個元素更小*/
if(k!=i)/*最小元素是該趟的第一個元素則不需交換*/
{t=name[i];name[i]=name[k];name[k]=t;}
}
}
輸出結果為:
BASICProgramminginANSICTRUBOC2.0VisualC++6.0Programming
第68頁/共78頁注意:
(1)字符數(shù)組中每個元素可存放一個字符,而字符指針變量存放字符串首地址,而不是存放在字符指針變量中。
(2)對字符數(shù)組,與普通數(shù)組一樣,不能對其進行整體賦值,只能給各個元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,若有如下定義:
chara[10];
char*p;
則語句a=”computer”;是非法的,因為數(shù)組名a是一個常量指針,不能對其賦值。只能對各個元素分別賦值:
a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’;
但語句:p=”computer”;
是合法的。第69頁/共78頁8.5.2指針數(shù)組與命令行參數(shù)
在操作系統(tǒng)命令狀態(tài)下,可以輸入程序或命令使其運行,稱命令行狀態(tài)。輸入的命令(或運行程序)及該命令(或程序)所需的參數(shù)稱為命令行參數(shù)。如:copyfdfscopy是文件拷貝命令,fd、fs是命令行參數(shù)。main函數(shù)是可以有參數(shù)的,但與普通函數(shù)不同。帶形參的main()函數(shù)的一般形式是:main(intargc,char*argv[]){…}形參argc記錄命令行中字符串的個數(shù),argv是一個字符型指針數(shù)組,每一個元素順序指向命令行中的一個字符串。第70頁/共78頁1.main()函數(shù)的形參與實參
main()函數(shù)由系統(tǒng)自動調(diào)用,而不是被程序內(nèi)部的其它函數(shù)調(diào)用,main()函數(shù)所需的實參不可能由程序內(nèi)部得到,而是由系統(tǒng)傳送。
main()函數(shù)所需的實參與形參的傳遞方式也與一般函數(shù)的參數(shù)傳遞不同,實參是在命令行與程序名一同輸入,程序名和各實際參數(shù)之間都用空格分隔。
格式為:執(zhí)行程序名參數(shù)1參數(shù)2……
參數(shù)n形參argc為命令行中參數(shù)的個數(shù)(包括執(zhí)行程序名),其值大于或等于1,而不是象普通C語言函數(shù)一樣接受第一個實參。形參argv是一個指針數(shù)組,其元素依次指向命令行中以空格分開的各字符串。
即:第一個指針argv[0]指向的是程序名字符串,argv[1]指向參數(shù)1,argv[2]指向參數(shù)2,……,argv[n]指向參數(shù)n。第71頁/共78頁2.命令行參數(shù)的傳遞示例
例8.11分析下列程序,指出其執(zhí)行結果,該程序命名為exam.c,經(jīng)編譯連接后生成的可執(zhí)行程序為exam.exe#include<stdio.h>
main(int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版學校校辦工廠風險管理與承包經(jīng)營合同3篇
- 二零二五年度木材市場行情預測與分析咨詢合同4篇
- 2025年度環(huán)保材料研發(fā)與生產(chǎn)合作合同范本4篇
- 2025版旅游度假區(qū)租賃與旅游服務合作協(xié)議3篇
- 2025年度智能交通系統(tǒng)保密管理與服務合同
- 二零二五年度科技型中小企業(yè)貸款合同
- 2025年度知識產(chǎn)權授權委托書簽訂協(xié)議
- 2025年度門面出租合同終止與租賃合同終止后合同解除及違約賠償協(xié)議
- 2025年度銀行存款賬戶遠程開戶服務協(xié)議
- 2025年度私人房產(chǎn)使用權轉(zhuǎn)讓與智能家居系統(tǒng)安裝合同
- 2024年全國體育專業(yè)單獨招生考試數(shù)學試卷試題真題(含答案)
- 北師大版小學三年級上冊數(shù)學第五單元《周長》測試卷(含答案)
- DB45T 1950-2019 對葉百部生產(chǎn)技術規(guī)程
- 2025屆河北省衡水市衡水中學高考仿真模擬英語試卷含解析
- 新修訂《保密法》知識考試題及答案
- 電工基礎知識培訓課程
- 住宅樓安全性檢測鑒定方案
- 廣東省潮州市潮安區(qū)2023-2024學年五年級上學期期末考試數(shù)學試題
- 市政道路及設施零星養(yǎng)護服務技術方案(技術標)
- 《論語》學而篇-第一課件
- 《寫美食有方法》課件
評論
0/150
提交評論