指针第七部分(字符指针数组)---- 2021.3.31

上一讲指针链接:

指针第六部分(指针数组、指针作为函数的形参)---- 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 *类型的字符指针变量,那么对应的p1p2p3所保存的就是字符串首元素的地址。比如,“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]又等价于是0x10000x1000为字符串首元素的地址,那么我们最终想要打印字符串事,就只需要打印*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));

代码运行结果如下所示:

在这里插入图片描述

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

猜你喜欢

转载自blog.csdn.net/qq_40544107/article/details/115348060