C語言指針詳解_第1頁
C語言指針詳解_第2頁
C語言指針詳解_第3頁
C語言指針詳解_第4頁
C語言指針詳解_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論