首页 百科知识 指针与字符串

指针与字符串

时间:2023-10-16 百科知识 版权反馈
【摘要】:message1指定了一个存储100个字符位置的空间,而对于message2就不同了,它只能存储一个地址,保存指定字符串的第一个字符的地址。已知一个字符串,定义一个能返回指针的函数,实现删除字符串中的“#”号的功能,同时把后面连接的字符串前移。下面再给出数组指针的含义。简单来说,数组指针是指向数组的指针。

6.4 指针与字符串

6.4.1 使用指针创建字符串

定义字符串的同时就隐含着自动建立了字符串指针,例如为100个字符定义存储空间,语句是char message1[100]="how are you?",定义的同时其实就自动的创建了一个指针常量message1,其存储的是message1[0]的地址。跟一般的常量一样,指针常量指向是明确的,不能被修改。下面的语句是错误的:

message1="fine,and you?";

也可以不按照定义一般数组的方式定义字符串,使用指针定义字符串,代码如下所示:

char*message2="how are you?";

message2本身就是一个指针变量,它明确的定义了一个指针变量,message2初始化后,再执行下面的代码是正确的:

message2="fine,and you?";

从分配空间的角度来分析,二者也是不同的。message1指定了一个存储100个字符位置的空间,而对于message2就不同了,它只能存储一个地址,保存指定字符串的第一个字符的地址。

6.4.2 使用指针访问字符串

【例6.10】已知一个字符串,定义一个能返回指针的函数,实现删除字符串中的“#”号的功能,同时把后面连接的字符串前移。

例如:原字符串"abc#def##ghi#jklmn#",转换后的字符串"abcdefghijklmn"。

代码如下:

img252

img253

运行结果如图6-15所示。

img254

图6-15

分析:

这个题目中需要考虑的有以下几点:(1)保留当前地址,如代码中char*p=arr和t=p都是这样的含义,用于保存当前位置的地址;(2)提供了连续出现ˊ#ˊ的解决办法,在删除了当前ˊ#ˊ号后前移指针,如代码p--,再次检测改变后的当前位置上的字符内容。

6.4.3 指针数组和数组指针

指针数组表示的是数组元素由指针类型的元素组成,比如:int*p[4],这里数组p是由4个指向整型元素的指针组成的,分别是p[0]、p[1]、p[2]和p[3],其中每一个指针均和一般的指针变量用法完全一样。

例如:

img255

输出结果:

Winter

Spring

Summer

Autumn

如图6-16所示。

img256

图6-16 指针数组

下面再给出数组指针的含义。什么是数组指针呢?简单来说,数组指针是指向数组的指针。通过下面的代码理解数组指针的含义:

img257

数组指针p指向array数组的第0行行首地址,因为p指向包含4个元素的数组与array数组对应列数相同,所以指针p+n就指向array数组的第n行行首地址。p=array等价于p=&array[0],如果改写成p=array+1,表示p指向数组第1行的首地址,等价于p=&array[1]。

img258

注意括号的作用,p+1表示指针p后移一个存储单元,该存储单元由4*sizeof(int)个字节大小组成。该语句可以改写成p[1][0]=1。

【例6.11】使用数组指针。

代码如下:

img259

运行结果如图6-17所示。

img260

图6-17

分析:

指针p用来指向含有3个元素的整型数组,这与数组array每行的元素个数相同,所以初始化时p=array表示p是数组array第0行的行首地址。p[i][j]等价于array[i][j],p[i][j]还可以改写成(*(p+i))[j]或者*(*(p+i)+j)等形式。

6.4.4 指针的指针

什么是指针的指针呢?比如,指针变量p1存储的是变量a的地址,指针的指针p2存储的是指针p1的地址。指针的指针定义如下:

指向数据类型**指针变量名;

【例6.12】使用指针的指针访问字符串数组。

代码如下:

img261

img262

运行结果如图6-18所示。

img263

图6-18

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈