关于C使用指针获取二维字符数组信息
2017-10-07 21:38
337 查看
最近在完成一个项目,项目中频繁的使用到字符二维数组,今天就个人在实际中的经验来总结一个比较好的使用方法,欢迎各位大神踊跃拍砖。
测试的二维数组:
下面我们通过两种方法来获取这个二维数组的信息
大家可以看到在使用的时候极为的不方便,每一行还得数一下才能确定j的范围。下面我们介绍一下采用指针的方式输出。
空字符就是\0
所以我们可以利用这个\0来输出一维字符数组的内容:
那么,在获取二维字符串数组的时候,请大家牢记这个
这个就是我们刚才讲到的“行指针”,这种定义方法相信很多初学者应该是没有见过的,或者是觉得特别的奇怪,奇怪就奇怪吧,反正大家只要牢记这个就可以了。废话不多说线上代码:
我们可以看到,这个p保存的,是一行数据的地址,要打印也只能打印一行,如果是以%c输出直接就会报错了。所以我们这里要有一个印象:*p = 一行的信息。
那么我们怎样取到这一行中的每一个元素信息呢?那就要利用前面讲到的一维字符数组使用,我们需要定义:
所以我们有以下代码:
所以通过上面的代码示例,大家可以对行指针有一个初步的了解,从而对使用指针获取二维字符数组有一个初步的认识。
测试的二维数组:
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
*/
所以通过上面的代码示例,大家可以对行指针有一个初步的了解,从而对使用指针获取二维字符数组有一个初步的认识。
相关文章推荐
- 关于数组指针,指针数组,双重数组,二维矩阵,字符串数组,双重字符指针的理解
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- 关于sizeof和字符指针和数组。
- 关于字符指针和字符数组的一些错误
- 动态创建字符数组,且输出字符数组奇数位--使用指针
- C语言中关于字符数组与字符指针的本质区别
- 使用qsort对二维字符数组排序疑难问题调试及解决过程
- 关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
- C/C++的一些关于字符数组和指针的小总结
- 获取二维字符数组元素个数的方法
- 关于字符指针和字符数组初始化的问题
- 关于字符指针和字符数组的小问题
- 关于定义一个二维int数组,编写代码获取最小元素
- 关于LinuxC/C++中字符指针char * str 与字符数组 char str []的一点小区别
- 二维字符数组与二维整型数组在内存中的分配及指针的问题
- 二维(及高维)数组指针意义和使用
- 字符指针和字符数组的使用区别
- 关于函数字符数组调用的问题(没有搞清指针的概念)
- 关于字符数组的指针移动操作
- 关于C语言中函数值传递的巩固,指向指针的指针 【网络编程获取借口列表时,使用了指针的指针的思考】