上一讲指针链接:
指针第六部分(指针数组、指针作为函数的形参)---- 2021.3.6
字符指针数组
首先,字符指针数组是一个数组,只不过数组中的每一个元素是字符指针。其字符指针的数据类型是char *
类型。
比如我们定义三个字符类型的变量。如下所示:
char *p1 = "heihei";
char *p2 = "haha"
char *p3 = "xixi"
同时我们定义一个字符指针数组,因为其数组中保存的元素数据类型为char *
类型的,所以我们定义的字符指针数组类型为char *
类型的。如下所示。
char *num[3] = {
"heihei","haha","xixi"};
其实还可以写成另一种形式,如下所示。
char *num[3] = {
p1,p2,p3};
那我们此时想要将num
数组中的三个元素的内容,也就是字符串打印出来,那么我们需要知道num
数组中保存的是什么内容,即num[0]
,num[1]
,num[2]
所保存的是什么内容。首先我们刚开始定义了三个数据类型为char *
类型的字符指针变量,那么对应的p1
,p2
,p3
所保存的就是字符串首元素的地址。比如,“heihei”
中的首元素为“h”
,其地址编号为0x1000
。那么num[0]
就保存的是0x1000
。其他元素同理。为了让大家更好的理解上述分析,特意为大家作了一张图供大家观看。
上述已经得知,其字符指针数组中的元素保存的是其字符串的首元素的地址。所以我们想要打印其字符串的内容,可以如下所示。
for (int i = 0; i < 3; i++)
{
printf("%s\n", num[i]);
}
最终运行结果如下:
那么我们此时想要打印字符串"haha"
中的第二个字符元素"a"
呢,我们应该怎么做
大家可以跟我一起来分析,首先我们需要获得"haha"
字符串的首元素的地址 ,那么如前面所述,num[1]
代表的就是其首元素的地址,那么"a"
为其首元素的地址的基础上加1
,最终我们在对其整体进行取内容(*)
操作,就可以得到"a"
。具体代码如下所示:
printf("%c\n", *(num[1] + 1))
代码运行结果如下:
那么我们此时想要定义一个指针来保存num
数组的首元素的地址,那我们应该怎么做呢?
我们可以结合之前的指针讲解文章中的多级指针部分,首先num
数组的首元素的数据类型为char *
类型,那么定义一个指针来保存其地址,则为二级指针,如下所示。
char **p = &num[0];
那我们怎样来通过二级指针变量p
来成功打印其字符串呢?
首先二级指针变量p
保存的是num
数组的首元素的地址,即&num[0]
,那么*p
代表的是取其对应空间的内容,即*p
等价于num[0]
,num[0]
又等价于是0x1000
,0x1000
为字符串首元素的地址,那么我们最终想要打印字符串事,就只需要打印*p
即可。代码如下所示:
char** p = num;
for (int i = 0; i < 3; i++)
{
printf("%s\n",*(p+i));
}
代码运行结果如下:
同时为了让大家更好的理解上述分析,特意为大家作了一张图供大家观看。
那么我们此时想要打印字符串"haha"
中的第三个字符元素"h"
呢,我们应该怎么做
大家可以跟我一起来分析,首先我们需要获得"haha"
字符串的首元素的地址 ,那么如前面所述,二级指针变量p
保存的是num
数组的首元素的地址,即&num[0]
。那么“haha”
是在其原有的地址编号基础上再加1
,同理"xixi"
是在其原有的地址编号基础上再加2
。那么此时对其进行取内容(*)
操作,就得到了其“haha”
的首元素“h”
的地址,即0x2000
。那么我们想要打印字符串"haha"
中的第三个字符元素"h"
,则是在其地址编号基础上再加2
即可,然后此时我们其实已经指向了“h”
,最后只需要进行取内容( * )
即可。代码如下所示:
printf("%c\n", *(*(p + 1) + 2));
代码运行结果如下所示:
结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!