![C語言基礎教學-CH7_第1頁](http://file4.renrendoc.com/view12/M02/3F/09/wKhkGWeKg9OAYQFPAADolJ7FI3s467.jpg)
![C語言基礎教學-CH7_第2頁](http://file4.renrendoc.com/view12/M02/3F/09/wKhkGWeKg9OAYQFPAADolJ7FI3s4672.jpg)
![C語言基礎教學-CH7_第3頁](http://file4.renrendoc.com/view12/M02/3F/09/wKhkGWeKg9OAYQFPAADolJ7FI3s4673.jpg)
![C語言基礎教學-CH7_第4頁](http://file4.renrendoc.com/view12/M02/3F/09/wKhkGWeKg9OAYQFPAADolJ7FI3s4674.jpg)
![C語言基礎教學-CH7_第5頁](http://file4.renrendoc.com/view12/M02/3F/09/wKhkGWeKg9OAYQFPAADolJ7FI3s4675.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
七、指針7.1指針概念7.2指針變量的定義和使用7.3指針與一維數(shù)組7.4指針與函數(shù)7.5指針數(shù)組、多級指針與指向一維數(shù)組的指針7.6指針與字符串7.1指針概念
所謂指針,某種程度上就相當于地址,但要比地址的含義更加豐富
?變量的指針變量的指針指的就是該變量的首地址
?指針變量指針變量是以指針(地址)為值的一種變量
?指針指向變量如有普通變量x及指針變量p,且p=&x;,則稱:指針p指向變量x
?指針變量的類型指針變量按其所指向變量類型的不同,也分成相應的多種不同類型,指針變量只允許指向相應類型的變量。例如:有定義:inta,*p;floatb,*q;
則允許:p=&a;q=&b;
不允許:p=&b;q=&a;p=q;q=p;?空指針指向地址為0的指針稱為空指針,空指針用于表示指向空,記為NULL,NULL是一個指針常量,對應0地址,在頭文件stdio.h中定義。7.2指針變量的定義和使用
?指針變量的定義
一般形式:數(shù)據(jù)類型*指針變量名;如:intn,*p;floatx,*p1,*p2;?取址運算符&
intn,*p;p=&n;?取值運算符*
intm,n,*p;p=&n;*p=5;m=*p;
?指針使用舉例
【例7.1】輸入一個整數(shù),通過指針方式賦值給另一個變量后輸出。#include<stdio.h>main(){intn,m,*p;
scanf("%d",&n);p=&n;m=*p;
printf("%d\n",m);}0x2000123412340x20000x20020x2004nmp地址內(nèi)存變量
?指針變量的初始化
inti,*p=&i;char*q="abcde";把字符串首地址賦給q
int*p=NULL;0地址賦給p
(指向空)
?指針必須先賦值再使用
intn,*p;定義指針變量p*p=5;可怕的錯誤
p=&n;*p=5;先賦值再使用7.3指針與一維數(shù)組
7.3.1一維數(shù)組的內(nèi)存安排
inta[]={10,11,12,13,14};int*p=a;0x20021112130x20040x2006a[1]a[2]pa[0]a[3]a[4]10140x20000x20080x2000p0x200a地址內(nèi)存變量7.3.2指向數(shù)組的指針運算
1.指向數(shù)組的指針
?指針可以指向數(shù)組中的某個元素
intc[5],*p,*q;p=&c[0];/*與p=c;等價*/q=&c[1];?指向整型數(shù)組的指針與指向單個整型變量的指針在指針類型上是一樣的,都是指向整型量的指針
intn,c[5],*p,*q=c;p=&n;2.指針的加減整數(shù)運算指針加減一個整數(shù),該整數(shù)表示的是該指針所指向數(shù)據(jù)類型的數(shù)據(jù)的個數(shù),指針實際的增加量或減少量是該整數(shù)乘以指針所指向數(shù)據(jù)類型的長度(字節(jié)數(shù))。例如:p為指針變量,則p=p+1后指向了原指向的數(shù)據(jù)的后面一個數(shù)據(jù)的首地址。如果p為字符型指針變量,則其增量為1字節(jié);如果p為整型指針變量,則其增量為2字節(jié);如果p為實型指針變量,則其增量為4字節(jié)。3.指針和所指向值的自增自減運算
?指針可以進行自增自減運算設p為指針,則有:
p++;++p;p--;--p;?對指針所指向的值也可以進行自增自減運算,如:
(*p)++;或++(*p);相當于*p=*p+1;(*p)--;或--(*p);相當于*p=*p-1;?指針與++、--和*運算符
++、--和*運算都是單目運算符,具有同等的優(yōu)先級,C語言規(guī)定單目運算符是右結合的
設有:intn,a[5]={0,1,2,3,4},*p=&a[2];
則:表達式作用和意義*++p先++p使p指向a[3],再取*p即a[3]值++*pp指向的元素值增1,即++a[2](*p)++先取*p即a[2]值,再使a[2]值增1,即a[2]++*(p++)先取*p即a[2]值,再使p增1指向a[3]
注:
*p++等價于*(p++)【例7.2】分析以下程序的運行結果。#include<stdio.h>main(){inta[]={10,11,12,13,14},*p,n,i;p=&a[0];n=*(p++);n+=*(++p);n+=(*(p+=2))++;n-=(*(--p))--;n-=*(--p-1);
printf("%d\n",n);for(i=1;i<5;i++)printf("%d",a[i]);}/*n=a[0]=10p→a[1]*//*p→a[2]n=n+a[2]=22*//*p→a[4]n=n+a[4]=36a[4]=15*//*p→a[3]n=n-a[3]=23a[3]=12
*//*p→a[2]n=n-a[1]=12
*//*p→a[0]*//*12*//*1011121215*/4.指針的比較運算
?任意兩個指針可以進行相等比較,以確定它們是否指向同一個變量
?兩個指針指向同一數(shù)組時,可進行比較運算(含
<、<=、>、>=、!=、==)。以確定它們在數(shù)組中的前后位置值。例:指針關系運算舉例。#include"stdlib.h"#include"time.h"main(){inta[20],*p,*q,n1,n2;randomize();/*初始化隨機數(shù)發(fā)生器*/n1=random(20);n2=random(20);p=a+n1;/*
p指向a[n1]
*/q=a+n2;/*
q指向a[n2]
*/if(p==q)printf("\npandqpointssameelement.");elseif(p<q)printf("\nppointsforwards.");elseprintf("\nqpointsforwards.");
printf("\np=%xq=%x",p,q);}5.指針的相減運算
只有指向同一組類型相同數(shù)據(jù)的指針之間,進行減法運算才有意義,運算結果為整數(shù),表示兩指針間相隔的數(shù)據(jù)個數(shù)。例:指針間的加減運算示例。
main(){inta[20],*p,*q;p=&a[2];q=&a[6];
printf("\nq=%x\np=%x\nq-p=%d",q,p,q-p);}/*q-p應為4。*/7.3.3下標法與指針法表示的等價性
1.數(shù)組名作為指針常量
?數(shù)組名作為一個指針,表示整個數(shù)組的首地址,它同時也是數(shù)組第一個元素的地址。設有定義:inta[5],*p;
則:p=a;與p=&a[0];等價
p=a+1;與p=&a[1];等價*(a+2)與a[2]等價
?數(shù)組名作為指針類型的常量,下列運算非法的:
a++、--a、a=…、a+=…等2.在指針中使用下標運算符
?下標運算符[]可以和指針配合使用,可將指針看成是一個指向某個數(shù)組的指針,允許使用下標法表示所指向數(shù)組中的元素
如有定義:inta[5],*p=a;
則:a[2]p[2]*(a+2)*(p+2)等價
?當指針不是指向數(shù)組的第一個元素時,同一個數(shù)組元素的下標是不同的,并允許下標取負數(shù)如有定義:inta[5],*p=a,*q=a+2;
則:q[0]與a[2]為同一個數(shù)組元素*(q-2)與q[-2]都是a[0]3.下標法表示與指針法表示的等價性
變量定義語句
inta[5],*p=a,*q=a+2;表達式含義
apq下標指針下標指針下標指針數(shù)值第1個元素
a[0]
*ap[0]
*pq[-2]
*(q-2)第3個元素a[2]
*(a+2)
p[2]
*(p+2)
q[0]*q指針指向第1個
&a[0]
a&p[0]
p&q[-2]
q-2指向第3個
&a[2]
a+2
&p[2]
p+2&q[0]q等
價
性
x[i]與*(x+i)等價
&x[i]與x+i等價
7.3.4程序舉例
【例7.3】使用指針法輸入5個整數(shù),計算并輸出平均值。#defineN5/*下標法*/main(){inta[N],i,s;for(i=0;i<N;i++)
scanf("%d",&a[i]);for(s=0,i=0;i<N;i++)s+=a[i];
printf("%f\n",(float)s/N);}/*指針法*/#defineN5main(){inta[N],i,s,*p;for(p=a;p<a+N;p++)
scanf("%d",p);for(s=0,p=a;p<a+N;p++)s+=*p;
printf("%f\n",(float)s/N);}例:寫出下列程序的輸出結果。#include"stdio.h"main(){voidfun(int*,int,int);
inti,s[]={0,1,2,3,4,5};fun(s,0,3);fun(s,2,5);for(i=0;i<6;i++)
printf("s[%d]=%d",i,s[i]);}voidfun(int*a,int
n,intm){intt;while(n<m){t=*(a+n);*(a+n)=*(a+m);*(a+m)=t;n++;m--;}}運行結果:s[0]=3s[1]=2s[2]=5s[3]=4s[4]=0s[5]=17.4指針與函數(shù)
7.4.1指針作為函數(shù)參數(shù)
1.傳遞單個變量指針將單個變量的指針傳遞給函數(shù)往往是為了讓函數(shù)能通過該指針反過來修改主調(diào)函數(shù)的變量值例如:scanf("%d",&n);
主調(diào)函數(shù)將變量n的指針(&n)傳遞給scanf函數(shù),
scanf函數(shù)將鍵盤上輸入的數(shù)值通過該指針存到主調(diào)函數(shù)的變量n中?!纠?.4】編寫函數(shù),使得能交換二個變量的值。voidswap(int*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;}main(){intx,y;
scanf("%d%d",&x,&y);swap(&x,&y);
printf("x=%d,y=%d\n",x,y);}2.傳遞數(shù)組傳遞數(shù)組傳遞的其實是數(shù)組的首地址
【例7.5】編寫函數(shù),使用冒泡法對數(shù)組從小到大排序。voidswap(int*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;}voidsort(inta[],intn){inti,j;for(i=0;i<n-1;i++)for(j=0;j<n-1-i;j++)if(a[j]>a[j+1])swap(&a[j],&a[j+1]);}main(){intx[10],i;for(i=0;i<10;i++)
scanf("%d",&x[i]);sort(x,10);for(i=0;i<10;i++)
printf("%d",x[i]);
printf("\n");}7.4.2指針做為函數(shù)返回類型
【例7.6】編寫函數(shù),在一個已從小到大排序的數(shù)組中查找一個指定的數(shù),如果找到,返回指向數(shù)組中該數(shù)的指針,否則返回空指針。int*find(int*a,intn,intdata)/*數(shù)組a長度n待查數(shù)data*/{int*p=a,*q=a+n,*r;while(p<q)/*待查找區(qū)不為空時*/{r=p+(q-p)/2;/*待查找區(qū)的中點位置*/if(*r==data)returnr;/*如找到,返回該指針*/elseif(*r<data)p=r+1;/*比中點大,在后半?yún)^(qū)*/elseq=r-1;/*比中點小,在前半?yún)^(qū)*/}returnNULL;/*沒找到,返回空指針*/}main(){intx[]={11,22,33,44,55,66,77,88,99,100},d,*p;
scanf("%d",&d);/*輸入要查找的數(shù)*/p=find(x,10,d);/*調(diào)用查找,結果賦值給p*/if(p!=NULL)/*判斷是否找到數(shù)*/
printf("Foundat%d\n",p-x);/*找到,輸出下標*/else
printf("NotFound.\n");/*沒找到*/}7.4.3動態(tài)內(nèi)存分配與釋放函數(shù)
在處理實際問題時,常會遇到數(shù)組的大小要在程序執(zhí)行中才能確定的情況,合理的方法是在程序中再決定數(shù)組的大小。
C語言提供了動態(tài)存儲分配函數(shù),可在程序運行過程中,動態(tài)分配內(nèi)存區(qū)供數(shù)據(jù)存儲,可根據(jù)需要指定大小,以及不需時予以釋放。
下面介紹動態(tài)存儲分配函數(shù)中的malloc()和free(),在stdlib.h和alloc.h頭文件中均含有它們的原型。?內(nèi)存分配函數(shù)malloc()
原型:void*malloc(unsignedsize);
功能:內(nèi)存中分配一塊連續(xù)的size個字節(jié)的未初始化的存儲區(qū)。返回一指向該區(qū)首址的void*
類型(稱通用型或無類型)指針,須按實際需要的數(shù)據(jù)類型進行強制轉換,才能賦值給相應的指針變量。如無法分配,則返回空指針?內(nèi)存釋放函數(shù)free()
原型:void*free(void*buffer);
功能:釋放buffer所指向的由malloc()等內(nèi)存分配函數(shù)所分配的內(nèi)存塊?!纠?.7】輸入n和n個整數(shù),輸出其中不重復出現(xiàn)的整數(shù),要求:只要內(nèi)存容量許可,不對n的上限做明顯的限定。#include<stdlib.h>main(){int*p,n,i,j,ct;
scanf("%d",&n);p=(int*)malloc(n*sizeof(int));if(p==NULL){printf("Thereisnotenoughmemory.\n");return-1;}
for(i=0;i<n;i++)
scanf("%d",&p[i]);for(i=0;i<n;i++){for(ct=0,j=0;j<n;j++)if(p[i]==p[j])ct++;if(ct==1)
printf("%d\t",p[i]);}free(p);
printf("\n");}運行結果:輸入:811335115544100輸出:33441007.4.4函數(shù)指針
1.函數(shù)指針的定義和使用
?函數(shù)指針的概念
函數(shù)名具有類似數(shù)組名的地址特性:數(shù)組名—該數(shù)組的首地址函數(shù)名—該函數(shù)的入口地址一個函數(shù)作為一段程序,在內(nèi)存中占據(jù)一片連續(xù)的存儲單元,其中第一條執(zhí)行指令所在的位置稱為函數(shù)的入口地址,取值為函數(shù)入口地址的指針變量,稱為指向函數(shù)的指針變量,簡稱函數(shù)指針。通過該指針可以調(diào)用并執(zhí)行函數(shù)。
?函數(shù)指針的定義格式
函數(shù)值類型(*函數(shù)指針變量名)
(參數(shù)說明表);
參數(shù)說明表中可只說明形參類型,而無形參本身。
如省略參數(shù)說明表,系統(tǒng)不檢查參數(shù)傳遞正確性;例如:有函數(shù)說明:int
max(int,int),abs(int);
如要定義一個用來指向max函數(shù)的指針變量,則可定義如下:
int(*p)(int,int);或int(*p)();
?函數(shù)指針的使用
給函數(shù)指針變量賦值時,只需給出函數(shù)名而不必(也不能)給出參數(shù)。如:
inta,b,c,max(int,int),(*p)();
p=max;/*p為函數(shù)指針變量,max為函數(shù)名*/
函數(shù)可通過函數(shù)名調(diào)用,也可通過函數(shù)指針調(diào)用,
如上例后,只需用(*p)代替函數(shù)名max即可。如:
c=max(a,b);/*通過函數(shù)名調(diào)用*/c=(*p)(a,b);/*通過函數(shù)指針調(diào)用*/
對函數(shù)指針變量,象p+i、p++、p--等運算無意義。2.函數(shù)指針做函數(shù)的參數(shù)
【例7.8】求三角函數(shù)sin(),cos()和tan()在10度,
20度,30度,40度和50度時的數(shù)值。#include<math.h>voidprintvalue(double(*fun)(double),intn){inti;for(i=1;i<=n;i++)
printf("%d\t%lf\n",i*10,(*fun)(3.14159*i/18));}main(){printvalue(sin,5);printvalue(cos,5);
printvalue(tan,5);}3.函數(shù)指針數(shù)組函數(shù)指針可以組成指針數(shù)組,稱為函數(shù)指針數(shù)組,該數(shù)組的元素都是函數(shù)指針。定義格式:
數(shù)據(jù)類型(*函數(shù)指針數(shù)組名[常量表達式])()
其中常量表達式的值表示函數(shù)指針數(shù)組的長度。例:用循環(huán)語句for,while,do-while和if-goto編制計算的函數(shù),并驗證其正確性。要求用函數(shù)指針數(shù)組longsum1(intn){inti;longsum=0;for(i=1;i<=n;i++)sum+=i;returnsum;}longsum2(intn){inti=0;longsum=0;while(++i<=n)sum+=i;returnsum;}longsum3(intn){inti=0;longsum=0;dosum+=i;while(i++<=n);returnsum;}longsum4(intn){inti=0;longsum=0;ss:sum+=i;if(i++<=n)goto
ss;returnsum;}main(){long(*f[4])(),k;
inti,n;
printf("\ninputanumber:");
scanf("%d",&n);f[0]=sum1;f[1]=sum2;f[2]=sum3;f[3]=sum4;k=(*f[0])(n);for(i=1;i<4;i++)if(k!=(*f[i])(n)){k=-1;break;}if(k==-1)printf("Error!");elseprintf("Right.sum=%ld",k);}7.5指針數(shù)組、多級指針與
指向一維數(shù)組的指針7.5.1指針數(shù)組與多級指針1.指針的數(shù)組
?一個數(shù)組的元素的都為指針類型數(shù)據(jù),稱為指針數(shù)組
?定義格式:
數(shù)據(jù)類型*指針數(shù)組名[常量表達式]
其中常量表達式的值表示數(shù)組的元素個數(shù)。例:int*b[3];
指針數(shù)組b的每個元素相當于可以指向一般整型變量,也可以指向整型數(shù)組元素的指針變量。2.多級指針
?指針變量中可以保存另一個指針的地址,變成
“指向指針的指針”,稱為多級指針。例如:有指針數(shù)組name,其元素是指向一般數(shù)據(jù)的指針。令指針變量p=name,p指向指針數(shù)組name。
則稱指針變量p為二級指針。如有指針變量pp再指向p,則稱pp為三級指針。
?多級指針的定義二級指針的定義形式:數(shù)據(jù)類型**指針名三級指針的定義形式:數(shù)據(jù)類型***指針名從上可知,n級指針定義時,指針名前應加n個*。3.
數(shù)據(jù)的訪問如有:intx[3],y,z[2],*pa[3],**p2;pa[0]=x;pa[1]=&y;pa[2]=z;p2=pa;
則層次關系為:則有(每行等價):*(*(p2+0)+j)p2[0][j]*(pa[0]+j)pa[0][j]x[j]*(*(p2+1))
p2[1][0]*pa[1]pa[1][0]y*(*(p2+2)+j)p2[2][j]*(pa[2]+j)pa[2][j]z[j]yx[2]x[1]x[0]z[0]z[1]p2pa[1]pa[0]pa[2]例:將8個字符串按詞典順序排列。⑴用二維數(shù)組#include"string.h"#defineSIZE8main(){charname[SIZE][10]={"constant","pointer","function","variable","address","structue","union","array"};
inti,j,k;chartemp[10];
for(i=0;i<SIZE-1;i++)/*選擇法排序*/ {k=i; for(j=i+1;j<SIZE;j++)
if(strcmp(name[k],name[j])>0)k=j;if(k!=i){strcpy(temp,name[k]);
strcpy(name[k],name[i]);
strcpy(name[i],temp);}}for(i=0;i<SIZE;i++)
printf("%s\n",name[i]);}⑵用指針數(shù)組#include"string.h"#defineSIZE8main(){ char*name[SIZE]={"constant","pointer","function","variable","address","structue","union","array"};
inti,j,k;char*temp;
for(i=0;i<SIZE-1;i++)/*選擇法排序*/ {k=i; for(j=i+1;j<SIZE;j++)
if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[k];name[k]=name[i];name[i]=temp;}}for(i=0;i<SIZE;i++)
printf("%s\n",name[i]);}⑶用二級指針#include"string.h"#defineSIZE8main(){ char*name[SIZE]={"constant","pointer","function","variable","address","structue","union","array"};
inti,j,k;char*temp,**p;
p=name;for(i=0;i<SIZE-1;i++)/*選擇法排序*/ {k=i; for(j=i+1;j<SIZE;j++)
if(strcmp(*(p+k),*(p+j))>0)k=j;if(k!=i)/*原name[k],name[j]*/{temp=*(p+k);/*原name[k]*/
*(p+k)=*(p+i);/*原name[k]=name[i]*/
*(p+i)=temp;/*原name[i]*/}}for(i=0;i<SIZE;i++)
printf("%s",*(p++));}/*原name[i]*/7.5.2二維數(shù)組與
指向一維數(shù)組的指針1.二維數(shù)組的內(nèi)存安排
二維數(shù)組各元按行連續(xù)存放在一塊內(nèi)存區(qū)域2.將二維數(shù)組看成是二重一維數(shù)組構成的數(shù)組如有定義:inta[3][4];
第一重有3個一維數(shù)組:a[0]、a[1]和a[2],每個一維數(shù)組分別包含4個元素;
第二重一維數(shù)組為數(shù)組a,它包含a[0]、a[1]和
a[2]共3個元素;第一重對應二維數(shù)組中第二維的下標第二重對應二維數(shù)組中第一維的下標3.二維數(shù)組的指針法表示a[1][0]a[0][2]a[0][1]a[0][0]a[2][0]aa[1]a[0]a[2]a[0][3]a[1][1]a[1][2]a[1][3]a[2][1]a[2][2]a[2][3]二維數(shù)據(jù),3個一維數(shù)組,第一重虛擬的指針數(shù)組第二重虛擬的二級指針,指向一維數(shù)組的指針
?a[0]、a[1]、a[2]作為一維數(shù)組名是地址常量,有:
a[i]+j與&a[i][j]
等價*(a[i]+j)與a[i][j]等價
?二維數(shù)組a可以看成由三個元素(一維數(shù)組名)
a[0]、a[1]、a[2]組成,因而就有:
a+i與&a[i]與a[i]指向同一地址
?基于a+i與&a[i]指向同一地址,可得出:*(a+i)與a[i]等價*(a+i)+j與&a[i][j]指向同一地址*(*(a+i)+j)與a[i][j]等價綜上所述,在二維數(shù)組a中:
a+i=a[i]=*(a+i)=&a[i]=&a[i][0]
(地址值相等)
a=a[0]=*(a+0)=*a=&a[0]=&a[0][0]
(地址值相等)
a[i]+j=*(a+i)+j=&a[i][j]
(地址值相等)
*(a[i]+j)=*(*(a+i)+j)=(*(a+i))[j]=a[i][j](同一元素值)4.指向一維數(shù)組的指針
?用inta[3][4];定義的二維數(shù)組名a指向一維數(shù)組
a[0]的第1個元素,a+1指向一維數(shù)組a[1]的第1個元素,…a+i指向一維數(shù)組a[i]的第1個元素,即a指向的變化是以行為單位的。這類特殊的指針稱為指向一維數(shù)組的指針。
?指向一維數(shù)組的指針變量的定義格式
數(shù)據(jù)類型(*指針變量名)[常量表達式]
其中常量表達式的值等于所指向的一維數(shù)組的元素個數(shù)。例1:建立一個3×4的矩陣,使各元素的值為1~12的整數(shù)。要求使用指向一維數(shù)組的指針。main(){inti,j,k=1,a[3][4],(*pa)[4]=a;for(i=0;i<3;i++)for(j=0;j<4;j++)
*(*(pa+i)+j)=k++;/**(*(pa+i)+j)
表示
a[i][j]
*//*或
*(pa[i]+j)
或
(*(pa+i))[j]
或
pa[i][j]*/for(;pa<a+3;pa++)for(j=0;j<4;j++)
printf("%d",*(*pa+j));}例2:設有以下定義語句:
inta[3][2]={10,20,30,40,50,60},(*p)[2];p=a;
則*(*(p+2)+1)的值為______。607.5.3二維數(shù)據(jù)的構造舉例
【例7.9】構造一個數(shù)據(jù)結構,它能表示一個年級所有學生的成績(只考慮一門課程,成績使用int類型表示),設年級共有4個班,一班50人,二班30人,三班60人,四班40人。
1.使用二維數(shù)組和指向一維數(shù)組的指針
/*二維數(shù)組,最多4個班,每班最多60個學生*/
intstu[4][60];/*指向一維數(shù)組的指針,每行60個整型數(shù),指向二維數(shù)組*/
int(*p1stu)[60]=stu;
2.在二維數(shù)組基礎上的指針數(shù)組與二級指針
/*二維數(shù)組,最多4個班,每班最多60個學生*/
intstu[4][60];/*指針數(shù)組指向二維數(shù)組的4個不同的行*/
int*pastu[4]={stu[0],stu[1],stu[2],stu[3]};/*再在指針數(shù)組的基礎上構造二級指針*/
int**p2stu=pastu;3.在多個一維數(shù)組基礎上的指針數(shù)組與二級指針
/*定義多個一維數(shù)組,一班有50個學生,二班有30個學生
,
三班有60個學生,四班有40個學生*/
intstu1[50],stu2[30],stu3[60],stu4[40];
/*在這4個一維數(shù)組的基礎上構造指針數(shù)組*/
int*pastu[4]={stu1,stu2,stu3,stu4};/*再構造一個二級指針變量將所有有信息歸結到一個單
一變量*/
int**p2stu=pastu;4.訪問學生成績訪問第i個班第j個學生(i和j從0開始取值)的成績,可以使用以下表達式:
stu[i][j]/*二維數(shù)組,下標+下標表示法*/(*(p1stu+i))[j]/*指向一維數(shù)組的指針,指針+下標*/*(pastu[i]+j)/*指針數(shù)組,下標+指針表示法*/*(*(p2stu+i)+j)/*二級指針,指針+指針表示法*/為了簡化格式,避免書寫的錯誤,可以統(tǒng)一使用二重下標法,如下所示:
stu[i][j]/*二維數(shù)組*/p1stu[i][j]/*指向一維數(shù)組的指針*/
pastu[i][j]/*指針數(shù)組*/p2stu[i][j]/*二級指針*/7.6指針與字符串7.6.1字符串的內(nèi)存安排1.字符數(shù)組的初始化2.字符數(shù)組的輸入
chara[10]="Hello!"chara[10];gets(a);'H''e''!''l''l''o''\0'0000x20000x20010x20020x20030x20040x20050x20060x20070x20080x2009地址內(nèi)存變量a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]'H''e''!''l''l''o''\0'???0x20000x20010x20020x20030x20040x20050x20060x20070x20080x2009地址內(nèi)存變量a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]3.字符串常量和字符指針的初始化
char*p="Hello!";'H''e''!''l''l''o''\0'?0x20100x20100x20110x20120x20130x20140x20150x20160x2017…0x2020地址內(nèi)存變量pp7.6.2字符串處理程序舉例
【例7.10】編程,輸入一行字符,將其中以一個或多個空格分開的子串稱為單詞,將奇數(shù)位置的單詞轉換為大寫,偶數(shù)位置的單詞保持不變,所有單詞重新組織后輸出,輸出時單詞之間使用"---"連接,行首以"[B]"開始,行尾以"[E]"結束。例如,輸入(符號
表示空格):
how
are
you?
*#@-aBc-123-$$$
則輸出:[B]HOW---are---YOU?---*#@-aBc-123-$$$[E]#include<stdio.h>#include<string.h>/*字符串轉換為大寫函數(shù)*/char*toucase(char*str){char*p;for(p=str;*p!='\0';p++)if(*p>='a'&&*p<='z')*p=*p-'a'+'A';returnstr;}/*從字符串中取出下一個單詞*/char*getnextword(char*str,char*word){char*p;for(p=str;*p=='';p++);/*過濾前導的空格*/
/*循環(huán)至單詞結束*/for(;*p!=''&&*p!='\0';p++,word++)*word=*p;/*復制單詞*/*word='\0';/*單詞結束*/for(;*p=='';p++);/*過濾單詞尾部空格*/returnp;/*返回下一個非空格的位置*/}main(){charstra[81],strb[81],word[81],*p=stra;intn=0;gets(stra);
strcpy(strb,"[B]");/*產(chǎn)生行首子串*/while(*p!='\0')
{p=getnextword(p,word);/*取出下一個單詞*/if(n!=0)strcat(strb,"---");/*加連接子串*/if(n%2!=0)strcat(strb,word);/*直接拼接*/elsestrcat(strb,toucase(word));/*先大寫再拼接*/n++;/*單詞個數(shù)統(tǒng)計*/
}
strcat(strb,"[E]");/*拼接行尾子串*/puts(strb);}例:下面程序的輸出結果是__________。charb[]="ABCD";main(){char*chp;
for(chp=b;*chp;chp+=2)
printf("%s",chp);
printf("\n");}ABCDCD7.6.3多字符串的表示與處理
多字符串實際上就是二維的字符數(shù)據(jù),可以采用二維的字符數(shù)組,也可以采用字符的指針數(shù)組形式表示,或者二者結合?!纠?.11】編程,輸入一行字符,將其中的單詞按逆順序輸出,例如,輸入(符號
表示空格):
how
are
you?
*#@-aBc-123-$$$
則輸出:*#@-aBc-123-$$$ you? are how#defineMAXN 40int
getallwords(char*str,char*pp[],int
maxn){char*p;intn;p=str;n=0;while(*p!='\0'){p=getnextword(p,pp[n]);/*分離出第n個單詞*/if(pp[n][0]!='\0')n++;if(n>=maxn)break;}returnn;}main(){charstra[81],words[MAXN][81],*pa[MAXN];
inti,n;gets(stra);for(i=0;i<MAXN;i++)pa[i]=words[i];n=getallwords(stra,pa,MAXN);for(i=n-1;i>=0;i--)
printf("%s\t",words[i]);
printf("\n");}7.6.4程序舉例
例1:編寫函數(shù),把字符串t接在字符串s之后,返回新字符串首地址。char*strjion(char*s,char*t){char*p;p=s;/*保存s
*/
while(*s)s++;/*找字符串s末尾*/
while(*s++=*t++);/*連接
*/returnp;
/*返回指向連接后新字符串的指針*/}例2:從鍵盤輸入兩個字符串,不使用庫函數(shù)strcmp()
來比較它們的大小,若相等,則輸出:“Bothequal.”,否則輸出其中較大者。main(){chara[80],b[80],*p,*q;gets(a);gets(b);for(p=a,q=b;*p&&*q&&*p==*q;p++,q++);if(*p>*q)puts(a);elseif(*p<*q)puts(b);elseif(*p=='\0'&&*q=='\0')puts("Bothequal.");}
例3:編一個程序,輸入一個字符串,內(nèi)容依次是學號(位數(shù)不定)和姓名的漢語拼音碼。經(jīng)處理后,輸出一個字符串,內(nèi)容依次為,姓名,兩個*號和學號。main()/*(1)不使用庫函數(shù)*/{chara[40],b[40],*p=a,*q=b,*r;gets(a);/*定位姓名的首字符位置*/while(*p>='0'&&*p<='9')p++;r=p;/*記存姓名的首字符位置*/while(*q++=*p++);/*將姓名放入數(shù)組b*/*(q-1)='*';/*數(shù)組b中尾隨姓名的'\0'
改為'*'
*/
*q++='*';/*數(shù)組b中再加一
'*'
*/*r='\0';/*使a數(shù)組的學號尾隨'\0'*/p=a;while(*q++=*p++);/*將學號放入數(shù)組b的'*'
之后*/puts(b);}#include"string.h"/*(2)使用庫函數(shù)*/main(){chara[40],b[40],*p;gets(a);/*定位姓名的首字符位置*/for(p=a;p>='0'&&*p<='9';p++);
strcpy(b,p);/*將姓名復制到數(shù)組b*/
strcat(b,"**");/*數(shù)組b中姓名后加兩個
'*'
*/*p='\0';/*使a數(shù)組的學號尾隨'\0'*/
strcat(b,a);/*將學號放入數(shù)組b中**
之后*/
puts(b)例4:編程,將字符串s中所有t子串用q子串替換后輸出,s、t和q字符串從鍵盤輸入。#include"stdio.h"#include
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國慶節(jié)安全教育活動方案
- 現(xiàn)代辦公樓中的綠色建筑設計方案
- 大型吊裝方案
- Unit 5 In the park 第1課時(說課稿)-2024-2025學年人教新起點版英語二年級上冊001
- Module1 Unit2 She didn't have a television(說課稿)-2023-2024學年外研版(三起)英語五年級下冊
- 1 感受我們的呼吸 說課稿-2023-2024學年科學四年級上冊教科版
- 2024年學年七年級語文上冊 第九單元 走進科學 第16課《探索者1號》說課稿1 新疆教育版
- 4 長方形和正方形的周長(說課稿)-2024-2025學年三年級上冊數(shù)學人教版
- 2025園林工程合同
- 2025精裝修工程合同范本
- 頸復康腰痛寧產(chǎn)品知識課件
- 2024年低壓電工證理論考試題庫及答案
- 微電網(wǎng)市場調(diào)查研究報告
- 《民航服務溝通技巧》教案第14課民航服務人員上行溝通的技巧
- 中國古代舞蹈史
- MT/T 538-1996煤鉆桿
- 小學六年級語文閱讀理解100篇(及答案)
- CB/T 467-1995法蘭青銅閘閥
- 氣功修煉十奧妙
- 勾股定理的歷史與證明課件
- 中醫(yī)診斷學八綱辨證課件
評論
0/150
提交評論