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

来源:互联网 发布:油性皮肤洗面奶知乎 编辑:程序博客网 时间:2024/06/11 01:47

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

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-34-5-67-8-9Program 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进制数为0X61ch[1]内容的16进制数为0X62ch[2]内容的16进制数为0X63ch[3]内容的16进制数为0Program 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;}/*程序输出:abcProgram 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-9Program 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个字符:5Program ended with exit code: 0*/

所以通过上面的代码示例,大家可以对行指针有一个初步的了解,从而对使用指针获取二维字符数组有一个初步的认识。

原创粉丝点击