关于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*/
所以通过上面的代码示例,大家可以对行指针有一个初步的了解,从而对使用指针获取二维字符数组有一个初步的认识。
阅读全文
0 0
- 关于C使用指针获取二维字符数组信息
- 关于数组指针,指针数组,双重数组,二维矩阵,字符串数组,双重字符指针的理解
- C语言:使用指针操作二维数组
- C语言 使用指针遍历二维数组
- C初始化字符串指针和二维字符数组
- 关于C语言的二维数组和指针
- c语言——关于二维数组和指针
- c语言中关于二维数组的指针访问
- 关于C语言中的字符数组和字符指针
- 关于C语言中的字符指针和字符数组
- 关于指针??二维数组讨论
- 关于二维数组与指针
- 关于二维数组和指针
- 黑马程序员-C-二维数组&指针数组&二维数组指针
- C语言中关于字符数组和指针数组
- 关于一维数组、二维数组、一级指针、二级指针、指针数组、数组指针、空指针、字符指针、const的个人理解
- [C]二维数组与指针
- C指针与二维数组
- 编码和字符集
- matlab改变工作路径
- 使用construct2制作一个简单的游戏
- gym101498
- python--leetcode669. Trim a Binary Search Tree
- 关于C使用指针获取二维字符数组信息
- 欧拉函数专项
- Spring工作原理
- AtCoder Grand Contest 001 EBBQ Hard
- win7 64位操作系统中Oracle 11g + plsql安装教程详解(图解)
- Codeforces 869B. The Eternal Immortality
- 数据结构之单链表的基本实现
- 还是超前校正
- Netty4实战第八章:Netty提供的ChannelHandler和编解码器