版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章指針
指針就是C語言中廣泛使用的一種數(shù)
據(jù)類型,它是C語言的一個重要特色。也
是C語言的精華。
正確靈活地應(yīng)用指針,可以有效地表
示各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu):能方便地使用
數(shù)組,處理字符串;在調(diào)用函數(shù)時亦能
得到多個返回值。使程序簡潔、高效。
第6章指針
?6.1指針和指針變量
?6.2數(shù)組與指針
?6.3字符串與指針
?6.4指針數(shù)組與指向指針的指針
6.1指針和指針變量
6.1.1指針的概念
在程序中所定義的變量,編譯系統(tǒng)會根
據(jù)變量的類型,分配一定長度的存儲空間。
內(nèi)存中每一個字節(jié)有唯一編號。如:
inta2個字節(jié)
floatb4個字節(jié)
charc1個字節(jié)
6.1指針和指針變量
6.1.1指針的概念
?按變量的重級存取變量的值。例如:
scanf(u%d5\&a);
printfC^f",b);
6
2000
6.1指針和指針變量
6.1.1指針的概念
>按變量的幽勿必呦加存取變量的侑。
例如假設(shè)變量pa的地址為1000,用變量pa來
存放變量a的地址&a,止匕時pa的值為2000。如果
要得到a的值,可以先訪問變量pa,得到pa的值
為2000(變量a的地址),再通過地址2000找到所指
存儲單元中的值(a的值),見圖:
paa
2000------d~6-
10002000
6.1指針和指針變量
6.1.1指針的概念
?指針
一個變量的地址稱為該變量的指針。如地址
2000是變量a的指針,2002是變量b的指針。
>指針變量
如果有一個變量專門用來存放另一個變量的地
址
(即指針),稱為指針變量。如pa是一個指針變
量,pa中的值為指針。
6.1指針和指針變量
6.1.2指針變量的定義
A定義指針變量的語法格式
類型名*標(biāo)識符;
例如:int*p1,*p2;
/int——p1,p2是指向整壟變量的指針變量。
----指針標(biāo)記。
/p1,p2——指針變量名。
6.1指針和指針變量
6.1.2指針變量的定義
說明:
?指針可以指向任何類型的對象,包括指向數(shù)組、指
向別的指針變量、指向函數(shù)或指向結(jié)構(gòu)變量等;
?指針變量同普通變量一樣,也占用內(nèi)存單元,且所
有指針變量都占用相同的長度,(一般為2個字節(jié)
?一個指針變量被定義后,它所指向?qū)ο蟮念愋鸵簿?/p>
確定了。若把匕例的m指向一浮點(diǎn)變量,則出錯。
6.1指針和指針變量
6.1.3指針運(yùn)算及指針變量的引用
A&運(yùn)算符
&是單目運(yùn)算符,其功能是取出操作對象在內(nèi)
存單元的地址,其結(jié)合性為自右至左。
例如:pla
inta9b;
int*p1,*p2;
p1=&a;
p2=&b;
6.1指針和指針變量
6.1.3指針運(yùn)算及指針變量的引用
?*運(yùn)算符
*也是單目運(yùn)算符,其功能是訪問操作對象所指向
的變量,操作對象必須是指針變量或指針表達(dá)式。
例如:
Pa
inta=20;&a」20
int*p;
P=&a;
printf("%d'1*p);?!?/p>
6.1指針和指針變量
例指針變量的引用。
6.1運(yùn)行結(jié)果為:
#include<stdio.h>
a=20
voidmain()
*pa=20
{inta=20;
&a=5308
int*pa;/*定義整型指針變量pa*/
pa=5308
pa=&a;/*取整型變量a的地址賦予pa*/
1,1
printf(lia=%d\n,i,a);
,,,,
printf(*pa=%d\nJ*pa);/*用pa實(shí)現(xiàn)對a的間接訪問*/
printf(il&a=%d\nii,&a);
,,,,
printf(pa=%d\nJpa);
',
printf(%dJ%d\n"Jpa==&aJ*pa==a);}
6.1指針和指針變量
6.1.4指針變量的賦值
A指針變量的賦值運(yùn)算有以下幾種形式:
(1)指針變量的初始化
inta;
int*pa=&a;
在定義pa的同時將變量a的地址作為初值。
(2)賦值語句的方法
inta;
int*pa;pa=&a;
先定義pa,再將同類型變量a的地址賦給pa。
6.1指針和指針變量
6.1.4指針變量的賦值
A指針變量的賦值運(yùn)算有以下幾種形式:
(3)把一個指針變量的值賦另一個指針變量
inta,*pa=&a,*pb;
pb=pa;
即把a(bǔ)的地址賦予pb,這時pa與pb均指向a。
(4)把數(shù)組的首地址賦予指向數(shù)組的指針變量
inta[5],*pa;pa=a;
或inta[5],*pa;pa=&a[O];
數(shù)組名表示數(shù)組首地址,pa指向數(shù)組的首元素。
6.1指針和指針變量
6.1.4指針變量的賦值
A指針變量的賦值運(yùn)算有以下幾種形式:
(5)把字符串的首地址值賦予指向字符型的指針變量
char*pc;pc="CLanguage”;
或char*pc="CLanguage”;
把存放字符串的字符數(shù)組首址賦給指針變量pc。
(6)把函數(shù)的入口地址賦予指向函數(shù)的指針變量
int(*pf)();
pf=f;/*f為函數(shù)名7
把f函數(shù)的入口地址賦給指針變量pf。
6.1指針和指針變量
例6.2指針變量的賦值。
paa
#include<stdio.h>
voidmain()
{inta=20,b=30;
int*pa,*pb;
pa=&a,pb=&b;
printf(fl*pa=%d,*pb=%d\nii,*pa,*pb);
pa=pb;/*pa與pb均指向變量b7
,,,,運(yùn)行結(jié)果為:
printf(*pa=%dJ*pb=%d\nJ*paJ*pb);
*pa=20,*pb=30
pa=&a,pb=pa;/*pa與pb均指向變量a*/
*pa=30,*pb=30
printf(,,*pa=d,*pb=%d\n,,,*pa,*pb);
*pa=20,*pb=20
)
6.1指針和指針變量
例6.3通過指針變量實(shí)現(xiàn)變量值的交換。
#include<stdio.h>
voidmain()
{inta=10,b=50,tenfip;Pbb
&b-------10
int*pa,*pb;
pa=&a,pb=&b;temp
,,,,10
printf(a=%d,b=%d\nJa,b);
temp=*pa,*pa=*pb,*pb=temp;/*變量a與b的值交換7
,,
printf("a=%dJb=%d\n,aJb);
)
6.1指針和指針變量
例6.3A通過指針變量實(shí)現(xiàn)變量值的交換。
#include<stdio.h>
voidmain()
{inta=10,b=50;
int*pa,*pb,*pc;
pa=&a,pb=&b;
,,,,
printf(a=%d,b=%d\nJaJb);
*pc=*pa,*pa=*pb,*pb=*pc;/*變量a與b的值交換7
,,
printf("a=%dJb=%d\n,aJb);
)
6.1指針和指針變量
例6.3B通過指針變量實(shí)現(xiàn)變量值的交換。
#include<stdio.h>paa
voidmain()|~71。
{inta=10,b=50;pbb
int*pa,*pb,*pc;50
pa=&a,pb=&b;肌/
,,,,
printf(a=%dJb=%d\nJaJb);&a/
pc=pa,pa=pb,pb=pc;/*pa與換*/
printf(lfa=%d,b=%d\nli,a,b);
,,
printf(^*pa=%d,*pb=%d\nJ*pa,*pb);
)
6.1指針和指針變量
例6.4通過指針變量求三個變量中的最大值和最小值。
include<stdio.h>
voidmain()
{inta,b,c,*pmax,*pmin;
printfC'Pleaseinputthreenumbers:\n");
",
scanf(%d%d%d",&a,&bJ&c);
if(a>b)
{pmax=&a;pmin=&b;}
else
{pmax=&b;pmin=&a;}
if(c>*pmax)pmax=&c;
if(c<*pmin)pmin=&c;
,,
printf("max=%d\nmin=%d\nJ*pmax,*pmin);
6.2數(shù)組與指針
6.2.1指向一維數(shù)組的指針
A定義及初始化指向一維數(shù)組的指針變量:
首先、定義一個整型數(shù)組a,再定義一個指向整型變量
的指針變量D,然后將此數(shù)絹的第。號元素的地址賦
笈,此時p就是指向a數(shù)組的指針,數(shù)組的指針就是
數(shù)絹的起始地址。例如:
inta[5];Pa[0]a[4]
p=&a[O];/*或p=a;*/
6.2數(shù)組與指針
6.2.1指向一維數(shù)組的指針
A通過指針變量引用一維數(shù)組的元素
例如:定義如下數(shù)組和指針變量p:
inta[8],i;int*p=a;
p+1-----指向數(shù)組的下一個元素,而不是D的值加1。
(1)p+i和a+i是地址,
就是的地址部可以用a+i*d計(jì)算。
(2)*(p+i)和*(a+i)
就是p+i或a+i所指向的數(shù)組元素a[i]。
(3)a[i]和*(p+i)等價
6.2數(shù)組與指針
例6.5使用不同方法訪問數(shù)組元素。
#include<stdio.h>
voidmain()
{inta[10]={10,20,30,40,50,60,70,80,90,100);
inti,*p;p=a;/*也可以寫成p=&a[0];*/
for(i=0;i<10;i++)
printf(M%dfi,a[i]);printf("\nfi);運(yùn)行結(jié)果為:
for(i=0;i<10;i++)102030405060708090100
102030405060708090100
,ffi「\
printf(%d,p[i]);printfn");102030405060708090100
for(i=0;i<10;i++)
printf("%dfl,*(a+i));printf(lf\nf,);
for(i=0;i<10;i++)
printf("%dfi,*(p+i));printf(fi\nif);}
6.2數(shù)組與指針
6.2.2指針變量的運(yùn)算
A加減運(yùn)算和增(減)量運(yùn)算:
(1)設(shè)P是指向數(shù)組a的指針變量,若數(shù)組a為float型,
則:p±i——可以用a+i*d計(jì)算;(此時d=4)
⑦只有指向數(shù)組的指針變量可以進(jìn)行加減運(yùn)算;指向
其他類型的指針變量作加減運(yùn)算無意義;
(3)通過指針移動間接訪問數(shù)組元素(如*p++)的效率比
直接使用數(shù)組元素的效率高。
6.2數(shù)組與指針
6.2.2指針變量的運(yùn)算
A加減運(yùn)算和增(減)量運(yùn)算:
⑷要注意和“++”、連用時的結(jié)合性;
等價于*(p++)先取出P指針變量所指向的單元
內(nèi)容(即*P),然后再使P+1-P;
等價于*(++p)先使P+1一p,然后再取出P指
針變量所指向的單元內(nèi)容;
,(*p)++表示將P所指向的單元內(nèi)容值加1。
@數(shù)組名是常量,不能對數(shù)組名進(jìn)行賦值或自增自減
運(yùn)算。如:a++;>a=a+i;在邏輯上都是錯誤的。
6.2數(shù)組與指針
例6.6指針?biāo)阈g(shù)運(yùn)算。
voidmain()
運(yùn)行結(jié)果為:
{inta[5],i,*pa;
pa=a;a[0]=0a[1]=1a[2]=2a[3]=3a[4]=4
for(i=0;i<5;i++)
{*pa=i;/*將i的值賦給pa所指的數(shù)組元素,即a[i]7
pa++;/*pa指向下一元素*/
)
pa=a;
for(i=0;i<5;i++)
printf(lfa[%d]=%dii,i,*pa++);
)
6.2數(shù)組與指針
6.2.2指針變量的運(yùn)算
?指針變量的相減運(yùn)算:
兩指針變量的加操作是無意義的;只有指向
同一數(shù)組的兩個指針變量之間相減才有意義:相
減的結(jié)果是兩個指針?biāo)赶虻脑刂g相差的元
素個數(shù)。
6.2數(shù)組與指針
例6.7兩指針變量相減運(yùn)算。
voidmain()
{inta[5]={5,20,8,6,13);
int*p1,*p2;
p1=&a[1],p2=&a[4];pip2
printf(l,%d,%d\nll,*p1,*p2);
printf(M%d\n",*p2-*p1);
printf(ll%d\n\p2?p1);5208613
a[0]a[l]a[2]a[3]a[4]
)
6.2數(shù)組與指針
6.2.2指針變量的運(yùn)算
?指針變量的關(guān)系運(yùn)算:
指向同一數(shù)組的兩指針變量進(jìn)行關(guān)系運(yùn)算可表示
它們所指數(shù)組元素之間的關(guān)系;設(shè)討1、是指向數(shù)
組a的兩個指針變量,貝I」:
pf1==pf2表示pf1和pf2指向同一數(shù)組元素;
pf1>pf2表示pf1處于高地址位置;
pf1<pf2表示pf1處于低地址位置。
6.2數(shù)組與指針
例6.8兩指針變量的比較。
voidmain()運(yùn)行結(jié)果為:
{inta[5]={5,20,8,6,13};
6
inti,*p1,*p2,*p3;
p1=&a[1],p2=&a[3];13
if(p1>p2)p3=p1;
elsep3=p2;
printf("%d\rT,*p3);/*p1vp2,p3=p2,輸出a[3]*/
p1=p1+3,p2=p2-3;/*p1指向a[4],p2指向a[0]7
if(p1>p2)p3=p1;5|20|8|6|13
elsep3=p2;a[0]a[l]a[2]a[3]a[4]
printfC^dNn^^pS);/*p1>p2,p3=p1輸出a[4]*/
)
6.2數(shù)組與指針
6.2.3指向二維數(shù)組的指針
?總結(jié)一維數(shù)組元素的地址:
假設(shè)有如下定義:inta[4],*p=a;
pa[0]a[l]a[2]a[3]
a=&a[O]即數(shù)組首元素a[0]的地址
a+l=&a[l]即數(shù)組元素a[l]的地址
*a=a[O]即數(shù)組首元素a[0]存儲的數(shù)據(jù)值
*(a+l尸即數(shù)組元素存儲的數(shù)據(jù)值
A討論二維數(shù)組元素的地址:
假設(shè)有如下定義:inta[3][4h*p=a;
a[0]+0a[O]+la[0]+2a[0]+3
那0工0]|a[0][2]||a[0][3]
a[l]+Oa[l]+la[l]+2a[l]+3
叩皿|a[l][2]||a[l][3]
a[2]+0a[2]+la[2]+2a[2]+3
a[2][0]|a[2][l]a[2][2]a[2][3]
a=&a[O]即二維數(shù)組的首地址,即0行的首地址,是行地址;
a+l=&a[l]即二維數(shù)組第1行的首地址,是行地址;
*a=a[O]=&a[O][O]即二維數(shù)組第0行0列的地址,是列地址;
*(a+l)+2=a[l]+2即二維數(shù)組第1行2列的地址,是列地址;
*(*(a+l)+2)=*(a[l]+2)=a[l][2]即數(shù)組第1行2列元素的值;
6.2數(shù)組與指針
6.2.3指向二維數(shù)組的指針
A歸納二維數(shù)組元素的地址:
,a+i、&a[i]——表示第i行首地址,指向行;
*(a+i)、&a[i][O]
——表示第i行第0列元素的地址,指向列;
元素的地址可以表示為:
——a[i]+j、*(a+i)+j
元素的值可以表示為:
——*(*(a+i)+j)
6.2數(shù)組與指針
運(yùn)行結(jié)果為:
例6.9二維數(shù)組的地址。
1000,1000,1000,1000,1000
#include<stdio.h>1008,1008,1008,1008,1008
1016,1016,1016,1016,1016
voidmain()1010,1010
{inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11});
printf("%u,%u,%u,%u,%uM\a,*a,a[0],&a[0],&a[0][0]);
printf("%u,%u,%u,%u,%u,\n",a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf("%u,%u,%u,%u,%u,\n",a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%u,%u\rT,a[1]+1,*(a+1)+1);}
6.2數(shù)組與指針
例6.10確定數(shù)組每個成分的大小。
運(yùn)行結(jié)果為:
#include<stdio.h>
Thesizeofa=24
Thesizeofa[0]=8
voidmain()
Thesizeofa[0][0]=2
{inta[3][4]={{0,1,2,3},{4}5,6,7},{8,9,10,11});
printf(ifThesizeofa=%u\nlv,sizeof(a));
printf(MThesizeofa[0]=%u\n",sizeof(a[0]));
printf(MThesizeofa[0][0]=%u\nfi,sizeof(a[0][0]));}
6.2數(shù)組與指針
例6.11通過地址訪問二維數(shù)組的元素。
#include<stdio,h>
voidmain()
{inta[3][4]={{0,1,2,3},{4}5,6,7},{8,9,3,6});
inti,j;運(yùn)行結(jié)果為:
a[0][0]=0a[0][1]=1a[0][2]=2a[0][3]=3
for(i=0;i<3;i++)
a[1][0]=4a[1][1]=5a[1][2]=6a[1][3]=7
{for(j=0;j<4;j++)a[2][0]=8a[2][1]=9a[2][2]=3a[2][3]=6
printf("a[%d][%d]=%dif,i,j,*(a[i]+j));
/**(a[i]+j)間接訪問與a[叩]和*(*(a+i)+j)一樣*/
printfC^n");}}
6.2數(shù)組與指針
6.2.3指向二維數(shù)組的指針
?指向二維數(shù)組元素的指針變量:
設(shè)有如下定義inta[3][4];
/二維數(shù)組占用一片連續(xù)的內(nèi)存空間存儲數(shù)據(jù);
——即各元素按行順序存放,下一行的第一個元素
緊接在上一行最后一個元素之后存放;
/數(shù)組元素相對數(shù)組a起始地址的位移量是:
——i*4+j;
/若設(shè)立指針變量p,且有int*p=&a[O][O];
——元素的值即為:*(p+(l*4+2))或*(p+6)
6.2數(shù)組與指針
例642(1)通過指向二維數(shù)組元素的指針變量訪問二維數(shù)
組的元素。運(yùn)行結(jié)果為:
1357
#include<stdio.h>
9111315
voidmain()17192123
{inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int*p;0
for(p=a(07;p<a[0]+12;p++)——場七—―
{if((p-a[0]}%4==0)printf("\rT);/*訪問一行后換行*/
",,,
printf(%4dJ*p);}
)
6.2數(shù)組與指針
6.2.3指向二維數(shù)組的指針
?指向行數(shù)組的指針變量:
定義一個指向曲1個元素組成的一維教翁的指針變量:
類型說明符(*指針變量名)[n];
例如:int(*p)[n]
/*p指向一個有n個元素的一維數(shù)組,是療揩W變量7
設(shè)有如下定義:inta[3][4];int(*p)[4];p=a;則:
/p+i:指向一維數(shù)組a[i];
^*(p+i)+j:是二維數(shù)組元素的地址;
zV(P+i)+j):是二維數(shù)組元素的值;
6.2數(shù)組與指針
例6.12(2)通過指向一維數(shù)組的指,針變量訪問二維數(shù)組的
元素。
Ai可
#include<stdio.h>?
voidmain()
{int3[3][4]={1,3,5,7,9,11,?3,15,17,19,21,23);
inti,j,(*P)[4];°
P=a;0
for(i=0;i<3;i++)運(yùn)行結(jié)果為:
{for0=O;j<4;j++)1357
printf(,,%4dl,,*(*p+j));9111315
P++;17192123
printfC^n11);}}
6.3字符串與指針
6.3.1字符串和字符串結(jié)束標(biāo)志
?用一對雙引號括起來的字符序列稱為字符串常量
C語言在存儲字符串時規(guī)定在最后一個字符后附加存
儲一個空字符(即ASC"怒魚為。的竽筋表并為‘⑦
We1C0me\0
AC語言中沒有字符串類型變量,以使用字符數(shù)
組來存儲字符串,或者把字符串的首地址保存到字符
指針變量中,通過字符數(shù)組或字符指針實(shí)現(xiàn)對字符串
的處理。
6.3字符串與指針
6.3.2字符數(shù)組
?一維字符數(shù)組的定義:
char字符數(shù)組名[整型常量表達(dá)式];
例如:
chara[10];
經(jīng)上述定義后,字符數(shù)組a中雖然有10個數(shù)組元素,
但為了解決字符串的正確讀取問題,它只能用于存放
不超過9個字符組成的字符串。
6.3字符串與指針
6.3.2字符數(shù)組
對字符數(shù)組未被
?一維字符數(shù)組元素的初始化:賦值的元素系統(tǒng)
自動將其賦
(1)字符數(shù)組逐個元素賦初值值為至C\o)z
例如.?charstr[6]={'H',七「‘,"','o',
J
He110\0
又如;charstr[7]={'H',七"','I','o',
5o
Ho\0\0
6.3字符串與指針
6.3.2字符數(shù)組
A一維字符數(shù)組元素的初始化:
(2)使用字符串常量初始化字符數(shù)組
例如.?charch[6]={“Hello"};
charch[6]="Hello,5;
charch[10]={“Hello"};/*ch[5卜ch[9]均存
放'\0'*l
charch[]={"Hello"};"ch的元素個數(shù)自動定為6*/
6.3字符串與指針
6.3.2字符數(shù)組
運(yùn)行結(jié)果為:
A一維字符數(shù)組元素的引用:
Beijing2008
例一維字符數(shù)組的引用
6.132008
#include<stdio.h>
66
voidmain()
{chara[]={,fBeijing2008fi},b[5]={''0'};inti;
for(i=0;i<4;i++)b[i]=a[i+7];
for(i=0;i<H;i++)printf(',%c,,,a[i]);
printf("\rT);
for(i=0;i<4;i++)printf("%c",b[i]);
printf("\rT);
printf("%d\rT,a[O]);}
6.3字符串與指針
6.3.2字符數(shù)組
A字符數(shù)組的輸入輸出(將字符串中字符逐個輸入輸出)
例6.14字符的逐個輸入輸出。
運(yùn)行情況為:
#include<stdio,h>
?Howareyou
voidmain()
Howareyou
{charc[12]={f\0'};inti;
@Howareyou
for(i=0;i<12;i++)
Howareyou
scanlilft("%/Uc"y&cR1fl,)?
for(i=0;i<12;i++)/一
printf("%c",c[i]);/[£可用getchar。、入
printf("\n");°°°P
^HgetcheQ^
6.3字符串與指針
6.3.2字符數(shù)組
A字符數(shù)組的輸入輸出(將整個字符串一次輸入輸出)
例如:charstr[13];
scanf(u%s55,str);printf(u%s55,str);
⑴用“%s”格式符時,輸出項(xiàng)逐數(shù)組名,而不是數(shù)組元
素名。輸入項(xiàng)亦為教紹名,即前面不要再加“&”。
⑵當(dāng)數(shù)組長度大于字符串實(shí)際長度,也只輸出到第一個
NT結(jié)束。如:charcffO/={^well,,};printf(u%s5,,c);
⑶用“scanf”輸入字符串時,將把包、跳格邦回車都
作為結(jié)束符。上例如果輸入:howareyou!(回車)
則輸出結(jié)果為:Howo
6.3字符串與指針
6.3.2字符數(shù)組
A二維字符數(shù)組
/定義二維字符數(shù)組的語法格式如下:
char數(shù)組名[整型常量表達(dá)式1][整型常量表達(dá)式2];
例如:chara[3][10];
(1)同數(shù)值二維數(shù)組類似,可以把一個二維字符數(shù)組分解
為多個一維字符數(shù)組來處理;
g對于二維數(shù)組,可通過對單個字符元素的引用獲得各
字符;也可通過對一行的引用獲得一個字符串。
6.2數(shù)組與指針
例6.15二維字符數(shù)組單個元素的引用。
#include<stdio,h>
voidmain()
{charweek[7][10]={"Sunday","Monday","Tuesday",
"Wednesday","Thursday","Friday","Saturday",};
intij;運(yùn)行結(jié)果為:
for(i=0;i<7;i++)Sunday
{forj=0;j<10;j++)Monday
%Tuesday
printf("c”,week[i][j]);Wednesday
printf("\rT);Thursday
)Friday
Saturday
)
6.2數(shù)組與指針
例6.16二維字符數(shù)組行的引用。
#include<stdio.h>
voidmain()
{charweek[7][10]={"Sunday","Monday","Tuesday",
"Wednesday","Thursday","Friday","Saturday");
inti;運(yùn)行結(jié)果為:
Sunday
for(i=0;i<7;i++)Monday
',,,
{printf(%sJweek[i]);Tuesday
printf("\rT);Wednesday
Thursday
)Friday
}Saturday
6.3字符串與指針
6.3.3指向字符串的指針變量
A指向字符串常量的指針變量
如有說明語句:
char*str=<<Thisisastring.
這是對字符指針變量的定義及初始化。
其含義是:
,系統(tǒng)先分配一塊長度為字符串字符個數(shù)加上1的連續(xù)
的內(nèi)存空間以存儲字符串常量"Thisisastring.";
/然后將連續(xù)內(nèi)存空間的首地址喊給字棟指鈦stn
,str只占用2字節(jié),并沒有存儲字符串的全部字符。
6.2數(shù)組與指針
例6.17字符串指針。
#include<stdio,h>
voidmain()
{char*string;
string=,lThisisastring.";
',,,
printf(%s\nJstring);
string+=8;
while(*string)
運(yùn)行結(jié)果為:
{putchar(string[0]);
Thisisastring,
string++;
astring.
)
)
6.3字符串與指針
6.3.3指向字符串的指針變量
?指向字符數(shù)組的指針變量
例6J8指向字符數(shù)組的指針。
運(yùn)行結(jié)果為:
#include<stdio.h>
voidmain()Thisisastring.
{charstr[]=,,Thisisastring/';Thisisastring,
char*string;string=str;astring.
printf(li%s\nii,str);
',,,
printf(%s\nJstring);
string+=8;。o
while(*string)
{putchar(string[O]);
string++;}}
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
⑴竽符數(shù)紛由若干元素組成,它存儲了包括\0'
在內(nèi)的字符串中的所有字符;而字將揩W存放的
是字符串的首地址,并不存放任何字符;
注意區(qū)別如下的初始化語句:
char*str1=<<lloveChina.";
charstr2[]=<<lloveChina.”;
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
(2)注意區(qū)別如下的初始化語句:
char*str1;str1=ulloveChina.n;
等價與char*str1=ulloveChina.n;
而charstr2[14];str2=^lloveChina.'';
但charstr2[14]=ulloveChina」;
°°0
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
(3)若定義的是字符數(shù)組,在編譯時就為它分配內(nèi)存單
元,其首地址是確定的;而定義字符趨分變量時,字
符指針變量本身的地址是確定的,但其存放的地址值
是隨機(jī)的;
charstr2[10];scanf(u%s55,str2);
char*str1;scanf(u%s55,str1);
char*str1,str2[10];str1=str2;
scanf(u%sJ\str1);x/
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
(4)字多數(shù)翁名雖然代表地址,但它的值是不能改變的;
而\字符指針變量的值是可以改變的。
char*str1=^lloveChina」';
str1=str1+7;printf("%s'',str1);
charstr2[]={ulloveChina.''};
str2=str2+7;printf("%s'',str2);X
6.3字符串與指針
6.3.5字符串處理函數(shù)
Agets()函數(shù)
調(diào)用格式:gets(string);
功能說明:從鍵盤讀入字符串,宜到讀入換行符為止,
用10'欠耆夜方濟(jì)并把讀入的字符串存入以string為
首地址的存儲區(qū)。
charstr1[10];gets(strl);
或char*st1,st2[10];st1=st2;
gets(stl);
6.3字符串與指針
6.3.5字符串處理函數(shù)
Aputs()函數(shù)
調(diào)用格式:puts(string);
功能說明、把首地址為string的字符串輸出顯示在屏幕
上,輸出時用代替10L
chars1[20],s2[20]="Hel⑹nWorld!”;
gets(s1);當(dāng)輸入:Howareyou
puts(stl);puts(s2);輸出:Howareyou
Hello
World!
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcpy。函數(shù)
調(diào)用格式:strcpy(string1,string2);
功能說明:把string2的字符串復(fù)制到stringl中。
⑴stringl只可以是字符數(shù)組名或字符指針變量名;
而string2既可以是字符數(shù)組名或字符指針變量名;也
可以是字符串常量:且stringl所申請的存儲空間要大
于string2所對應(yīng)的字符串的長度;<若stringl是字符
指針,要保證stringl已賦值]。
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcpy。函數(shù)
調(diào)用格式:strcpy(string1,string2);
功能說明:把string2的字符串復(fù)制到stringl中。
chara[6]="China",b[]="FZ”;
strcpy(a,b);
strcpy(b,u1O,5);輸出:
puts(a);puts(b);FZ
10
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcmp()函數(shù)
調(diào)用格式:strcmp(string1,string2);
功能說明:對stringl和string2所對應(yīng)的字符串從左到
五一一進(jìn)行比較(比較字符的ASCH碼值的大小),第一
個不相等的字符的大小決定了整個字符串的大小,若
stringl和string2的所有字符完全相同,貝Ustringl等
于string2。
6.2數(shù)組與指針
例6.19字符串比較函數(shù)。
不能直接用關(guān)系
#include〈string.h>
運(yùn)算符對字符串
voidmain()進(jìn)行比較!
{inta,b,c;o一~
anstrcrrfpC'abc'Uabc");/*所有對應(yīng)的字符均相同*/
b=strcmp(”abc"Jabebc");/*'c'v'e'*/
',,,,,,
c=strcmp(abcOJabc');
〃前3個字符相同,前者長度大于
printf(”%d,%d,%d\n\a,b,c);°,248
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcat()函數(shù)
調(diào)用格式.?strcat(string1,string2);
功能說明:將string2對應(yīng)的字符串連接到stringl所對
應(yīng)的字符串末尾。連接時將stringl原來的30,去掉,
只在新字符串后保留一個10'。(要求stringl必須已
賦值且有足夠大的空間容納連接后的字符串)。
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcat()函數(shù)
調(diào)用格式:strcat(string1,string2);
假設(shè).?chars1[12]=uChina,\s2[8]="Chinan;
chars3[]=uFujian5\*s4;
strcat(s1,s3);/*連接后s1為:ChinaFujian,s3不變*/
strcat(s2,s3);/*s2長度不夠,連接后可能錯誤7
strcat(s4,s3);/*s4值不確定,連接后可能出錯7
6.3字符串與指針
6.3.5字符串處理函數(shù)
___----
Astrlen()函數(shù)包括\0'!
調(diào)用格式:strlen(string);——
O
功能說明:返回string字符串中字符的個數(shù)。
例620字符串長度函數(shù)。
運(yùn)行結(jié)果為:
#include〈string.h>
voidmain()8,3,4
{inta,b,c;char*sO="ABC123\n";
chars1[10]={'A','B','C',''0','1
a=strlen(sO);b=strlen(s1);c=strlen(”abcO");
printf(”%d,%d,%d\n”,a,b,c);}
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrlwr()函數(shù)
調(diào)用格式:strlwr(string);
功能說明:把string字符串中的大寫字母轉(zhuǎn)換成小寫字
母,其他字符不變。
例如:
chara[15]=^BeiJing2008n;
運(yùn)行結(jié)果為:
strlwr(a);
beijing2008
puts(a);}
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrupr()函數(shù)
調(diào)用格式:strupr(string);
功能說明、把string字符串中的小寫字母轉(zhuǎn)換成大寫字
母,其他字符不變。
例如:
chara[15]=^BeiJing2008n;
運(yùn)行結(jié)果為:
strlwr(a);
EIJING2008
puts(a);}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.21利用字符指針把字符串s1復(fù)制到字符串s2。
#include<stdio.h>
voidmain()運(yùn)行結(jié)果為:
{chars1[『"Hello,World!”,s2[15];Hello,World!
char*from=s1,*to=s2;Hello,World!
while(*from)
{*to=*from;to++;from++;}
/*循環(huán)體內(nèi)語句可簡化為*to++=*from++;7
puts(s1);puts(s2);
)
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
from
s1|H|e|I|I|o||W|o|r|I|d|!|\0
to
s2Hello,World!\0
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.22利用字符指針比較字符串s1、s2的大小。
#include<stdio,h>
voidmain()
{chars1[80],s2[80];intd;char*str1=s1,*str2=s2;
printfC'Inputstrings1ands2:\nM);
gets(strl);gets(str2);
str1
s1abc\0
str2
abebc\0
6.3字符串與指針
6.3.6字符串應(yīng)用舉例__________________
例6.22利用字符指針比較字符串s1、s2的大小。
while(*str1&&*str2)運(yùn)行情況為:
?abcabc
{d=*str1-*str2;0
@abcOabc
if(d!=0)break;
48
str1++,str2++;}@abcabebc
-2
if(d==0)d=*str1-*str2;?abjkabcmt
7
printf("%d\rT,d);}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例_______________
例6.23將字符串s1、s2連接后存放到s1。
#include<stdio,h>
voidmain()
{chars1[80],s2[80];inti=05j=0;
printfC'Inputstrings1ands2:\nM);
gets(s1);gets(s2);
while(s1[i]!=i\0,)i++;/*找s1串的串尾7
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
while(s2[j]!="\0i)〃s2串逐字符存入s1串末尾,直到s2串尾*/
{s1[i]=s2U];I*s2串的第j個字符存放在s1[i]*/
運(yùn)行情況為:
Fujian
j++;)China
FujianChina
/*在連接后的字符串si末尾加上字符串結(jié)束符*/
puts(s1);
)
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.24將字符串s1中的所有大寫字母轉(zhuǎn)換成小寫字母,
將字符串s2中的所有小寫字母轉(zhuǎn)換成大寫字母。
#include<stdio.h>
voidmain()
{chars1[尸'BeiJing2008",s2[]="BeiJing2008”;
char*str1,*str2;str1=s1,str2=s2;
while(*str1!='\0')
{if((*str1>='A')&&(*str1<=iZi))
*strl+=32;
str1++;
)
6.3字符串與指針
6.3.6字符串應(yīng)用舉例_______________________
例6.24將字符串s1中的所有大寫字母轉(zhuǎn)換成小寫字母,
將字符串s2中的所有小寫字母轉(zhuǎn)換成大寫字母。
while(*str2!=,\0,)
{if((*str2>=iai)&&(*str2<=izi))
*str2-=32;
str2++;
運(yùn)行結(jié)果為:
)
puts(s1);beijing2008
puts(s2);B曰JING2008
}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例_____________
例6.25刪除一個字符串中所有的空格字符。
#include<stdio.h>pl
voidmain()
■1
{chars[80],*p1,*p2;s18FuJ1anChna\0
gets(s);p1=p2=s;p2
while(*p1)
運(yùn)行結(jié)果為:
if(*p1==,')p1++;
else*p2++=*p1++;18FujianChina
*p2='\0';18FujianChina
',,,
printf(%s\nJs);
}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.26將一由數(shù)字組成的字符串轉(zhuǎn)換為其對應(yīng)的整數(shù)。
#include<stdio.h>
voidmain()P
{chars[8],*p;
200758\0
longintn=0;
gets(s);p=s;
while(*p)
運(yùn)行結(jié)果為:
{n=n*10+(*p-48);
200758
P++;)
',,,200758
printf(%lu\nJn);
)
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.27將一個字符串反向。
#include<stdio.h>
voidmain()
{charstr[50],*p1,*p2,temp;
printfC'Enterstring:");
gets(str);p1=p2=str;/*指針p1和p2指向str*/
while(*p1)
p1++;I*找到串結(jié)束標(biāo)記''0'7
p1-;/*指針p指向字符串中的最后一個字符7
6.3字符串與指針
6.3.6字符串應(yīng)用舉例________________________
例6.27將一個字符串反向。
while(p2<p1)
/*當(dāng)串前面的指針s小于串后面的指針p時,進(jìn)行循環(huán)7
{temp=*p2;/*交換兩個指針?biāo)赶虻淖址?
*p2++=*p1;
〃指向串前面的指針p2向后(+1)移動一個位置7
*p1?=temp;}
/*指向串后面的指針p1向前(」)移動一個位置7
puts(str);
}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.28將多個字符串按從小到大排序。
temp
s[6][8]={"FORTRAN"JPASCAL"JBASIC","COBOL","
temp[20];inti,j,k;
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
for(i=0;i<5;i++)/*使用選擇法從小到大排序*/
{k=i;
for(j=i+1;j<6;j++)
if(strcmp(s[k],s[j])>0)k=j;
"記錄當(dāng)前最小串的行號k*/
if(k!=i)
{strcpy(temp,s[k]);/*將最小的串與當(dāng)前串交換7
strcpy(s[k],s[i]);
strcpy(s[i],temp);}
)
for(i=0;i<6;i++)/*排序后輸出各字符串7卜
puts(s[i]);
6.4指針數(shù)組和指向指針的指針
6.4.1指針數(shù)組
由指向同一數(shù)據(jù)類型的指針變量構(gòu)成的數(shù)組稱為
指針數(shù)組,即指針數(shù)組中的每一個元素都是指針,且
指針?biāo)傅臄?shù)據(jù)對象類型也是一致的。
A定義指針數(shù)組的語法格式:
類型名*數(shù)組名[常量表達(dá)式];
例如:int*pa[5];
表示定義一個由5個指針變量構(gòu)成的數(shù)組,
每個數(shù)組元素都是指向一個整數(shù)的指針。
6.4指針數(shù)組和指向指針的指針
6.4.1指針數(shù)組
例6.29通過指針數(shù)組元素訪問二維數(shù)組的元素。
#include<stdio.h>
voidmain()
{inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,3,6}};
int*pa[3];intij;
for(i=0;i<3;i++)pa[i]=a[i];
paa
pa[0l1->|a[0]|f|a[0][0]||a[0][l]||a[0][2]||a[0][3]
pa[l]|-|a[l]]-|a[l][l]||a[l][2]]|a[l][3]
Pa[2]]—|a[2]—|a[2][0]||a[2][l]||a[2][2]||a[2][3]
6.4指針數(shù)組和指向指針的指針
6.4.1指針數(shù)組
例629通過指針數(shù)組元素訪問二維數(shù)組的元素。
運(yùn)行結(jié)果為:
for(i=0;i<3;i++)a[0][0]=0a[0][1]=1a[0][2]=2a[0][3]=3
a[1][0]=4a[1][1]=5a[1][2]=6a[1][3]=7
{for(j=0;j<4;j++)a[2][0]=8a[2][1]=9a[2][2]=3a[2][3]=6
printf("a[%d][%d]=%dfiJ,j,*(pa[i]+j));
/**(pa[i]+j)與*(a[i]+j)、a[卯]和*(*(a+i)+j)一樣*/
printf”n");}}
6.4指針數(shù)組和指向指針的指針
6.4.1指針數(shù)組
例6.30通過指針數(shù)組表示多個字符串。
#include<stdio.h>
#include<string.h>
voidmain()
ii,iiiif
{char*ps[6]={FORTRAN,PASCALJ
,,,,,,,,,i,,,,,i
BASIC,COBOL,CJC++};inti,j,k;
for(i=0;i<6;i++)puts(ps[i]);}
6.3字符串與指針
6.4.1指針數(shù)組
例6.31將多個字符串按從小到大排序。
*ps[6]={"F0RTRAN","PASCAL","BASIC"JCOBOL”,
JC++"},*temp;inti,j,k;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)中介公司店長的工作總結(jié)
- 訂貨合同書樣本
- 論經(jīng)濟(jì)合同書中的擔(dān)保
- 國際物流代理合同
- 自動扶梯標(biāo)準(zhǔn)安裝施工方案
- 項(xiàng)目仲裁服務(wù)合作合同
- 項(xiàng)目質(zhì)量風(fēng)險監(jiān)管協(xié)議模板
- 商業(yè)會展項(xiàng)目合作合同
- 農(nóng)村農(nóng)業(yè)圖書館貸款合同
- 植物花卉贈與協(xié)議
- 《我們小點(diǎn)兒聲》評課報告
- 比亞迪新能源汽車分析五力模型
- 面向雙碳戰(zhàn)略,打造物流企業(yè)零碳路線圖 2023 -智慧貨運(yùn)中心 宋蘇
- 教育信息處理教學(xué)分析第四章
- (完整版)全國各省份城市明細(xì)表
- 餐飲部服務(wù)流程演示文稿
- 周潔名園長工作室個人三年發(fā)展規(guī)劃
- 2020-2022全國高考真題英語匯編:閱讀理解A篇
- GB/T 32072-2015帶傳動抗靜電同步帶的導(dǎo)電性要求和試驗(yàn)方法
- GB/T 30475.2-2013壓縮空氣過濾器試驗(yàn)方法第2部分:油蒸氣
- T-SZWA 001-2017 高分子益膠泥
評論
0/150
提交評論