版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章指針《C語言程序設(shè)計》C程序設(shè)計中使用指針可以: 使程序簡潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動態(tài)分配內(nèi)存得到多于一個的函數(shù)返回值主要內(nèi)容指針的含義指針變量指針與數(shù)組指針與函數(shù)小結(jié)
6.1指針的含義變量與地址程序中:intii;
floatfk;
內(nèi)存中每個字節(jié)有一個編號-----地址…...…...2000200120022005內(nèi)存02003iifk
編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元變量是對程序中數(shù)據(jù)存儲空間的抽象說明:1.內(nèi)存變量、內(nèi)存單元的地址和內(nèi)存單元中的內(nèi)容一個變量名與該變量所占的內(nèi)存空間首地址一一對應(yīng);通過內(nèi)存變量名來對內(nèi)存單元進行存取操作;編譯時將變量名轉(zhuǎn)換為變量的地址2.對變量值的訪問方式:直接訪問:按變量地址存取變量值間接訪問:將變量ii地址存放在另一個變量ip中,首先通過變量ip找到變量ii的首地址,然后在訪問變量ii.3.指向的概念變量ip中存放變量ii的地址,即稱ip指向ii。變量ip稱為指針變量…...…...2000200420062005整型變量ii10變量i_pointer200120022003指針與指針變量指針:一個變量的地址指針變量:專門存放變量地址的變量叫指針變量2000指針指針變量變量的內(nèi)容變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量&與*運算符含義含義:取變量的地址單目運算符優(yōu)先級:2結(jié)合性:自右向左含義:
取指針?biāo)赶蜃兞康膬?nèi)容單目運算符優(yōu)先級:2結(jié)合性:自右向左例:&a為取變量a的地址,*p取指針?biāo)赶虼鎯卧臄?shù)據(jù)?!?..…...2000200420062005整型變量ii10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointeriii_pointer&ii&(*i_pointer)ii*i_pointer*(&ii)i_pointer
=
&ii
=
&(*i_pointer)ii
=
*i_pointer
=
*(&ii)直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量例
ii=3;-----直接訪問指針變量…...…...2000200420062005整型變量ii10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問20指針變量…...…...2000200420062005整型變量ii10變量i_pointer2001200220032000整型變量ik10例
ik=ii;ik=*i_pointer;ii=*i_pointer+100;相當(dāng)于: ii=ii+100;同樣,與下面的語句也是等價的。 *ipointer=ii+100;例
ik=ii;--直接訪問
ik=*i_pointer;--間接訪問6.2
指針變量C語言規(guī)定所有變量在使用前必須定義。定義指針變量的一般形式為: 基類型*指針變量名;例如:
int*pi; float*pf;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值6.2指針變量指針變量與其所指向的變量之間的關(guān)系指針變量的定義一般形式:[存儲類型]
基類型*指針名;3變量i2000i_pointer*i_pointerii*i_pointer&iii_pointerii=3;*i_pointer=33變量ii2000i_pointer*i_pointerii*i_pointer&iii_pointerii=3;*i_pointer=3例int
*pi1,*pi2;float*qf;staticchar*name;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值指針變量的初始化一般形式:[存儲類型]
數(shù)據(jù)類型*指針名=初始地址值;賦給指針變量,不是賦給目標(biāo)變量例intii;int*pi=ⅈ變量必須已說明過類型應(yīng)一致例
int*p=ⅈ
int
ii;例intii;int*pi=ⅈint*pq=pi;用已初始化指針變量作初值例
voidmain(){intii;staticint*pi=ⅈ..............}(
)不能用auto變量的地址去初始化static型指針例#include<stdio.h>
voidmain(){intii=10;int*pi;*pi=ii;printf(“%d”,*pi);}危險!例
#include<stdio.h>
voidmain(){intii=10,ik;int*pi;
pi=&ik;*pi=ii;printf(“%d”,*pi);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量ii10指針變量pi200120022003隨機零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:int*p=0;
p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:防止指針變量的非法引用在程序中常作為狀態(tài)比較例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時要進行強制類型轉(zhuǎn)換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量6.2
指針變量6.2
指針變量例6.1舉例說明指針。程序的輸出結(jié)果為: icount=1,ix=1
#include<stdio.h>voidmain(){inticount=0,ix;int*pi;pi=&icount;icount++;ix=*pi;printf("icount=%d,ix=%d\n",icount,ix);}…...…...f86f8af8cf8b變量icount0指針變量pif87f88f89f86變量ix11例指針的概念#include<stdio.h>voidmain(){intia;int*pa=&ia;ia=10;printf(“ia:%d\n",ia);printf("*pa:%d\n",*pa);printf("&ia:%x(hex)\n",&ia);printf("pa:%x(hex)\n",pa);printf("&pa:%x(hex)\n",&pa);}運行結(jié)果:ia:10*pa:10&ia:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型變量ia10指針變量paf87f88f89f86例輸入兩個數(shù),并使其從大到小輸出#include<stdio.h>voidmain(){int*p1,*p2,*p,ia,ib;scanf("%d,%d",&ia,&ib);p1=&ia;p2=&ib;if(ia<ib){p=p1;p1=p2;p2=p;}printf(“ia=%d,ib=%d\n",ia,ib);printf("max=%d,min=%d\n",*p1,*p2);}運行結(jié)果:ia=5,ib=9max=9,min=5…...…...指針變量p1指針變量p20002008200220042006指針變量p2整型變量ib整型變量ia5200692008200620082006指針變量作為函數(shù)參數(shù)——地址傳遞特點:共享內(nèi)存,“雙向”傳遞#include<stdio.h>voidswap(intix,intiy){intitemp;temp=ix;ix=iy;iy=temp;}voidmain(){intia,ib;scanf("%d,%d",&ia,&ib);if(ia<ib)swap(ia,ib);printf("\n%d,%d\n",ia,ib);}例
將數(shù)從大到小輸出…...…...20002008200A2002200420065變量ia變量ib(main)9變量itemp變量iy變量ix(swap)55959COPY指針變量作為函數(shù)參數(shù)——地址傳遞特點:共享內(nèi)存,“雙向”傳遞#include<stdio.h>swap(intix,intiy){intitemp;itemp=ix;ix=iy;iy=itemp;}voidmain(){intia,ib;scanf("%d,%d",&ia,&ib);if(ia<ib)swap(ia,ib);printf("\n%d,%d\n",ia,ib);}例
將數(shù)從大到小輸出值傳遞運行結(jié)果:5,9#include<stdio.h>swap(int*p1,int*p2){intip;ip=*p1;*p1=*p2;*p2=ip;}voidmain(){intia,ib;int*pointer_1,*pointer_2;scanf("%d,%d",&ia,&ib);
pointer_1=&ia;pointer_2=&ib;if(ia<ib)swap(pointer_1,pointer_2);printf("\n%d,%d\n",ia,ib);}…...20002008200A200220042006200C200E2010...59整型變量ia整型變量ib(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例
將數(shù)從大到小輸出#include<stdio.h>voidswap(int*p1,int*p2){intip;ip=*p1;*p1=*p2;*p2=ip;}voidmain(){intia,ib;int*pointer_1,*pointer_2;scanf("%d,%d",&ia,&ib);pointer_1=&ia;pointer_2=&ib;if(ia<ib)swap(pointer_1,pointer_2);printf("\n%d,%d\n",ia,ib);}…...20002008200A200220042006200C200E2010...59整型變量ia整型變量ib(main)指針pointer_1指針pointer_22000200259例
將數(shù)從大到小輸出運行結(jié)果:9,5值傳遞但傳遞的是地址#include<stdio.h>voidswap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}voidmain(){intia,ib;int*pointer_1,*pointer_2;scanf("%d,%d",&ia,&ib);
pointer_1=&ia;pointer_2=&ib;if(ia<ib)swap(pointer_1,pointer_2);printf("\n%d,%d\n",ia,ib);}運行結(jié)果:9,9編譯警告!結(jié)果不對!intx;int*p=&x;x;例
將數(shù)從大到小輸出…...20002008200A200220042006200C200E2010...59整型變量ia整型變量ib(main)指針pointer_1指針pointer_2200020029920002002COPY(swap)指針p1指針p2指針p****假設(shè)2000指針變量在使用前必須賦值!#include<stdio.h>voidswap(intix,intiy){intit;it=ix;ix=iy;iy=it;}voidmain(){intia,ib;int*pointer_1,*pointer_2;scanf("%d,%d",&ia,&ib);
pointer_1=&ia;pointer_2=&ib;if(ia<ib)swap(*pointer_1,*pointer_2);printf("\n%d,%d\n",ia,ib);}運行結(jié)果:5,9例
將數(shù)從大到小輸出值傳遞運行結(jié)果:5,9例
將數(shù)從大到小輸出#include<stdio.h>voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}voidmain(){intia,ib;int*pointer_1,*pointer_2;scanf("%d,%d",&ia,&ib);
pointer_1=&ia;pointer_2=&ib;if(ia<ib)swap(pointer_1,pointer_2);printf("%d,%d",*pointer_1,*pointer_2);}…...20002008200A200220042006200C200E2010...59整型ia整型ib(main)pointer_1pointer_22000200220002002COPY(swap)指針p1指針p2指針p****2000值傳遞200020026.3指針與數(shù)組指向數(shù)組元素的指針變量例intiarray[10];int*p;
p=&iarray[0];//p=array;或int*p=&iarray[0];或int*p=iarray;iarray[0]iarray[1]iarray[2]iarray[3]iarray[9]...整型指針p&iarray[0]p數(shù)組名是表示數(shù)組首地址的地址常量指針的運算指針變量的賦值運算p=&ia;(將變量ia地址p)p=iarray;(將數(shù)組iarray首地址p)p=&iarray[i];(將數(shù)組元素地址p)p1=p2;(指針變量p2值p1)不能把一個整數(shù)p,也不能把p的值整型變量如
intii,*p;p=1000;(
)ii=p;(
)指針變量與其指向的變量具有相同數(shù)據(jù)類型指針的算術(shù)運算:piipiid(ii為整型數(shù),d為p指向的變量所占字節(jié)數(shù))p++,p--,p+ii,p-ii,p+=ii,p-=ii等假設(shè)p1與p2指向同一數(shù)組,p1-p2=兩指針間元素個數(shù)(p1-p2)/dp1+p2無意義例p指向float數(shù),那么p+1p+14例p指向int型數(shù)組,且p=&ia[0];那么p+1指向ia[1]例inta[10];int*p=&ia[2];p++;*p=1;例intia[10];int*p1=&ia[2];int*p2=&ia[5];那么:p2-p1=3;ia[0]ia[1]ia[2]ia[3]ia[4]ia[5]ia[6]ia[7]ia[8]ia[9]a數(shù)組pp+1,ia+1p+ii,ia+iip+9,ia+91指針變量的關(guān)系運算假設(shè)p1和p2指向同一數(shù)組,那么p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素假設(shè)p1與p2不指向同一數(shù)組,比較無意義p==NULL或p!=NULL數(shù)組元素表示方法ia[0]ia[1]ia[2]ia[3]ia[9]...iaia+9ia+1ia+2地址元素下標(biāo)法ia[0]ia[1]ia[2]ia[9]ia[0]ia[1]ia[2]ia[3]ia[9]...pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)[]變址運算符ia[ii]
*(ia+ii)ia[ii]
p[ii]
*(p+ii)
*(ia+ii)*ia*(ia+1)*(ia+2)*(ia+9)p[0]p[1]p[2]p[9]ia[0]ia[1]ia[2]ia[3]ia[4]例數(shù)組元素的引用方法#include<stdio.h>voidmain(){intia[5],*pa,ii;for(ii=0;ii<5;ii++) ia[ii]=ii+1;
pa=ia;for(ii=0;ii<5;ii++) printf("*(pa+%d):%d\n",ii,*(pa+ii));for(ii=0;ii<5;ii++) printf("*(ia+%d):%d\n",i,*(ia+ii));for(ii=0;ii<5;ii++) printf("pa[%d]:%d\n",ii,pa[ii]);for(ii=0;ii<5;ii++) printf("a[%d]:%d\n",ii,ia[ii]);}12345pa例intia[]={1,2,3,4,5,6,7,8,9,10},*pi=ia,ii;數(shù)組元素地址的正確表示:
〔A〕&(ia+1)〔B〕ia++〔C〕&pi〔D〕&p[ii]
數(shù)組名是地址常量pi++,pi--(
)ia++,ia--(
)ia+1,*(ia+2)(
)例#include<stdio.h>
voidmain(){intia[]={5,8,7,6,2,7,3};intiy,*pi=&ia[1];
iy=(*--pi)++;printf(“%d”,iy);printf(“%d”,ia[0]);}輸出:56pipi58762730123456ia例注意指針變量的運算6#include<stdio.h>voidmain(){intii,*pi,ia[7];
pi=ia;for(ii=0;ii<7;ii++)scanf("%d",pi++);printf("\n");for(ii=0;ii<7;ii++,pi++)printf("%d",*pi);}例注意指針的當(dāng)前值pi=ia;pipi58762730123456iapipipipipipi指針變量可以指到數(shù)組后的內(nèi)存單元數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù),是地址傳遞數(shù)組名作函數(shù)參數(shù),實參與形參的對應(yīng)關(guān)系實參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量例將數(shù)組a中的n個整數(shù)按相反順序存放iiij
379110675420123456789iiijiiijiiijijii11760594723#include<stdio.h>voidinv(intix[],intin){intit,ii,ij,im=(in-1)/2;for(ii=0;ii<=im;ii++){ij=in-1-ii;it=ix[ii];ix[ii]=ix[ij];ix[ij]=it;}}voidmain(){intii,ia[10]={3,7,9,11,0,6,7,5,4,2};inv(ia,10);printf("Thearrayreverted:\n");for(ii=0;ii<10;ii++)printf("%d,",ia[ii]);printf("\n");}im=4實參與形參均用數(shù)組例將數(shù)組a中的n個整數(shù)按相反順序存放#include<stdio.h>voidinv(int*x,intn){intt,*p,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i<=p;i++,j--){t=*i;*i=*j;*j=t;}}voidmain(){intii,ia[10]={3,7,9,11,0,6,7,5,4,2};inv(ia,10);printf("Thearrayreverted:\n");for(ii=0;ii<10;ii++)printf("%d,",ia[ii]);printf("\n");}實參用數(shù)組,形參用指針變量37911067542ia[0]ia[1]ia[2]ia[3]ia[4]ia[5]ia[6]ia[7]ia[8]ia[9]xp=x+ma數(shù)組60711594723ijijijjiji例將數(shù)組a中的n個整數(shù)按相反順序存放#include<stdio.h>voidinv(int*px,intin){intit,*pi,*pj,*p,im=(in-1)/2;pi=px;pj=px+in-1;p=px+im;for(;pi<=p;pi++,pj--){it=*pi;*pi=*pj;*pj=it;}}voidmain(){intii,ia[10],*p=ia;for(ii=0;ii<10;ii++,p++)scanf("%d",p);
p=ia;
inv(p,10);printf("Thearrayhasbeenreverted:\n");for(p=ia;p<ia+10;p++)printf("%d",*p);}實參與形參均用指針變量例將數(shù)組a中的n個整數(shù)按相反順序存放#include<stdio.h>voidinv(intix[],intin){intit,ii,ij,im=(in-1)/2;for(ii=0;ii<=im;ii++){ij=in-1-ii; it=ix[ii];ix[ii]=ix[ij];ix[ij]=it;}}voidmain(){intii,ia[10],*p=ia;for(ii=0;ii<10;ii++,p++)scanf("%d",p);
p=ia;
inv(p,10);printf("Thearrayhasbeenreverted:\n");for(p=ia;p<ia+10;p++)printf("%d",*p);}實參用指針變量,形參用數(shù)組一級指針變量與一維數(shù)組的關(guān)系int*p與intq[10]數(shù)組名是指針〔地址〕常量p=q;p+ii是q[ii]的地址數(shù)組元素的表示方法:下標(biāo)法和指針法,即假設(shè)p=q,那么p[ii]q[ii]*(p+ii)*(q+ii)形參數(shù)組實質(zhì)上是指針變量,即intq[]int*q在定義指針變量〔不是形參〕時,不能把int*p寫成intp[];系統(tǒng)只給p分配能保存一個指針值的內(nèi)存區(qū)(int型2字節(jié)〕;而給q分配2*10字節(jié)的內(nèi)存區(qū)6.3.2指針與字符串字符串表示形式用字符數(shù)組實現(xiàn)例#include<stdio.h>voidmain(){charstring[]="IloveChina!";printf("%s\n",string);printf("%s\n",string+7);}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\0結(jié)果為:IloveChina!China!用字符指針實現(xiàn)例#include<stdio.h>voidmain(){char*string="IloveChina!";printf("%s\n",string);string+=7;while(*string){putchar(string[0]);string++;}}IloveChistringn!a\0字符指針初始化:把字符串首地址賦給string
char*string;
string="IloveChina!";string*string!=0字符串指針作函數(shù)參數(shù)例用函數(shù)調(diào)用實現(xiàn)字符串復(fù)制〔1〕用字符數(shù)組作參數(shù)〔2〕用字符指針變量作參數(shù)aIamateaceh\0r.fromabyuarasutndetoboet.\0Iaaeceh\0r.t.\0mta#include<stdio.h>voidcopy_string(charfrom[],charto[]){inti=0;while(from[i]!='\0'){to[i]=from[i]; i++;}to[i]='\0';}voidmain(){chara[]="Iamateacher.";charb[]="Youareastudent.";printf("string_a=%s\nstring_b=%s\n",a,b);
copy_string(a,b);printf("\nstring_a=%s\nstring_b=%s\n",a,b);}#include<stdio.h>voidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++)*to=*from;*to='\0';}voidmain(){char*a="Iamateacher.";char*b="Youareastudent.";printf("string_a=%s\nstring_b=%s\n",a,b);
copy_string(a,b);printf("\nstring_a=%s\nstring_b=%s\n",a,b);}字符指針變量與字符數(shù)組char*cp;與charstr[20];str由假設(shè)干元素組成,每個元素放一個字符;而cp中存放字符串首地址charstr[20];str="IloveChina!";()char*cp;cp="IloveChina!";()str是地址常量;cp是地址變量cp接受鍵入字符串時,必須先開辟存儲空間例charstr[10];scanf("%s",str);(
)而char*cp;scanf("%s",cp);(
)改為:char*cp,str[10];cp=str;scanf("%s",cp);(
)字符串與數(shù)組關(guān)系字符串用一維字符數(shù)組存放字符數(shù)組具有一維數(shù)組的所有特點數(shù)組名是指向數(shù)組首地址的地址常量數(shù)組元素的引用方法可用指針法和下標(biāo)法數(shù)組名作函數(shù)參數(shù)是地址傳遞等區(qū)別存儲格式:字符串結(jié)束標(biāo)志賦值方式與初始化輸入輸出方式:%s%ccharstr[]={"Hello!"};(
)charstr[]="Hello!";(
)charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};(
)char*cp="Hello";(
)inta[]={1,2,3,4,5};(
)int*p={1,2,3,4,5};(
)charstr[10],*cp;inta[10],*p;str="Hello";(
)cp="Hello!";(
)a={1,2,3,4,5};(
)p={1,2,3,4,5};(
)scanf("%s",str);printf("%s",str);gets(str);puts(str);
指針數(shù)組因為指針也是變量,因此可設(shè)想用指向同一數(shù)據(jù)類型的指針來構(gòu)成一個數(shù)組,這就是指針數(shù)組。數(shù)組中的每個元素都是指針變量,并且指針數(shù)組中每個元素都為指向同一數(shù)據(jù)類型的指針。定義指針數(shù)組的一般形式為:
類型名*數(shù)組名[元素個數(shù)];
例如: int*pi[10];定義:數(shù)組中的元素為指針變量定義形式:數(shù)據(jù)類型*數(shù)組名[數(shù)組長度說明];數(shù)組中的每個元素都是指針變量,并且指針數(shù)組中每個元素都為指向同一數(shù)據(jù)類型的指針。例int*p[4];指針?biāo)赶蜃兞康臄?shù)據(jù)類型指針數(shù)組賦值與初始化賦值:voidmain(){intb[2][3],*pb[2];
pb[0]=b[0];pb[1]=b[1];……..}int*pb[2]pb[0]pb[1]intb[2][3]123246初始化:voidmain(){intb[2][3],*pb[]={b[0],b[1]};……..}int*pb[2]pb[0]pb[1]intb[2][3]123246指針數(shù)組指針數(shù)組賦值與初始化Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0賦值:voidmain(){chara[]="Fortran";charb[]="Lisp";charc[]="Basic";
char*p[4];
p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;……..}或:voidmain(){char*p[4];p[0]="Fortran";p[1]="Lisp";p[2]="Basic";p[3]=NULL;……..}初始化:voidmain(){char*p[]={"Fortran","Lisp","Basic",NULL};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0
charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};
char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二維數(shù)組與指針數(shù)組區(qū)別:二維數(shù)組存儲空間固定字符指針數(shù)組相當(dāng)于可變列長的二維數(shù)組分配內(nèi)存單元=數(shù)組維數(shù)*2+各字符串長度指針數(shù)組元素的作用相當(dāng)于二維數(shù)組的行名但指針數(shù)組中元素是指針變量二維數(shù)組的行名是地址常量
指針數(shù)組例6.4將數(shù)字1-12轉(zhuǎn)換成相應(yīng)月份的英文名稱。例6.4源程序例6.5將假設(shè)干字符串按字母順序〔由小到大〕排序。例6.5源程序 程序運行結(jié)果為: badminton basketball football tennis volleyball/*例6.4源程序*/#include<stdio.h>voidmain(){staticchar*cname[]={"Illegalmonth","January","February","March","April","May","June","July","August","September",October","November","December"};char*cmonth;intii;printf("PleaseinputmonthNo.(1--12):");scanf("%d",&ii);cmonth=(ii<1||ii>12)?cname[0]:cname[ii];printf("%s\n",cmonth);}/*例6.5將假設(shè)干字符串按字母順序〔小到大〕排序*/#include<stdio.h>#include<string.h>voidmain(){char*cstring[]={"football","basketball","volleyball","badminton","tennis"};char*ctemp; intin=5; intii,ij,ik;for(ii=0;ii<in-1;ii++){ ik=ii; for(ij=ii+1;ij<in;ij++) if(strcmp(cstring[ik],cstring[ij])>0) ik=ij; if(ik!=ii) { ctemp=cstring[ii]; cstring[ii]=cstring[ik]; cstring[ik]=ctemp; }}for(ii=0;ii<in;ii++) printf("%s\n",cstring[ii]);}
指針與二維數(shù)組用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素,但在概念上和使用上復(fù)雜一些。定義二維數(shù)組:
intia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
例6.6使用指針輸出二維數(shù)組的全部元素。#include<stdio.h>voidmain(){ intia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int*pi,ii;
pi=ia[0]; for(ii=0;ii<12;ii++) { printf("%d,",*pi++); } printf("\n");}例inta[3][4];a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每個元素a[i]由包含4個元素的一維數(shù)組組成二維數(shù)組a是由3個元素組成a[0]a[1]a[2]行名此時需要一個可指向一個包含n個元素的數(shù)組的指針p,且指針p的增值以一維數(shù)組的長度為單位,使這樣的指針變量指向二維數(shù)組的某一行時,p+1就指向了該二維數(shù)組的下一行,這樣的指針變量稱為數(shù)組指針。
指針與二維數(shù)組
指針與二維數(shù)組定義數(shù)組指針的一般形式為: 類型名(*指針變量名)[元素個數(shù)]; 例如,在程序定義一個數(shù)組指針: int(*pi)[4];它說明指針變量pi指向的存儲空間包含有四個整型元素,即數(shù)組指針pi指向一個一維數(shù)組,pi的值就是該數(shù)組的首地址。
指針與二維數(shù)組例6.7利用數(shù)組指針處理二維數(shù)組。例6.7源程序程序的運行結(jié)果如下: 0,1,2,3,4,5,6,7,8,9,10,11,#include<stdio.h>voidmain(){ intia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int(*pi)[4],ii,ij;
for(ii=0;ii<3;ii++) { pi=ia[ii]; for(ij=0;ij<4;ij++) printf("%d,",(*pi)[ij]); } printf("\n");}
指針與二維數(shù)組2、多級指針由于指針變量直接指向變量,所以稱為一級指針。而如果通過指向指針的指針變量來訪問變量那么構(gòu)成了二級或多級指針指向指針的指針變量說明的一般形式為: 類型名**指針變量名; 例如: int**ppi;表示ppi是一個指針變量,它指向另一個指針變量,而這個指針變量指向一個整型量。intia,*pi,**ppi;ia=3pi=&ia;ppi=π**ppi=6;&pi&iappipi3ia6二級間接尋址例一級指針與二級指針lt6_23.c#include<stdio.h>voidswap(int**r,int**s){int*t;t=*r;*r=*s;*s=t;}voidmain(){inta=1,b=2,*p,*q;p=&a;q=&b;
swap(&p,&q);printf("%d,%d\n",*p,*q);}20002008200A20022004200612變量a變量b(main)指針變量p2000指針變量q200220062004COPY二級指針s二級指針r(swap)指針變量t200020022000
指針與二維數(shù)組例6.8利用二級指針處理二維數(shù)組#include<stdio.h>voidmain(){ intia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int**ppi,ii,ij;
for(ii=0;ii<3;ii++) { *ppi=ia[ii]; for(ij=0;ij<4;ij++) printf("%d,",(*ppi)[ij]); } printf("\n");}運行結(jié)果如下:0,1,2,3,4,5,6,7,8,9,10,11,6.4
指針與函數(shù)當(dāng)使用指針作函數(shù)的形參時,是以數(shù)據(jù)的地址作為實參調(diào)用函數(shù),它的作用是將一個變量的地址傳送到函數(shù)中。例6.9利用指針實現(xiàn)兩個數(shù)據(jù)的交換函數(shù)。例題源程序程序的運行結(jié)果如下: Inputia,ib:5,6 a=6,b=56.4
指針與函數(shù)例6.10中給出用指針作為形參,數(shù)組名作為實參的方式。函數(shù)arraySum用來計算一個整數(shù)數(shù)組所包含的所有元素的和。例題源程序程序的運行結(jié)果如下: Thesumis266.4
指針與函數(shù)在C語言中允許一個函數(shù)的返回值是一個指針(即地址),這種返回指針值的函數(shù)稱為指針型函數(shù)。定義指針型函數(shù)的一般形式為:
類型名*函數(shù)名(形參列表) {
……/*函數(shù)體*/ }
6.4
指針與函數(shù)例如: int*fi(intix,intiy) { ....../*函數(shù)體*/ }6.
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告設(shè)計合同模板簡單版
- 家庭居室裝飾裝修工程監(jiān)理合同
- 二手車貸款合同范本三
- 電信客服年終工作總結(jié)
- 隔震減災(zāi)工程的施工方案
- 2025年扶貧工作計劃
- 中央空調(diào)知識培訓(xùn)課件
- 6S管理知識培訓(xùn)課件
- 2025湖南建筑安全員-C證考試(專職安全員)題庫附答案
- 貴州大學(xué)《鋼琴合奏》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年國務(wù)院發(fā)展研究中心信息中心招聘應(yīng)屆畢業(yè)生1人高頻重點提升(共500題)附帶答案詳解
- 2024年公安機關(guān)理論考試題庫500道及參考答案
- 特殊情況施工的技術(shù)措施
- 大學(xué)物理(二)知到智慧樹章節(jié)測試課后答案2024年秋湖南大學(xué)
- 銀行運營集中規(guī)劃
- 2024年托管裝修責(zé)任協(xié)議
- 國家自然科學(xué)基金申請書模板三篇
- (醫(yī)學(xué)課件)護理人文關(guān)懷
- 數(shù)據(jù)采集服務(wù)委托合同
- DB11T 1833-2021 建筑工程施工安全操作規(guī)程
- 信息檢索課件 第2章 文獻檢索方法(1)-2
評論
0/150
提交評論