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"。
代码如下:
运行结果如图6-15所示。
图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],其中每一个指针均和一般的指针变量用法完全一样。
例如:
输出结果:
Winter
Spring
Summer
Autumn
如图6-16所示。
图6-16 指针数组
下面再给出数组指针的含义。什么是数组指针呢?简单来说,数组指针是指向数组的指针。通过下面的代码理解数组指针的含义:
数组指针p指向array数组的第0行行首地址,因为p指向包含4个元素的数组与array数组对应列数相同,所以指针p+n就指向array数组的第n行行首地址。p=array等价于p=&array[0],如果改写成p=array+1,表示p指向数组第1行的首地址,等价于p=&array[1]。
注意括号的作用,p+1表示指针p后移一个存储单元,该存储单元由4*sizeof(int)个字节大小组成。该语句可以改写成p[1][0]=1。
【例6.11】使用数组指针。
代码如下:
运行结果如图6-17所示。
图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】使用指针的指针访问字符串数组。
代码如下:
运行结果如图6-18所示。
图6-18
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。