您的位置:首页 > 其它

关于C使用指针获取二维字符数组信息

2017-10-07 21:38 337 查看
最近在完成一个项目,项目中频繁的使用到字符二维数组,今天就个人在实际中的经验来总结一个比较好的使用方法,欢迎各位大神踊跃拍砖。

测试的二维数组:

char ch[][50] = {
"1-2-3",
"4-5-6",
"7-8-9"
};


下面我们通过两种方法来获取这个二维数组的信息

使用下标输出

#include "stdio.h"
int main(int argc, const char * argv[]) {
char ch[][50] = { "1-2-3", "4-5-6", "7-8-9" };
for (int i = 0; i < 3; ++i){
for (int j = 0; j < 6; ++j){
printf("%c", ch[i][j]);
}
printf("\n");
}
return 0;
}

/*程序输出:
1-2-3
4-5-6
7-8-9
Program ended with exit code: 0
*/


大家可以看到在使用的时候极为的不方便,每一行还得数一下才能确定j的范围。下面我们介绍一下采用指针的方式输出。

使用指针输出

一维字符数组

我们先从最简单的一维字符数组谈起。我们都知道,在存储一个字符串的时候,字符串后面会跟着一个’\0’,证明代码如下:

#include "stdio.h"
int main(int argc, const char * argv[]) {
char ch[] = {"abc"};

printf("数组ch的长度是%lu\n",sizeof(ch)/sizeof(ch[0]));
printf("----------------\n");

for (int i = 0; i < sizeof(ch)/sizeof(ch[0]); i ++) {
printf("ch[%d]内容的16进制数为%#X\n",i,ch[i]);
}
return 0;
}

/*程序输出:
数组ch的长度是4
----------------
ch[0]内容的16进制数为0X61
ch[1]内容的16进制数为0X62
ch[2]内容的16进制数为0X63
ch[3]内容的16进制数为0
Program ended with exit code: 0
*/


空字符就是\0



所以我们可以利用这个\0来输出一维字符数组的内容:

#include "stdio.h"
int main(int argc, const char * argv[]) {
char ch[] = {"abc"};

char *p = ch;//p获得数组首地址
for (; *p != '\0'; p ++) {
printf("%c",*p);
}
printf("\n");
return 0;
}

/*程序输出:
abc
Program ended with exit code: 0
*/


二维字符数组

这个二维字符数组其实也特别的简单,只是比一维数组多了一个“行”。我看了网上很多教程,也谈到了行指针和列指针,估计初学者应该是一脸懵逼的。

那么,在获取二维字符串数组的时候,请大家牢记这个

char (*p)[50] = ch;


这个就是我们刚才讲到的“行指针”,这种定义方法相信很多初学者应该是没有见过的,或者是觉得特别的奇怪,奇怪就奇怪吧,反正大家只要牢记这个就可以了。废话不多说线上代码:

#include "stdio.h"
int main(int argc, const char * argv[]) {
char ch[][50] = { "1-2-3", "4-5-6", "7-8-9" };

char (*p)[50] = ch;//请注意格式
//取一行
printf("*(p2 + 0)取到第1行:%s\n",*(p + 0));
printf("*(p2 + 1)取到第2行:%s\n",*(p + 1));
printf("*(p2 + 2)取到第3行:%s\n",*(p + 2));
return 0;
}

/*程序输出:
*(p2 + 0)取到第1行:1-2-3
*(p2 + 0)取到第2行:4-5-6
*(p2 + 0)取到第3行:7-8-9
Program ended with exit code: 0
*/


我们可以看到,这个p保存的,是一行数据的地址,要打印也只能打印一行,如果是以%c输出直接就会报错了。所以我们这里要有一个印象:*p = 一行的信息。

那么我们怎样取到这一行中的每一个元素信息呢?那就要利用前面讲到的一维字符数组使用,我们需要定义:

char *q = (char *)p;//需要强转成char *


所以我们有以下代码:

#include "stdio.h"
int main(int argc, const char * argv[]) {
char ch[][50] = { "1-2-3", "4-5-6", "7-8-9" };

char (*p)[50] = ch;//请注意格式
//取一行
printf("*(p2 + 0)取到第1行:%s\n",*(p + 0));
printf("*(p2 + 1)取到第2行:%s\n",*(p + 1));
printf("*(p2 + 2)取到第3行:%s\n",*(p + 2));

//访问第一行元素
char *q = (char *)p;
printf("*(q + 0)取到第1个字符:%c\n",*(q + 0));
printf("*(q + 1)取到第2个字符:%c\n",*(q + 1));
printf("*(q + 2)取到第3个字符:%c\n",*(q + 2));
//访问第二行元素
printf("-----------\n");
p ++; //下一行
q = (char *)p;
printf("*(q + 0)取到第1个字符:%c\n",*(q + 0));
printf("*(q + 1)取到第2个字符:%c\n",*(q + 1));
printf("*(q + 2)取到第3个字符:%c\n",*(q + 2));

return 0;
}

/*程序输出:
*(p2 + 0)取到第1行:1-2-3
*(p2 + 1)取到第2行:4-5-6
*(p2 + 2)取到第3行:7-8-9
*(q + 0)取到第1个字符:1
*(q + 1)取到第2个字符:-
*(q + 2)取到第3个字符:2
-----------
*(q + 0)取到第1个字符:4
*(q + 1)取到第2个字符:-
*(q + 2)取到第3个字符:5
Program ended with exit code: 0
*/


所以通过上面的代码示例,大家可以对行指针有一个初步的了解,从而对使用指针获取二维字符数组有一个初步的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: