C语言指针详解_第1页
C语言指针详解_第2页
C语言指针详解_第3页
C语言指针详解_第4页
C语言指针详解_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章指针

指针就是C语言中广泛使用的一种数

据类型,它是C语言的一个重要特色。也

是C语言的精华。

正确灵活地应用指针,可以有效地表

示各种复杂的数据结构:能方便地使用

数组,处理字符串;在调用函数时亦能

得到多个返回值。使程序简洁、高效。

第6章指针

・6.1指针和指针变量

・6.2数组与指针

・6.3字符串与指针

・6.4指针数组与指向指针的指针

6.1指针和指针变量

6.1.1指针的概念

在程序中所定义的变量,编译系统会根

据变量的类型,分配一定长度的存储空间。

内存中每一个字节有唯一编号。如:

inta2个字节

floatb4个字节

charc1个字节

6.1指针和指针变量

6.1.1指针的概念

»按变量的重级存取变量的值。例如:

scanf(u%d5\&a);

printfC^f",b);

6

2000

6.1指针和指针变量

6.1.1指针的概念

>按变量的幽勿必呦加存取变量的侑。

例如假设变量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定义指针变量的语法格式

类型名*标识符;

例如:int*p1,*p2;

/int——p1,p2是指向整垄变量的指针变量。

----指针标记。

/p1,p2——指针变量名。

6.1指针和指针变量

6.1.2指针变量的定义

说明:

»指针可以指向任何类型的对象,包括指向数组、指

向别的指针变量、指向函数或指向结构变量等;

»指针变量同普通变量一样,也占用内存单元,且所

有指针变量都占用相同的长度,(一般为2个字节

»一个指针变量被定义后,它所指向对象的类型也就

确定了。若把匕例的m指向一浮点变量,则出错。

6.1指针和指针变量

6.1.3指针运算及指针变量的引用

A&运算符

&是单目运算符,其功能是取出操作对象在内

存单元的地址,其结合性为自右至左。

例如:pla

inta9b;

int*p1,*p2;

p1=&a;

p2=&b;

6.1指针和指针变量

6.1.3指针运算及指针变量的引用

»*运算符

*也是单目运算符,其功能是访问操作对象所指向

的变量,操作对象必须是指针变量或指针表达式。

例如:

Pa

inta=20;&a」20

int*p;

P=&a;

printf("%d'1*p);。°

6.1指针和指针变量

例指针变量的引用。

6.1运行结果为:

#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实现对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指针变量的赋值运算有以下几种形式:

(1)指针变量的初始化

inta;

int*pa=&a;

在定义pa的同时将变量a的地址作为初值。

(2)赋值语句的方法

inta;

int*pa;pa=&a;

先定义pa,再将同类型变量a的地址赋给pa。

6.1指针和指针变量

6.1.4指针变量的赋值

A指针变量的赋值运算有以下几种形式:

(3)把一个指针变量的值赋另一个指针变量

inta,*pa=&a,*pb;

pb=pa;

即把a的地址赋予pb,这时pa与pb均指向a。

(4)把数组的首地址赋予指向数组的指针变量

inta[5],*pa;pa=a;

或inta[5],*pa;pa=&a[O];

数组名表示数组首地址,pa指向数组的首元素。

6.1指针和指针变量

6.1.4指针变量的赋值

A指针变量的赋值运算有以下几种形式:

(5)把字符串的首地址值赋予指向字符型的指针变量

char*pc;pc="CLanguage”;

或char*pc="CLanguage”;

把存放字符串的字符数组首址赋给指针变量pc。

(6)把函数的入口地址赋予指向函数的指针变量

int(*pf)();

pf=f;/*f为函数名7

把f函数的入口地址赋给指针变量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

,,,,运行结果为:

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通过指针变量实现变量值的交换。

#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通过指针变量实现变量值的交换。

#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通过指针变量实现变量值的交换。

#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数组与指针

6.2.1指向一维数组的指针

A定义及初始化指向一维数组的指针变量:

首先、定义一个整型数组a,再定义一个指向整型变量

的指针变量D,然后将此数绢的第。号元素的地址赋

笈,此时p就是指向a数组的指针,数组的指针就是

数绢的起始地址。例如:

inta[5];Pa[0]a[4]

p=&a[O];/*或p=a;*/

6.2数组与指针

6.2.1指向一维数组的指针

A通过指针变量引用一维数组的元素

例如:定义如下数组和指针变量p:

inta[8],i;int*p=a;

p+1-----指向数组的下一个元素,而不是D的值加1。

(1)p+i和a+i是地址,

就是的地址部可以用a+i*d计算。

(2)*(p+i)和*(a+i)

就是p+i或a+i所指向的数组元素a[i]。

(3)a[i]和*(p+i)等价

6.2数组与指针

例6.5使用不同方法访问数组元素。

#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);运行结果为:

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数组与指针

6.2.2指针变量的运算

A加减运算和增(减)量运算:

(1)设P是指向数组a的指针变量,若数组a为float型,

则:p±i——可以用a+i*d计算;(此时d=4)

⑦只有指向数组的指针变量可以进行加减运算;指向

其他类型的指针变量作加减运算无意义;

(3)通过指针移动间接访问数组元素(如*p++)的效率比

直接使用数组元素的效率高。

6.2数组与指针

6.2.2指针变量的运算

A加减运算和增(减)量运算:

⑷要注意和“++”、连用时的结合性;

等价于*(p++)先取出P指针变量所指向的单元

内容(即*P),然后再使P+1-P;

等价于*(++p)先使P+1一p,然后再取出P指

针变量所指向的单元内容;

,(*p)++表示将P所指向的单元内容值加1。

@数组名是常量,不能对数组名进行赋值或自增自减

运算。如:a++;>a=a+i;在逻辑上都是错误的。

6.2数组与指针

例6.6指针算术运算。

voidmain()

运行结果为:

{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所指的数组元素,即a[i]7

pa++;/*pa指向下一元素*/

)

pa=a;

for(i=0;i<5;i++)

printf(lfa[%d]=%dii,i,*pa++);

)

6.2数组与指针

6.2.2指针变量的运算

»指针变量的相减运算:

两指针变量的加操作是无意义的;只有指向

同一数组的两个指针变量之间相减才有意义:相

减的结果是两个指针所指向的元素之间相差的元

素个数。

6.2数组与指针

例6.7两指针变量相减运算。

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数组与指针

6.2.2指针变量的运算

»指针变量的关系运算:

指向同一数组的两指针变量进行关系运算可表示

它们所指数组元素之间的关系;设讨1、是指向数

组a的两个指针变量,贝I」:

pf1==pf2表示pf1和pf2指向同一数组元素;

pf1>pf2表示pf1处于高地址位置;

pf1<pf2表示pf1处于低地址位置。

6.2数组与指针

例6.8两指针变量的比较。

voidmain()运行结果为:

{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数组与指针

6.2.3指向二维数组的指针

»总结一维数组元素的地址:

假设有如下定义:inta[4],*p=a;

pa[0]a[l]a[2]a[3]

a=&a[O]即数组首元素a[0]的地址

a+l=&a[l]即数组元素a[l]的地址

*a=a[O]即数组首元素a[0]存储的数据值

*(a+l尸即数组元素存储的数据值

A讨论二维数组元素的地址:

假设有如下定义: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]即二维数组的首地址,即0行的首地址,是行地址;

a+l=&a[l]即二维数组第1行的首地址,是行地址;

*a=a[O]=&a[O][O]即二维数组第0行0列的地址,是列地址;

*(a+l)+2=a[l]+2即二维数组第1行2列的地址,是列地址;

*(*(a+l)+2)=*(a[l]+2)=a[l][2]即数组第1行2列元素的值;

6.2数组与指针

6.2.3指向二维数组的指针

A归纳二维数组元素的地址:

,a+i、&a[i]——表示第i行首地址,指向行;

*(a+i)、&a[i][O]

——表示第i行第0列元素的地址,指向列;

元素的地址可以表示为:

——a[i]+j、*(a+i)+j

元素的值可以表示为:

——*(*(a+i)+j)

6.2数组与指针

运行结果为:

例6.9二维数组的地址。

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数组与指针

例6.10确定数组每个成分的大小。

运行结果为:

#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数组与指针

例6.11通过地址访问二维数组的元素。

#include<stdio,h>

voidmain()

{inta[3][4]={{0,1,2,3},{4}5,6,7},{8,9,3,6});

inti,j;运行结果为:

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数组与指针

6.2.3指向二维数组的指针

»指向二维数组元素的指针变量:

设有如下定义inta[3][4];

/二维数组占用一片连续的内存空间存储数据;

——即各元素按行顺序存放,下一行的第一个元素

紧接在上一行最后一个元素之后存放;

/数组元素相对数组a起始地址的位移量是:

——i*4+j;

/若设立指针变量p,且有int*p=&a[O][O];

——元素的值即为:*(p+(l*4+2))或*(p+6)

6.2数组与指针

例642(1)通过指向二维数组元素的指针变量访问二维数

组的元素。运行结果为:

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数组与指针

6.2.3指向二维数组的指针

»指向行数组的指针变量:

定义一个指向曲1个元素组成的一维教翁的指针变量:

类型说明符(*指针变量名)[n];

例如:int(*p)[n]

/*p指向一个有n个元素的一维数组,是疗揩W变量7

设有如下定义:inta[3][4];int(*p)[4];p=a;则:

/p+i:指向一维数组a[i];

^*(p+i)+j:是二维数组元素的地址;

zV(P+i)+j):是二维数组元素的值;

6.2数组与指针

例6.12(2)通过指向一维数组的指,针变量访问二维数组的

元素。

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++)运行结果为:

{for0=O;j<4;j++)1357

printf(,,%4dl,,*(*p+j));9111315

P++;17192123

printfC^n11);}}

6.3字符串与指针

6.3.1字符串和字符串结束标志

»用一对双引号括起来的字符序列称为字符串常量

C语言在存储字符串时规定在最后一个字符后附加存

储一个空字符(即ASC"怒鱼为。的竽筋表并为‘⑦

We1C0me\0

AC语言中没有字符串类型变量,以使用字符数

组来存储字符串,或者把字符串的首地址保存到字符

指针变量中,通过字符数组或字符指针实现对字符串

的处理。

6.3字符串与指针

6.3.2字符数组

»一维字符数组的定义:

char字符数组名[整型常量表达式];

例如:

chara[10];

经上述定义后,字符数组a中虽然有10个数组元素,

但为了解决字符串的正确读取问题,它只能用于存放

不超过9个字符组成的字符串。

6.3字符串与指针

6.3.2字符数组

对字符数组未被

»一维字符数组元素的初始化:赋值的元素系统

自动将其赋

(1)字符数组逐个元素赋初值值为至C\o)z

例如.・charstr[6]={'H',七「‘,"','o',

J

He110\0

又如;charstr[7]={'H',七"','I','o',

5o

Ho\0\0

6.3字符串与指针

6.3.2字符数组

A一维字符数组元素的初始化:

(2)使用字符串常量初始化字符数组

例如.・charch[6]={“Hello"};

charch[6]="Hello,5;

charch[10]={“Hello"};/*ch[5卜ch[9]均存

放'\0'*l

charch[]={"Hello"};"ch的元素个数自动定为6*/

6.3字符串与指针

6.3.2字符数组

运行结果为:

A一维字符数组元素的引用:

Beijing2008

例一维字符数组的引用

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字符数组

A字符数组的输入输出(将字符串中字符逐个输入输出)

例6.14字符的逐个输入输出。

运行情况为:

#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字符数组

A字符数组的输入输出(将整个字符串一次输入输出)

例如:charstr[13];

scanf(u%s55,str);printf(u%s55,str);

⑴用“%s”格式符时,输出项逐数组名,而不是数组元

素名。输入项亦为教绍名,即前面不要再加“&”。

⑵当数组长度大于字符串实际长度,也只输出到第一个

NT结束。如:charcffO/={^well,,};printf(u%s5,,c);

⑶用“scanf”输入字符串时,将把包、跳格邦回车都

作为结束符。上例如果输入:howareyou!(回车)

则输出结果为:Howo

6.3字符串与指针

6.3.2字符数组

A二维字符数组

/定义二维字符数组的语法格式如下:

char数组名[整型常量表达式1][整型常量表达式2];

例如:chara[3][10];

(1)同数值二维数组类似,可以把一个二维字符数组分解

为多个一维字符数组来处理;

g对于二维数组,可通过对单个字符元素的引用获得各

字符;也可通过对一行的引用获得一个字符串。

6.2数组与指针

例6.15二维字符数组单个元素的引用。

#include<stdio,h>

voidmain()

{charweek[7][10]={"Sunday","Monday","Tuesday",

"Wednesday","Thursday","Friday","Saturday",};

intij;运行结果为:

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数组与指针

例6.16二维字符数组行的引用。

#include<stdio.h>

voidmain()

{charweek[7][10]={"Sunday","Monday","Tuesday",

"Wednesday","Thursday","Friday","Saturday");

inti;运行结果为:

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.

这是对字符指针变量的定义及初始化。

其含义是:

,系统先分配一块长度为字符串字符个数加上1的连续

的内存空间以存储字符串常量"Thisisastring.";

/然后将连续内存空间的首地址喊给字栋指钛stn

,str只占用2字节,并没有存储字符串的全部字符。

6.2数组与指针

例6.17字符串指针。

#include<stdio,h>

voidmain()

{char*string;

string=,lThisisastring.";

',,,

printf(%s\nJstring);

string+=8;

while(*string)

运行结果为:

{putchar(string[0]);

Thisisastring,

string++;

astring.

)

)

6.3字符串与指针

6.3.3指向字符串的指针变量

»指向字符数组的指针变量

例6J8指向字符数组的指针。

运行结果为:

#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字符数组与字符指针变量的对比

A字符数组与字符指针变量的区别有以下几方面:

⑴竽符数纷由若干元素组成,它存储了包括\0'

在内的字符串中的所有字符;而字将揩W存放的

是字符串的首地址,并不存放任何字符;

注意区别如下的初始化语句:

char*str1=<<lloveChina.";

charstr2[]=<<lloveChina.”;

6.3字符串与指针

6.3.4字符数组与字符指针变量的对比

A字符数组与字符指针变量的区别有以下几方面:

(2)注意区别如下的初始化语句:

char*str1;str1=ulloveChina.n;

等价与char*str1=ulloveChina.n;

而charstr2[14];str2=^lloveChina.'';

但charstr2[14]=ulloveChina」;

°°0

6.3字符串与指针

6.3.4字符数组与字符指针变量的对比

A字符数组与字符指针变量的区别有以下几方面:

(3)若定义的是字符数组,在编译时就为它分配内存单

元,其首地址是确定的;而定义字符趋分变量时,字

符指针变量本身的地址是确定的,但其存放的地址值

是随机的;

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字符数组与字符指针变量的对比

A字符数组与字符指针变量的区别有以下几方面:

(4)字多数翁名虽然代表地址,但它的值是不能改变的;

而\字符指针变量的值是可以改变的。

char*str1=^lloveChina」';

str1=str1+7;printf("%s'',str1);

charstr2[]={ulloveChina.''};

str2=str2+7;printf("%s'',str2);X

6.3字符串与指针

6.3.5字符串处理函数

Agets()函数

调用格式:gets(string);

功能说明:从键盘读入字符串,宜到读入换行符为止,

用10'欠耆夜方济并把读入的字符串存入以string为

首地址的存储区。

charstr1[10];gets(strl);

或char*st1,st2[10];st1=st2;

gets(stl);

6.3字符串与指针

6.3.5字符串处理函数

Aputs()函数

调用格式:puts(string);

功能说明、把首地址为string的字符串输出显示在屏幕

上,输出时用代替10L

chars1[20],s2[20]="Hel⑹nWorld!”;

gets(s1);当输入:Howareyou

puts(stl);puts(s2);输出:Howareyou

Hello

World!

6.3字符串与指针

6.3.5字符串处理函数

Astrcpy。函数

调用格式:strcpy(string1,string2);

功能说明:把string2的字符串复制到stringl中。

⑴stringl只可以是字符数组名或字符指针变量名;

而string2既可以是字符数组名或字符指针变量名;也

可以是字符串常量:且stringl所申请的存储空间要大

于string2所对应的字符串的长度;<若stringl是字符

指针,要保证stringl已赋值]。

6.3字符串与指针

6.3.5字符串处理函数

Astrcpy。函数

调用格式:strcpy(string1,string2);

功能说明:把string2的字符串复制到stringl中。

chara[6]="China",b[]="FZ”;

strcpy(a,b);

strcpy(b,u1O,5);输出:

puts(a);puts(b);FZ

10

6.3字符串与指针

6.3.5字符串处理函数

Astrcmp()函数

调用格式:strcmp(string1,string2);

功能说明:对stringl和string2所对应的字符串从左到

五一一进行比较(比较字符的ASCH码值的大小),第一

个不相等的字符的大小决定了整个字符串的大小,若

stringl和string2的所有字符完全相同,贝Ustringl等

于string2。

6.2数组与指针

例6.19字符串比较函数。

不能直接用关系

#include〈string.h>

运算符对字符串

voidmain()进行比较!

{inta,b,c;o一~

anstrcrrfpC'abc'Uabc");/*所有对应的字符均相同*/

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字符串处理函数

Astrcat()函数

调用格式.・strcat(string1,string2);

功能说明:将string2对应的字符串连接到stringl所对

应的字符串末尾。连接时将stringl原来的30,去掉,

只在新字符串后保留一个10'。(要求stringl必须已

赋值且有足够大的空间容纳连接后的字符串)。

6.3字符串与指针

6.3.5字符串处理函数

Astrcat()函数

调用格式:strcat(string1,string2);

假设.・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字符串处理函数

___----

Astrlen()函数包括\0'!

调用格式:strlen(string);——

O

功能说明:返回string字符串中字符的个数。

例620字符串长度函数。

运行结果为:

#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字符串处理函数

Astrlwr()函数

调用格式:strlwr(string);

功能说明:把string字符串中的大写字母转换成小写字

母,其他字符不变。

例如:

chara[15]=^BeiJing2008n;

运行结果为:

strlwr(a);

beijing2008

puts(a);}

6.3字符串与指针

6.3.5字符串处理函数

Astrupr()函数

调用格式:strupr(string);

功能说明、把string字符串中的小写字母转换成大写字

母,其他字符不变。

例如:

chara[15]=^BeiJing2008n;

运行结果为:

strlwr(a);

EIJING2008

puts(a);}

6.3字符串与指针

6.3.6字符串应用举例

例6.21利用字符指针把字符串s1复制到字符串s2。

#include<stdio.h>

voidmain()运行结果为:

{chars1[『"Hello,World!”,s2[15];Hello,World!

char*from=s1,*to=s2;Hello,World!

while(*from)

{*to=*from;to++;from++;}

/*循环体内语句可简化为*to++=*from++;7

puts(s1);puts(s2);

)

6.3字符串与指针

6.3.6字符串应用举例

from

s1|H|e|I|I|o||W|o|r|I|d|!|\0

to

s2Hello,World!\0

6.3字符串与指针

6.3.6字符串应用举例

例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字符串应用举例__________________

例6.22利用字符指针比较字符串s1、s2的大小。

while(*str1&&*str2)运行情况为:

®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字符串应用举例_______________

例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字符串应用举例

while(s2[j]!="\0i)〃s2串逐字符存入s1串末尾,直到s2串尾*/

{s1[i]=s2U];I*s2串的第j个字符存放在s1[i]*/

运行情况为:

Fujian

j++;)China

FujianChina

/*在连接后的字符串si末尾加上字符串结束符*/

puts(s1);

)

6.3字符串与指针

6.3.6字符串应用举例

例6.24将字符串s1中的所有大写字母转换成小写字母,

将字符串s2中的所有小写字母转换成大写字母。

#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字符串应用举例_______________________

例6.24将字符串s1中的所有大写字母转换成小写字母,

将字符串s2中的所有小写字母转换成大写字母。

while(*str2!=,\0,)

{if((*str2>=iai)&&(*str2<=izi))

*str2-=32;

str2++;

运行结果为:

)

puts(s1);beijing2008

puts(s2);B曰JING2008

}

6.3字符串与指针

6.3.6字符串应用举例_____________

例6.25删除一个字符串中所有的空格字符。

#include<stdio.h>pl

voidmain()

■1

{chars[80],*p1,*p2;s18FuJ1anChna\0

gets(s);p1=p2=s;p2

while(*p1)

运行结果为:

if(*p1==,')p1++;

else*p2++=*p1++;18FujianChina

*p2='\0';18FujianChina

',,,

printf(%s\nJs);

}

6.3字符串与指针

6.3.6字符串应用举例

例6.26将一由数字组成的字符串转换为其对应的整数。

#include<stdio.h>

voidmain()P

{chars[8],*p;

200758\0

longintn=0;

gets(s);p=s;

while(*p)

运行结果为:

{n=n*10+(*p-48);

200758

P++;)

',,,200758

printf(%lu\nJn);

)

6.3字符串与指针

6.3.6字符串应用举例

例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*找到串结束标记''0'7

p1-;/*指针p指向字符串中的最后一个字符7

6.3字符串与指针

6.3.6字符串应用举例________________________

例6.27将一个字符串反向。

while(p2<p1)

/*当串前面的指针s小于串后面的指针p时,进行循环7

{temp=*p2;/*交换两个指针所指向的字符7

*p2++=*p1;

〃指向串前面的指针p2向后(+1)移动一个位置7

*p1«=temp;}

/*指向串后面的指针p1向前(」)移动一个位置7

puts(str);

}

6.3字符串与指针

6.3.6字符串应用举例

例6.28将多个字符串按从小到大排序。

temp

s[6][8]={"FORTRAN"JPASCAL"JBASIC","COBOL","

temp[20];inti,j,k;

6.3字符串与指针

6.3.6字符串应用举例

for(i=0;i<5;i++)/*使用选择法从小到大排序*/

{k=i;

for(j=i+1;j<6;j++)

if(strcmp(s[k],s[j])>0)k=j;

"记录当前最小串的行号k*/

if(k!=i)

{strcpy(temp,s[k]);/*将最小的串与当前串交换7

strcpy(s[k],s[i]);

strcpy(s[i],temp);}

)

for(i=0;i<6;i++)/*排序后输出各字符串7卜

puts(s[i]);

6.4指针数组和指向指针的指针

6.4.1指针数组

由指向同一数据类型的指针变量构成的数组称为

指针数组,即指针数组中的每一个元素都是指针,且

指针所指的数据对象类型也是一致的。

A定义指针数组的语法格式:

类型名*数组名[常量表达式];

例如:int*pa[5];

表示定义一个由5个指针变量构成的数组,

每个数组元素都是指向一个整数的指针。

6.4指针数组和指向指针的指针

6.4.1指针数组

例6.29通过指针数组元素访问二维数组的元素。

#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指针数组和指向指针的指针

6.4.1指针数组

例629通过指针数组元素访问二维数组的元素。

运行结果为:

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指针数组和指向指针的指针

6.4.1指针数组

例6.30通过指针数组表示多个字符串。

#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指针数组

例6.31将多个字符串按从小到大排序。

*ps[6]={"F0RTRAN","PASCAL","BASIC"JCOBOL”,

JC++"},*temp;inti,j,k;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论