版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章指針
指針就是C語言中廣泛使用的一種數(shù)
據(jù)類型,它是C語言的一個(gè)重要特色。也
是C語言的精華。
正確靈活地應(yīng)用指針,可以有效地表
示各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu):能方便地使用
數(shù)組,處理字符串;在調(diào)用函數(shù)時(shí)亦能
得到多個(gè)返回值。使程序簡潔、高效。
第6章指針
?6.1指針和指針變量
?6.2數(shù)組與指針
?6.3字符串與指針
?6.4指針數(shù)組與指向指針的指針
6.1指針和指針變量
6.1.1指針的概念
在程序中所定義的變量,編譯系統(tǒng)會(huì)根
據(jù)變量的類型,分配一定長度的存儲(chǔ)空間。
內(nèi)存中每一個(gè)字節(jié)有唯一編號(hào)。如:
inta2個(gè)字節(jié)
floatb4個(gè)字節(jié)
charc1個(gè)字節(jié)
6.1指針和指針變量
6.1.1指針的概念
?按變量的重級(jí)存取變量的值。例如:
scanf(u%d5\&a);
printfC^f",b);
6
2000
6.1指針和指針變量
6.1.1指針的概念
>按變量的幽勿必呦加存取變量的侑。
例如假設(shè)變量pa的地址為1000,用變量pa來
存放變量a的地址&a,止匕時(shí)pa的值為2000。如果
要得到a的值,可以先訪問變量pa,得到pa的值
為2000(變量a的地址),再通過地址2000找到所指
存儲(chǔ)單元中的值(a的值),見圖:
paa
2000------d~6-
10002000
6.1指針和指針變量
6.1.1指針的概念
?指針
一個(gè)變量的地址稱為該變量的指針。如地址
2000是變量a的指針,2002是變量b的指針。
>指針變量
如果有一個(gè)變量專門用來存放另一個(gè)變量的地
址
(即指針),稱為指針變量。如pa是一個(gè)指針變
量,pa中的值為指針。
6.1指針和指針變量
6.1.2指針變量的定義
A定義指針變量的語法格式
類型名*標(biāo)識(shí)符;
例如:int*p1,*p2;
/int——p1,p2是指向整壟變量的指針變量。
----指針標(biāo)記。
/p1,p2——指針變量名。
6.1指針和指針變量
6.1.2指針變量的定義
說明:
?指針可以指向任何類型的對(duì)象,包括指向數(shù)組、指
向別的指針變量、指向函數(shù)或指向結(jié)構(gòu)變量等;
?指針變量同普通變量一樣,也占用內(nèi)存單元,且所
有指針變量都占用相同的長度,(一般為2個(gè)字節(jié)
?一個(gè)指針變量被定義后,它所指向?qū)ο蟮念愋鸵簿?/p>
確定了。若把匕例的m指向一浮點(diǎn)變量,則出錯(cuò)。
6.1指針和指針變量
6.1.3指針運(yùn)算及指針變量的引用
A&運(yùn)算符
&是單目運(yùn)算符,其功能是取出操作對(duì)象在內(nèi)
存單元的地址,其結(jié)合性為自右至左。
例如:pla
inta9b;
int*p1,*p2;
p1=&a;
p2=&b;
6.1指針和指針變量
6.1.3指針運(yùn)算及指針變量的引用
?*運(yùn)算符
*也是單目運(yùn)算符,其功能是訪問操作對(duì)象所指向
的變量,操作對(duì)象必須是指針變量或指針表達(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)對(duì)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的同時(shí)將變量a的地址作為初值。
(2)賦值語句的方法
inta;
int*pa;pa=&a;
先定義pa,再將同類型變量a的地址賦給pa。
6.1指針和指針變量
6.1.4指針變量的賦值
A指針變量的賦值運(yùn)算有以下幾種形式:
(3)把一個(gè)指針變量的值賦另一個(gè)指針變量
inta,*pa=&a,*pb;
pb=pa;
即把a(bǔ)的地址賦予pb,這時(shí)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通過指針變量求三個(gè)變量中的最大值和最小值。
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ù)組的指針變量:
首先、定義一個(gè)整型數(shù)組a,再定義一個(gè)指向整型變量
的指針變量D,然后將此數(shù)絹的第。號(hào)元素的地址賦
笈,此時(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ù)組的下一個(gè)元素,而不是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)等價(jià)
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ì)算;(此時(shí)d=4)
⑦只有指向數(shù)組的指針變量可以進(jìn)行加減運(yùn)算;指向
其他類型的指針變量作加減運(yùn)算無意義;
(3)通過指針移動(dòng)間接訪問數(shù)組元素(如*p++)的效率比
直接使用數(shù)組元素的效率高。
6.2數(shù)組與指針
6.2.2指針變量的運(yùn)算
A加減運(yùn)算和增(減)量運(yùn)算:
⑷要注意和“++”、連用時(shí)的結(jié)合性;
等價(jià)于*(p++)先取出P指針變量所指向的單元
內(nèi)容(即*P),然后再使P+1-P;
等價(jià)于*(++p)先使P+1一p,然后再取出P指
針變量所指向的單元內(nèi)容;
,(*p)++表示將P所指向的單元內(nèi)容值加1。
@數(shù)組名是常量,不能對(duì)數(shù)組名進(jìn)行賦值或自增自減
運(yùn)算。如:a++;>a=a+i;在邏輯上都是錯(cuò)誤的。
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ù)組的兩個(gè)指針變量之間相減才有意義:相
減的結(jié)果是兩個(gè)指針?biāo)赶虻脑刂g相差的元
素個(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的兩個(gè)指針變量,貝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]存儲(chǔ)的數(shù)據(jù)值
*(a+l尸即數(shù)組元素存儲(chǔ)的數(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ù)組每個(gè)成分的大小。
運(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)存空間存儲(chǔ)數(shù)據(jù);
——即各元素按行順序存放,下一行的第一個(gè)元素
緊接在上一行最后一個(gè)元素之后存放;
/數(shù)組元素相對(duì)數(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ù)組的指針變量:
定義一個(gè)指向曲1個(gè)元素組成的一維教翁的指針變量:
類型說明符(*指針變量名)[n];
例如:int(*p)[n]
/*p指向一個(gè)有n個(gè)元素的一維數(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)志
?用一對(duì)雙引號(hào)括起來的字符序列稱為字符串常量
C語言在存儲(chǔ)字符串時(shí)規(guī)定在最后一個(gè)字符后附加存
儲(chǔ)一個(gè)空字符(即ASC"怒魚為。的竽筋表并為‘⑦
We1C0me\0
AC語言中沒有字符串類型變量,以使用字符數(shù)
組來存儲(chǔ)字符串,或者把字符串的首地址保存到字符
指針變量中,通過字符數(shù)組或字符指針實(shí)現(xiàn)對(duì)字符串
的處理。
6.3字符串與指針
6.3.2字符數(shù)組
?一維字符數(shù)組的定義:
char字符數(shù)組名[整型常量表達(dá)式];
例如:
chara[10];
經(jīng)上述定義后,字符數(shù)組a中雖然有10個(gè)數(shù)組元素,
但為了解決字符串的正確讀取問題,它只能用于存放
不超過9個(gè)字符組成的字符串。
6.3字符串與指針
6.3.2字符數(shù)組
對(duì)字符數(shù)組未被
?一維字符數(shù)組元素的初始化:賦值的元素系統(tǒng)
自動(dòng)將其賦
(1)字符數(shù)組逐個(gè)元素賦初值值為至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的元素個(gè)數(shù)自動(dòng)定為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ù)組的輸入輸出(將字符串中字符逐個(gè)輸入輸出)
例6.14字符的逐個(gè)輸入輸出。
運(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ù)組的輸入輸出(將整個(gè)字符串一次輸入輸出)
例如:charstr[13];
scanf(u%s55,str);printf(u%s55,str);
⑴用“%s”格式符時(shí),輸出項(xiàng)逐數(shù)組名,而不是數(shù)組元
素名。輸入項(xiàng)亦為教紹名,即前面不要再加“&”。
⑵當(dāng)數(shù)組長度大于字符串實(shí)際長度,也只輸出到第一個(gè)
NT結(jié)束。如:charcffO/={^well,,};printf(u%s5,,c);
⑶用“scanf”輸入字符串時(shí),將把包、跳格邦回車都
作為結(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ù)組類似,可以把一個(gè)二維字符數(shù)組分解
為多個(gè)一維字符數(shù)組來處理;
g對(duì)于二維數(shù)組,可通過對(duì)單個(gè)字符元素的引用獲得各
字符;也可通過對(duì)一行的引用獲得一個(gè)字符串。
6.2數(shù)組與指針
例6.15二維字符數(shù)組單個(gè)元素的引用。
#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.
這是對(duì)字符指針變量的定義及初始化。
其含義是:
,系統(tǒng)先分配一塊長度為字符串字符個(gè)數(shù)加上1的連續(xù)
的內(nèi)存空間以存儲(chǔ)字符串常量"Thisisastring.";
/然后將連續(xù)內(nèi)存空間的首地址喊給字棟指鈦stn
,str只占用2字節(jié),并沒有存儲(chǔ)字符串的全部字符。
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ù)組與字符指針變量的對(duì)比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
⑴竽符數(shù)紛由若干元素組成,它存儲(chǔ)了包括\0'
在內(nèi)的字符串中的所有字符;而字將揩W存放的
是字符串的首地址,并不存放任何字符;
注意區(qū)別如下的初始化語句:
char*str1=<<lloveChina.";
charstr2[]=<<lloveChina.”;
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對(duì)比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
(2)注意區(qū)別如下的初始化語句:
char*str1;str1=ulloveChina.n;
等價(jià)與char*str1=ulloveChina.n;
而charstr2[14];str2=^lloveChina.'';
但charstr2[14]=ulloveChina」;
°°0
6.3字符串與指針
6.3.4字符數(shù)組與字符指針變量的對(duì)比
A字符數(shù)組與字符指針變量的區(qū)別有以下幾方面:
(3)若定義的是字符數(shù)組,在編譯時(shí)就為它分配內(nèi)存單
元,其首地址是確定的;而定義字符趨分變量時(shí),字
符指針變量本身的地址是確定的,但其存放的地址值
是隨機(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ù)組與字符指針變量的對(duì)比
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為
首地址的存儲(chǔ)區(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的字符串輸出顯示在屏幕
上,輸出時(shí)用代替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所申請(qǐng)的存儲(chǔ)空間要大
于string2所對(duì)應(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);
功能說明:對(duì)stringl和string2所對(duì)應(yīng)的字符串從左到
五一一進(jìn)行比較(比較字符的ASCH碼值的大小),第一
個(gè)不相等的字符的大小決定了整個(gè)字符串的大小,若
stringl和string2的所有字符完全相同,貝Ustringl等
于string2。
6.2數(shù)組與指針
例6.19字符串比較函數(shù)。
不能直接用關(guān)系
#include〈string.h>
運(yùn)算符對(duì)字符串
voidmain()進(jìn)行比較!
{inta,b,c;o一~
anstrcrrfpC'abc'Uabc");/*所有對(duì)應(yīng)的字符均相同*/
b=strcmp(”abc"Jabebc");/*'c'v'e'*/
',,,,,,
c=strcmp(abcOJabc');
〃前3個(gè)字符相同,前者長度大于
printf(”%d,%d,%d\n\a,b,c);°,248
6.3字符串與指針
6.3.5字符串處理函數(shù)
Astrcat()函數(shù)
調(diào)用格式.?strcat(string1,string2);
功能說明:將string2對(duì)應(yīng)的字符串連接到stringl所對(duì)
應(yīng)的字符串末尾。連接時(shí)將stringl原來的30,去掉,
只在新字符串后保留一個(gè)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長度不夠,連接后可能錯(cuò)誤7
strcat(s4,s3);/*s4值不確定,連接后可能出錯(cuò)7
6.3字符串與指針
6.3.5字符串處理函數(shù)
___----
Astrlen()函數(shù)包括\0'!
調(diào)用格式:strlen(string);——
O
功能說明:返回string字符串中字符的個(gè)數(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個(gè)字符存放在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刪除一個(gè)字符串中所有的空格字符。
#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)換為其對(duì)應(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將一個(gè)字符串反向。
#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指向字符串中的最后一個(gè)字符7
6.3字符串與指針
6.3.6字符串應(yīng)用舉例________________________
例6.27將一個(gè)字符串反向。
while(p2<p1)
/*當(dāng)串前面的指針s小于串后面的指針p時(shí),進(jìn)行循環(huán)7
{temp=*p2;/*交換兩個(gè)指針?biāo)赶虻淖址?
*p2++=*p1;
〃指向串前面的指針p2向后(+1)移動(dòng)一個(gè)位置7
*p1?=temp;}
/*指向串后面的指針p1向前(」)移動(dòng)一個(gè)位置7
puts(str);
}
6.3字符串與指針
6.3.6字符串應(yīng)用舉例
例6.28將多個(gè)字符串按從小到大排序。
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)前最小串的行號(hào)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ù)組中的每一個(gè)元素都是指針,且
指針?biāo)傅臄?shù)據(jù)對(duì)象類型也是一致的。
A定義指針數(shù)組的語法格式:
類型名*數(shù)組名[常量表達(dá)式];
例如:int*pa[5];
表示定義一個(gè)由5個(gè)指針變量構(gòu)成的數(shù)組,
每個(gè)數(shù)組元素都是指向一個(gè)整數(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ù)組表示多個(gè)字符串。
#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將多個(gè)字符串按從小到大排序。
*ps[6]={"F0RTRAN","PASCAL","BASIC"JCOBOL”,
JC++"},*temp;inti,j,k;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 友善用腦課程評(píng)估與反饋方案
- 監(jiān)控室值班人員工作職責(zé)
- PPP項(xiàng)目入庫標(biāo)準(zhǔn)流程
- 高三理科生百日沖刺復(fù)習(xí)計(jì)劃
- 應(yīng)急演練整改措施
- 圖書館參與學(xué)術(shù)交流合作考核試卷
- 幼兒鋼琴教學(xué)計(jì)劃
- 2025-2030年國家甲級(jí)資質(zhì):中國阻火圈融資商業(yè)計(jì)劃書
- 2025-2030年中國生物組織脫水機(jī)行業(yè)發(fā)展前景調(diào)研及投資戰(zhàn)略分析報(bào)告
- 2025-2030年中國溫室大棚產(chǎn)業(yè)市場競爭格局及未來投資趨勢(shì)分析報(bào)告
- 城市建設(shè)苗木吊裝安全方案
- 中醫(yī)院醫(yī)生作風(fēng)建設(shè)工作方案(6篇)
- (高清版)DB21∕T 1795-2021 污水源熱泵系統(tǒng)工程技術(shù)規(guī)程
- 【MOOC】商業(yè)銀行管理學(xué)-湖南大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年山西建設(shè)投資集團(tuán)有限公司校園招聘考試筆試試題及答案解析
- 護(hù)理脊柱外科出科
- 2024江蘇鹽城港控股集團(tuán)限公司招聘23人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2024年陜西省初中學(xué)業(yè)水平考試·數(shù)學(xué)
- 2024年三支一扶考試基本能力測驗(yàn)試題及解答參考
- 快遞員合同協(xié)議書格式
- 企業(yè)三年規(guī)劃方案
評(píng)論
0/150
提交評(píng)論