




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言程序設計
—進階篇第10章指針(1)2022/11/2內(nèi)容概述1.指針變量的概念、特點、定義和使用方法。2.數(shù)組與指針的關(guān)系,包括一維數(shù)組和指針、二維數(shù)組和指針、字符串與指針等。3.指針變量作函數(shù)參數(shù)、指向數(shù)組的指針作函數(shù)的參數(shù)。2022/11/2教學目標1.掌握指針和指針變量的概念,了解指針變量的特點以及直接訪問數(shù)據(jù)和間接訪問數(shù)據(jù)的原理。2.掌握指針變量的定義方法、賦值方法和指針運算符,熟練使用指針訪問簡單變量。3.熟悉指針和一維數(shù)組的關(guān)系,掌握指向一維數(shù)組的指針變量的定義方法,熟練使用指針變量訪問一維數(shù)組元素。4.了解指針與字符串的關(guān)系,能熟練使用指針處理字符串。5.熟練掌握用指針變量作函數(shù)的參數(shù)時函數(shù)的定義和調(diào)用方法、數(shù)組名作函數(shù)的參數(shù)用法。2022/11/2第10章指針(1)C程序的變量所存放的數(shù)據(jù):數(shù)值型數(shù)據(jù):整數(shù)、實數(shù)通過前面的學習,我們已知道:字符型數(shù)據(jù):字符、字符串結(jié)構(gòu)型數(shù)據(jù):數(shù)組、結(jié)構(gòu)體、共用體2022/11/2
占有一定長度的內(nèi)存單元如:intx;x占二字節(jié)、二個單元
每一個變量都有一個地址,為無符號整數(shù),它不同于一般的整數(shù)。問題:能否對地址運算?能否用一個變量保存地址?這些變量具有的性質(zhì):2022/11/210.1基礎知識10.1.1變量、地址、變量值1變量定義的含義:
在編譯時,為變量分配適當大小的內(nèi)存單元。2存儲單元的地址:
給定的一個內(nèi)存單元的字節(jié)偏移量(編號或地址)。內(nèi)存中每個字節(jié)具有一個地址,用以區(qū)分不同的存儲位置,它們是存儲單元的名稱.3存儲單元內(nèi)的內(nèi)容:
某一個內(nèi)存單元中存放的數(shù)據(jù)就是這個內(nèi)存單元的內(nèi)容。這些數(shù)據(jù)根據(jù)定義的變量的類型的不同,占用的內(nèi)存的個數(shù)也不盡相同.(變量的值)2022/11/24.變量的“直接訪問”方式:
按變量的地址(即變量名)存取變量值的方式。(見下圖)i20003直接訪問:2022/11/23i20002000pointer間接訪問方式示意圖:
將變量的地址放在另一個內(nèi)存單元中,先到另一個內(nèi)存單元中取得變量的地址,再由變量的地址找到變量并進行數(shù)據(jù)存取(見下圖)。5.變量的“間接訪問”方式2022/11/2內(nèi)存用戶數(shù)據(jù)區(qū)示意圖(變量、地址、變量值之間的關(guān)系):變量pointer為指針變量,存放的是變量i的內(nèi)存地址,我們說pointer指向i。369.....2000...變量i變量j變量k變量pointer3010200020022004變量的值用10進制示意內(nèi)存地址2022/11/2例如:若程序中定義了三個int變量i,j,k
inti=–5,j=5,k=10;設:系統(tǒng)分配i的起始地址為2000的單元則:
j的起始地址為為2002的單元k的起始地址為2004的單元2000200120022003200420053001–5+5102000ijk2022/11/2當程序中要用它們的值時:
y=i+j+k;則系統(tǒng)通過一張變量名與地址對應關(guān)系表:找到j的地址2002,
將2002,20003中的數(shù)據(jù)5讀出;找到k的地址2004,
將2004,2005中的數(shù)據(jù)10讀出。分別找到i的地址2000,
將2000,2001中的數(shù)據(jù)–5讀出;然后把這些數(shù)據(jù)進行算術(shù)運算。2022/11/2直接訪問:直接使用存放該數(shù)據(jù)的變量名。
間接訪問:如果將某一變量的地址(如i的地址2000)存放到另一個變量x,則可通過x來存取i的值。上述過程稱為變量的“直接訪問”i相當于使用5使用變量2022/11/2如:用pi,pj,pk來存放i,j,k的地址20002002200455103001300330053007200020022004pipjpkijk若要得到變量i的值,可以先訪問pi,得到i的地址,再通過該地址找到i的值。2022/11/210.1.3指針和指針變量1.什么是指針“指針”就是變量的地址,通過地址能夠找到所需的變量單元。因此在C語言中,將地址形象化地稱為“指針”。2.指針變量指針變量是一種用來存放某個變量的地址的特殊變量,指針變量存放了哪個變量的地址,則該指針變量就指向哪個變量。指針變量的類型是該指針變量所指向的變量的類型。例如:一個指針變量存放了某個整型變量的地址,則這個指針變量的類型就是整型。指針變量的名與一般變量名相同,都同標識符。指針變量只裝地址(指針),在程序中的定義格式如下:
int*pointer1;*:指針變量定義符,聲明pointer1是指針變量。
int:聲明指針變量pointer1里面存放的是整型變量的地址。pointer1:指針變量名,里面存放一個整型數(shù)據(jù)的首地址。2022/11/210.1.4指針的概念3、指針的含義:
指針即變量的地址。(如2000、2001…2009等)4、指針變量:
含義:用于存放指針(地址)的變量。
定義方法:
數(shù)據(jù)類型*變量名
如:intx=3;
int*pointer1;
float*pointer2;
char*pointer3;20003pointer1*pointer1x20002022/11/23、指針變量使用要點: 指針變量定義格式: 數(shù)據(jù)類型*變量名
1)、數(shù)據(jù)類型:指針變量所指向目標單元的值的類型。
2)、*:指針變量的定義符
3)、變量名:目標變量在內(nèi)存中的位置(表示一個地址),如:pointer1=&x;
4)、指針變量的初始化:將指針變量指向一個具體的變量,如:
int x=3;
int *pointer1=&x;
float *pointer2=&y;
char *pointer3=&z;2022/11/210.2指針變量的引用通過下列方法引用指針變量:.取地址運算符:&
.指針運算符:*
.指針的運算:算術(shù)、關(guān)系、賦值。
.指針變量作為函數(shù)的參數(shù)2022/11/210.2.1與指針相關(guān)的運算符1、&:取地址運算符:作用:用于變量名之前,表示該變量的存儲地址。2、*:指針運算符(間接訪問)
作用:用于指針變量名之前,獲取該指針所指目標單元的值。
例如: main()
{ inta,b,*point1,*point2;
a=100;b=200; point1=&a;point2=&b;
printf(“%d,%d\n”,a,*point2); }2022/11/23、&和*兩個運算符的優(yōu)先級別是相同的,結(jié)合規(guī)律是右結(jié)合性:如: 若point1=&a;則 &*point1 等價于&a; *&a 等價于a; (*point1)++ 等價于a++;2022/11/2重要概念:
指針變量也有各種類型(如上面所示),但指針變量的值只能是整型值。指針變量的引用方式:
*變量名----表示所指變量的值。
變量名----表示指向變量的指針(地址)。若int*p;char*s;float*t;
*p=5;*s=a;*t=3.6;
2022/11/2存取指針變量所指向變量(目標變量)的值:
用指針運算符*,即:*p為i,&為同級運算符,結(jié)合性自右至左。則當&或&在一起時,具有抵消作用則:*p=&i相當于*p=i如上例:inti,p
i=3
p=&i若對指針變量進行取址運算,&p會有什么結(jié)果?請思考:2022/11/220002002地址jip=&i例:inti=1,j=2;int*p;p=&i;*p=10;printf(“%d”,*p);p=&j;printf(“%d”,*p);要點:·應隨時了解指針變量的目標指向;·不允許直接對指針變量賦常量值。如:int*point;point=1000;()·只能給指針變量一個具有地址屬性的值(數(shù)據(jù)或變量)。2022/11/210.2.2指針的運算1、算術(shù)運算
含義:對于地址的運算,只能進行整型數(shù)據(jù)的加、減運算。
2022/11/2200020022004地址kjip=&iinti,j,k;int*p=&i;(p=2000)p++;(p=2002)p++;(p=2004)p--;(p=2002)小結(jié):·指針變量的算術(shù)運算結(jié)果是改變指針目標的指向;·指針變量算術(shù)運算的過程;p新=p原值+n*sizeof(類型)·提供指針的目的:使訪問者與訪問對象相隔離改進對成批數(shù)據(jù)的訪問速度2022/11/2若有:float*t;
且:*t=3.6;
設t的地址為2000,則t+12004例:若有:int*p;
且:*p=5;
設p的地址為2000,則p+12002若有:char*s;
且:*s=a;
設s的地址為2000,則s+120012022/11/22、關(guān)系運算作用:用于識別目標變量在內(nèi)存中的前后位置.用法:
inti,j;
int*p1=&i,*p2=&j;
而p1>p2用于判斷或識別變量i,j在內(nèi)存的排列順序。2022/11/23、賦值運算作用:對指針變量的賦值運算,將改變指針變量的指向.2022/11/2例10.1:分析下面程序的功能.main(){ int*p1,*p2,*p,a,b;
scanf(“%d,%d”,&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;}
printf(“a=%d,b=%d\n”,a,b);
printf(“max=%d,min=%d\n”,*p1,*p2);}&a7&b8p2p1&b7&a8p2p1abbap2022/11/210.3指針變量作為函數(shù)參數(shù)1、含義:函數(shù)的參數(shù)不僅可以是基本數(shù)據(jù)類型,還可以是指針類型。2、功能:將一個變量的地址傳送到另一個函數(shù)中。3、例5.2:分析下面的例子
swap(int*p1,int*p2)
{
intp;
p=*p1;
*p1=*p2;
*p2=p;
}main(){inta,b,*x,*y;
scanf(“%d,%d”,&a,&b);x=&a;y=&b;if(a<b)swap(x,y);
printf(“\n%d,%d\n”,a,b);}2022/11/2指針變量:(實參)指針變量:(形參)1020ab&ap1p2xy&b2022/11/2
程序中,實參與形參共用同一個內(nèi)存單元,通過修改指針(地址)所指的值來交換數(shù)據(jù):2010ab&ap1p2xy&b指針變量:(實參)指針變量:(形參)2022/11/2(1)注意函數(shù)中p為普通變量,并非地址量;(2)如果swap函數(shù)中的交換語句改為:
int
p1,p2,p;p=p1;p1=p2;p2=p;
則僅將p1,p2的指向改變,函數(shù)返回后,p1,p2釋放,a、b中的內(nèi)容依然未改變。2022/11/2調(diào)用函數(shù)時:&bxy&a實參1020abp1p2形參2022/11/2
swap(intp1,intp2) { intp; p=p1; p1=p2; p2=p; }(3)不用地址量作參數(shù),不能實現(xiàn)交換,即:2022/11/2結(jié)論:1)指針變量作為參數(shù),從調(diào)用函數(shù)到被調(diào)用函數(shù)傳遞的不是一個變量而是變量的地址;2)指針變量作為函數(shù)的參數(shù),從實參到形參的數(shù)據(jù)傳遞仍然遵循“單向值傳遞”的原則,只是此時傳遞的是地址。3)通過函數(shù)的調(diào)用可以得到n個需改變值的方法:
用指針變量;
用數(shù)組名;
用全局變量;2022/11/24、示例:例5.3:分析下面的程序
swap(int*p1,int*p2)
{ intp;
p=*p1;
*p1=*p2;
*p2=p;
}
main()
{ inta,b;
scanf(“%d,%d”,&a,&b);
if(a<b) swap(&a,&b);
printf(“\n%d,%d\n”,a,b);}2022/11/2例10.4:分析下面的程序?qū)懗鼋Y(jié)果
swap(int*a,int*b)
{ int*t;
t=a;a=b;b=t;
printf(“%d,%d\n”,*a,*b);}
main()
{
inta=3,b=5;
swap(&a,&b);
printf(“%d,%d\n”,a,b);}
a,b的值沒有改變。在調(diào)用函數(shù)時改變指針的指向。運行結(jié)果:5,3
3,52022/11/2例10.5:分析下面的程序?qū)懗鼋Y(jié)果
swap(int
a,intb)
{
intt;
t=a;a=b;b=t;
printf(“%d,%d\n”,a,b); }
main()
{
inta=3,b=5;
swap(a,b);
printf(“%d,%d\n”,a,b);
}
運行結(jié)果:5,3
3,52022/11/2
例10.6:分析下面的程序?qū)懗鼋Y(jié)果
swap(int*a,int*b)
{
intt;
t=*a;*a=*b;*b=t;
printf(“%d,%d\n”,*a,*b); }
main()
{
inta=3,b=5;
swap(&a,&b);
printf(“%d,%d\n”,a,b);
}
運行結(jié)果:5,3
5,32022/11/2例10.7:輸入a、b、c三個整數(shù),按大小順序輸出。swap(int*a,int*b){intt;t=*a,*a=*b,*b=t;}main(){inta,b,c,*p1,*p2,*p3;
scanf(“%d,%d,%d”,&a,&b,&c);運行情況:
p1=&a,p2=&b,p3=&c;輸入:9,0,10
exchange(p1,p2,p3);輸出:10,9,0
printf(“%d,%d,%d\n”,a,b,c);}exchange(q1,q2,q3)int*q1,*q2,*q3;{if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}2022/11/2例10.7B:/*----ch05_5b.c----*/#include<stdio.h>main(){intal=123,a2=234,a3=345;
int*pl,*p2,*p3;
intas[3]={1,2,3},*ps[3];pl=&a1;p2=p1+1;p3=p2+1;printf("p1=%ld\np2=%ld\np3=%ld\n",p1,p2,p3);
printf("*p1=%ld\n*p2=%ld\n*p3=%ld\n",*p1,*p2,*p3);2022/11/2
printf("ps[0]=%ld\nps[1]=%ld\nps[2]=%ld\n",ps[0],ps[1],ps[2]);
printf("*ps[0]=%ld\n*ps[1]=%ld\n*ps[2]=%ld\n",*ps[0],*ps[1],*ps[2]);}ps[0]=&as[0];ps[1]=ps[0]+1;ps[2]=ps[1]+1;2022/11/2運行結(jié)果:p1=262737918p2=262737920p3=262737922*p1=123*p2=0*p3=320ps[0]=262737896ps[1]=262737898ps[2]=262737900*ps[0]=1*ps[1]=2*p2[2]=3地址a1的值系統(tǒng)給定的值數(shù)組元素地址數(shù)組元素的值2022/11/2注意:指針變量在未賦值前指向一個不定值例:#include<stdio.h>main(){ int*p;
printf("*p=%d,p=%ld",*p,p);}運行結(jié)果:*p=0,p=38422022/11/210.4數(shù)組的指針和指向數(shù)組的指針變量10.4.1概念1、數(shù)組的指針:
數(shù)組的起始地址(即數(shù)組名)。是一個恒定值指針。2、數(shù)組元素的指針:
數(shù)組元素的地址。3、指向數(shù)組的指針變量:
用于存放數(shù)組的起始地址或某一數(shù)組元素地址的變量。2022/11/210.4.2定義方法1、定義方法 與一般指針變量的定義方法相同。如:
inta[10],*p1,*p2;
p1=a;
p2=&a[2];注:p1為指向數(shù)組的指針
p2為指向數(shù)組元素的指針a[0]aa[1]a[2]a[9]p1=aa[i]p2C語言規(guī)定:數(shù)組a的首地址即用&a[0]表示,亦可用a表示
所以:p=&a[0];和p=a等價2、在定義指針變量時可以直接賦初值
如:
inta[10],*p1=a,*p2=&a[0];2022/11/210.4.3利用指針訪問數(shù)組的幾種方法1、作用
引用數(shù)組元素可以用下標法,還可以用指針法。使用指針方法能使目標程序的質(zhì)量高?占內(nèi)存少、運行速度快。2、基本方法 1)將指針指向數(shù)組中的某個元素;
2)利用*(p+n)獲得數(shù)組元素的值。
如:
inta[9]={0,1,2,3};
int*p=a;
printf(“%d”,*p);
printf(“%d”,*(p++));
printf(“%d”,*(p++));a[0]*(p+n-1)aa[1]a[2]a[n-1]p++p++p=aa[i]p+i或a+ip+n-1*(p+i)或p[i]2022/11/2例10.8:輸出數(shù)組的全部元素。方法一:下標法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]);}方法二:地址法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));}2022/11/2例10.8:輸出數(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);}三種方法的比較:方法1與方法2的執(zhí)行效率相同,都是先計算數(shù)組元素的地址,再訪問數(shù)組元素的值,費時。方法3利用指針變量直接訪問數(shù)組元素的值,不必計算數(shù)組元素的地址,故執(zhí)行效率高。下標法直觀,指針法與地址法不夠直觀。2022/11/2例10.9:下面的程序的輸出結(jié)果是什么?#include<stdio.h>inta[]={2,4,6,8},b[4];main(){
inti,*p=a; for(i=0;i<4;i++)
b[i]=*p++; printf(“%d\n”,b[2]);}運行結(jié)果為:62022/11/23.綜上所述,引用一個數(shù)組元素有兩種方法:(1)下標法:如a[i]形式;(2)指針法:如*(a+i)或*(p+i)。關(guān)于用指針方法引用數(shù)組元素,是一個重點,也是一個難點,為了方便大家理解,特制表格,見下頁。2022/11/2若有數(shù)組及指針定義inta[5],*p=a;下標法:
a[0]a[1]a[2]a[3]a[4]指針法:*p*(p+1)*(p+2)*(p+3)*(p+4)*a*(a+1)*(a+2)*(a+3)*(a+4)各元素地址pp+1p+2p+3p+4aa+1a+2a+3a+4
&a&a[1]&a[2]&a[3]&a[4]2022/11/2例如有定義:inta[10],*p;p=a;p++合法;但a++不合法(a是數(shù)組名,代表數(shù)組首地址,是常數(shù)地址,常量不能作賦值運算。)要注意指針變量的當前值。
p=a;/*注意此句*/for(i=0;i<10;i++,p++)
printf("%d",*p);}4.注意事項main(){int*p,i,a[10];p=a;for(i=0;i<10;i++)
scanf("%d",p++);2022/11/2注意指針變量的有關(guān)運算以下結(jié)論都在使指針指向數(shù)組a,即在p=a;前提下得出p++;(或p+=1;)p將指向下一元素,即a[1]。x=*p++:*與++是同級運算符(結(jié)合方向自右向左),等價于先計算*p,為x賦值a[0];p再自增1,新的p指向a[1]。2022/11/2(*p)++;
表示p所指向的元素值加1(即a[0]++),而不是指針值p加1。
*(p++)與*(++p):*(p++)是先取*p的值,后使p加1;*(++p)是先使p加1,后取*p的值。2022/11/2課堂練習1:main(){
inta[3],*p=a; a[0]=10;a[1]=20;a[2]=30;
printf(“%d\n”,*p++);/*輸出p后p指向a[1]*/
printf(“%d\n”,*++p);/*輸出p前p指向a[2]*/}1030答案:2022/11/2main(){
inta[]={1,2,3,4,5};
int*p=a+3;/*p指向a[3]*/
printf(“%d,%d,%d\n”,*p,*(p+1),*p+3);}/**p+3相當于a[3]+3等價于(*p)+3*/4,5,7課堂練習2:結(jié)果:2022/11/2*例10.10:下面的程序的輸出結(jié)果是什么?main(){ inta[10];
int*p,i; p=a; for(i=0;i<10;i++)
scanf(“%d”,p++);
printf(“\n”);for(i=0;i<10;i++,p++)
printf(“%d”,*p);}2022/11/210.5數(shù)組名作函數(shù)的參數(shù)1、數(shù)組元素作函數(shù)的參數(shù)。
2、數(shù)組名作為函數(shù)的參數(shù)
實參與形參操作的是內(nèi)存中的同一段地址單元,這樣在被調(diào)用函數(shù)中對數(shù)組元素的內(nèi)容的改變將會反映到調(diào)用函數(shù)中。(即地址傳遞或雙向傳遞)2022/11/23、數(shù)組作函數(shù)的參數(shù)時,實參與形參還可用指針的形式給出:(同樣是地址傳遞) 用數(shù)組名與數(shù)組的指針組合形式可以是:
實參數(shù)組名數(shù)組名指針指針形參數(shù)組名指針數(shù)組名指針2022/11/2例10.11:將數(shù)組a中的n個整數(shù)按相反的順序存放。
voidinv(int*x,intn)/*形參,實參都用指針變量*/{
int*p,m,t,*i,*j;
m=(n-1)/2;
i=x;/*將a數(shù)組的首地址賦給指針變量i*/j=x+n-1;/*將&a[9]—第10個元素的地址賦給指針變量j*/p=x+m;/*將&a[4]的地址賦給指針變量p作為地址運算上界*/
for(;i<=p;i++,j--)/*用地址變化交換數(shù)組元素值*/ {t=*i;*i=*j;*j=t;}
}
main()
{ staticinta[10]={3,7,9,11,0,6,7,5,4,2};
inti,*p; p=a; inv(p,10);
for(p=a;p<a+10;p++)/*用地址變化輸出數(shù)組元素值*/
printf(“%d”,*p);
printf(“\n”); }2022/11/2例10.12:下面程序的輸出結(jié)果是:#defineMAX 3/*形參用數(shù)組名,實參用指針變量*/int
a[MAX];/*定義數(shù)組a為全局變量*/fun1(){
intk,t=0;
for(k=0;k<MAX;k++,t++)a[k]=t+t;
returna;}/*a[0]=0,a[1]=2,a[2]=4*/fun2(intb[]){ intk; for(k=0;k<MAX;k++)
printf(“%d”,*(b+k));/*通過改變地址輸出數(shù)組元素值*/}main(){int*p; p=fun1(); fun2(p);/*將數(shù)組a的首地址作為實參傳給形參數(shù)組b*/
printf(“\n”);}
運行結(jié)果為:024
2022/11/2例10.13:分析以下程序的輸出結(jié)果。
voidsort(int
data[],intn)/*形參,實參都用數(shù)組名*/{
inti,j,t;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(data[i]<data[j])
{t=data[i];data[i]=data[j];data[j]=t;} }
main()
{
intarray[5]={2,8,7,5,9};
inti;
sort(array,3);/*將實參數(shù)組array的首地址傳給形參data數(shù)組*/
for(i=0;i<5;i++)
printf(“%d”,array[i]);printf(“\n”);}
運行結(jié)果為:87259
2022/11/2例10.14:分析程序?qū)懗鼋Y(jié)果.
#include<stdio.h>
voidfun(int*s)/*實參用數(shù)組名,形參用指針變量*/{ staticintj=0;
do{
s[j]+=s[j+1]; }while(++j<2); }
main()
{
intk,a[10]={1,2,3,4,5};
for(k=1;k<3;k++) fun(a);
for(k=0;k<5;k++)
printf(“%d”,a[k]);
}運行結(jié)果為:357452022/11/210.6字符串的指針和指向字符串的指針變量10.6.1用字符數(shù)組實現(xiàn)字符串處理
main()
{ staticcharstr[]=“Iamastudent.”;
puts(str); }說明: str是數(shù)組名,代表數(shù)組的首地址,
str[i]代表數(shù)組的第i個元素,
str[i]等價于*(str+i)。2022/11/210.6.2用字符指針實現(xiàn)字符串處理main(){ char*str=“Iamastudent.”;
puts(str);}這里的str就是字符指針。2022/11/2要點:1、字符串指針可以用來描述一個字符串。
方法:char*str=“Iamastudent.”;2、意義 不是將字符串的內(nèi)容賦值給指針變量,而是將其起始地址賦給它。
char*str;
str=“Iamastudent.”;2022/11/23、應用:利用字符串的指針變量對字符串進行輸入與輸出。 puts(),gets()
scanf(),printf()的%s輸出格式。例10.15:分析下面的程序main(){ chararr[]=“ABCDE”;
char*ptr;
for(ptr=arr;ptr<arr+5;ptr++)
printf(“%s\n”,ptr);}運行結(jié)果為: ABCDE
BCDE
CDE
DE
E2022/11/2例10.16:有以下的程序,輸出結(jié)果為:main(){ char*p1=“programming”,*p2=“l(fā)anguage”;
inti;
for(i=0;i<=7;i++)
if(*(p1+i)==*(p2+i))
printf(“%c”,*(p1+i));}結(jié)果:ga2022/11/210.6.3字符串指針作函數(shù)的參數(shù)1.用字符數(shù)組作函數(shù)的參數(shù)例10.17:分析以下程序fun(chars[]){ intx,y;
charc;
y=strlen(s)-1;
for(x=0;x<y;x++,y--)
{c=s[y];s[y]=s[x];s[x]=c;}}main(){chara[]=“abcdefghi“fun(a);puts(a);}運行結(jié)果為:ihgfedcba2022/11/22.用字符指針作函數(shù)的參數(shù)例10.18:分析以下的程序fun(char*s){
intx,y;
charc;
for(x=0,y=strlen(s)-1;x<y;x++,y--)
{ c=s[y];s[y]=s[x];s[x]=c;}}main(){ char*p,a[]=“abcdefghi”;p=a;
fun(p);
puts(p);}2022/11/23字符指針與字符數(shù)組的區(qū)別1).字符數(shù)組由若干個元素組成,每個元素存放一個字符,而字符指針存放的是地址(當處理字符串時存放的是字符串的地址);2).賦初值方式不同;
chara[]=“Iamastudent.”;
char*str=“IloveChina.”;3).賦值方式不同;
(1)對于字符數(shù)組賦值不能使用以下的方法:
charstr[10];
str=“book”;
(2)對于字符類型的指針變量可以使用以下的方法:
char*str;
str=“Thisisabook.”;2022/11/24)字符指針變量在使用之前必須初始化,即使其指向一個具體的存儲單元。如:
charstr[];
scanf(“%s”,str);是正確的
而char*str;
scanf(“%s”,str);將是錯誤的。5)指向字符類型的指針變量可以用指針的形式表示,也可以用下標的形式表示。2022/11/2
例10.19:分析以下程序main(){ char*str=“Iamastudent.”;
str=str+7;
printf(“%s\n”,str);
for(;*str;str++) /*可改為while(*str)*/
printf(“%c”,*str);
printf(“\n”);
}運行結(jié)果:student.student.2022/11/2例10.20:分析以下的程序
main()
{ char*str=“Iamastudent.”;
inti;
str=str+7;/*首地址為str[7]*/
printf(“%s\n”,str);
for(i=0;i<7;i++)
printf(“%c”,str[i]));/*從str[7]開始輸出*/
printf(“\n”);
}結(jié)果:student.student2022/11/2C語言程序設計綜合練習7*1.用指針變量編程序,將100賦給變量a,并輸出a的值。2022/11/2C語言程序設計綜合練習71.#include<stdio.h>main(){
inta,*p; p=&a; *p=100;
printf("a=%d\n",a);}2022/11/2C語言程序設計綜合練習7$2.用指針變量編程序,將字符串“CProgrammingLanguage”的首地址賦給指針變量,然后輸出整個字符串和字符串的第一個字符。2022/11/2C語言程序設計綜合練習72.#include<stdio.h>main(){ char*p; p="CProgrammingLanguage";
printf("p=%s\n",p);
printf("%c\n",*p);}2022/11/2C語言程序設計綜合練習7*3.設a=5,b=10,用指針變量編程序,通過調(diào)用函數(shù)交換兩個變量的值。2022/11/2C語言程序設計綜合練習73.#include<stdio.h>main(){int
swap(int*x,int*y);
int
a,b; a=5,b=10;
swap(&a,&b);
printf("newa=%dnewb=%d\n",a,b);}
int
swap(int*x,int*y){
intt; t=*x; *x=*y; *y=t;}2022/11/2C語言程序設計綜合練習7$4.編程序,刪除從鍵盤輸入的字符串中的所有數(shù)字字符(用宏命令定義數(shù)組長度)。例如:#defineN30
cahar
a[N],b[N];上課需要講解字符串中有空格需要用gets()函數(shù)輸入。2022/11/2C語言程序設計綜合練習74.#include<stdio.h>#defineN30voidfun(char
a[],charb[]);main(){chara[N],b[N];
printf("Input
astring:");
gets(a);/*scanf("%s",a);*/
fun(a,b);
printf("%s\n",b);}voidfun(char
a[],charb[]){inti=0,j=0;while(a[i]!='\0'){if(a[i]<'\0'||a[i]>'9'){b[j]=a[i];j++;}i++;}b[j]='\0';}2022/11/2C語言程序設計綜合練習7*5.編程序(用指針變量),計算一個自然數(shù)的各位數(shù)字之和與各位數(shù)字的平方和。2022/11/2C語言程序設計綜合練習75.#include<stdio.h>voidfun(long
s,int*a,int*b);main(){longx;int
a,b;
printf("Inputalongintegernumberx:");
scanf("%ld",&x);
fun(x,&a,&b);
printf("Thesumofeverydigitis:%d\n",a);
printf("Thesumofeverydigit'ssquareis:%d\n",b);}voidfun(long
s,int*a,int*b) {intm; *a=0;*b=0;
while(s) {m=s%10; *a=*a+m; *b=*b+m*m; s=s/10; } }2022/11/2C語言程序設計綜合練習7*6.編程序(用指針變量),計算m的倒數(shù)和n的倒數(shù)的和與差。2022/11/2C語言程序設計綜合練習76.#include<stdio.h>voidfun(int
m,int
n,float*x,float*y); main(){int
m,n;floatx,y;
printf("Inputtwonumberm(!=0)&&n(!=0):\t");
scanf("%d%d",&m,&n);
fun(m,n,&x,&y);printf("1/%d+1/%d=%f\n",m,n,x);printf("1/%d-1/%d=%f\n",m,n,y);}voidfun(int
m,int
n,float*x,float*y){floata,b;a=1.0/m;b=1.0/n; *x=a+b;*y=a-b; }2022/11/2C語言程序設計綜合練習77.編程序,計算100以內(nèi)含6的所有自然數(shù)的倒數(shù)之和。2022/11/2C語言程序設計綜合練習77.#include<stdio.h>floatfun(){inti;floatsum=0.0;
for(i=1;i<100;i++) if(i/10==6||i%10==6) sum=sum+1.0/i;
returensum;} floatmain() {floatc; c=fun();
printf("%f\n",c); }2022/11/2C語言程序設計綜合練習78.編程序,計算如下公式:
2022/11/2C語言程序設計綜合練習78.#include<stdio.h>floatfun(int
s,floatx);main(){int
n;float
x,sum;
printf("Inputaintegernumbern:\t");
scanf("%d",&n);
printf("Input
x:\t");
scanf("%f",&x);sum=fun(n,x);
printf("Theresultis:%f\n",sum);}floatfun(int
n,floatx){int
i;floatu=0,y=1,sum=1;
for(i=1;i<=n;i++) u=u+i;y=y*x;sum=sum+y/u;
return(sum);}2022/11/2C語言程序設計綜合練習7*9.編程序,判斷從鍵盤輸入的兩個double型數(shù)據(jù)(非0)是否具有相同的符號。要求:所有操作必須通過指針實現(xiàn)。上課需要講解double型數(shù)據(jù)用%lf或%e格式輸入。2022/11/2C語言程序設計綜合練習79.#include<stdio.h>main(){doublea,b,*pa=&a,*pb=&b;printf("請輸入兩個double型數(shù)據(jù)a和b:");scanf("%lf%lf",pa,pb);if(*pa**pb>0)printf("變量a和b同號!\n");elseprintf("變量a和b不同號!\n");}2022/11/2C語言程序設計綜合練習7*10.編程序,用移動指針的方法將用戶從鍵盤輸入的若干字符(用’0’結(jié)束輸入)存放在數(shù)組W中,找出數(shù)組中具有最大ASCII碼值的字符,輸出該字符及其ASCII碼。要求:程序中所有操作(輸入?查找及輸出)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 書籍設計印刷合同范本文檔
- 個體診所自查報告
- 廈門落戶中介合同范本
- 業(yè)務員個人年度工作總結(jié)
- 三年級語文備課組工作總結(jié)
- 廚房調(diào)味采購合同范例
- 公司代運營合同范本
- 農(nóng)業(yè)種植工合同范本
- 中式糕轉(zhuǎn)讓店鋪合同范本
- 一年級數(shù)學公開課教案
- 法規(guī)解讀丨2024新版《突發(fā)事件應對法》及其應用案例
- JGJ46-2024 建筑與市政工程施工現(xiàn)場臨時用電安全技術(shù)標準
- 肺炎的中醫(yī)護理方案
- 中醫(yī)基礎理論:經(jīng)絡 第二節(jié) 十二經(jīng)脈課件
- 家庭急救知識(異物卡喉的急救)共45張課件
- 機臺異常處理規(guī)定
- 旅游地產(chǎn)開發(fā)模式和創(chuàng)新(含案例)
- 診斷學完整教案(共167頁)
- 《汽車文化》全套教案
- 拆除工程檢驗批質(zhì)量檢驗記錄
- 甲狀腺腫瘤PPT課件
評論
0/150
提交評論