C语言中二维字符数组的定义和初始化
本篇日志关于二维字符数组的定义和初始化。我相信这篇文章属于菜鸟级的,高手请直接无视。
一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它。比如说:
char testcase[][MAX_LENGTH] = {"jo","vicent","tom","honey","gigi","lily","susan","peter","bob","ron",
"jason","henry","kiki","ken","auscar","vivian","yiyi","peace","iron","lotus"
"andy","arta","ophone","denial","pipe","wade","james","kobe","kent","angel"};
通常使用二维字符数组是为了在程序中存储一些字符串关键字。用这样的方式来初始化就最简单不过了。其中,MAX_LENGTH是所有字符串中最大的长度。当然不能忘记'\0'了。
而定义一个字符二维数组,C也提供了简洁的方式,如果我不想统计字符串的长度,我还可以这样定义:
char *testcase[] = {"jo","vicent","tom","honey","gigi","lily","susan","peter","bob","ron",
"jason","henry","kiki","ken","auscar","vivian","yiyi","peace","iron","lotus"
"andy","arta","ophone","denial","pipe","wade","james","kobe","kent","angel"};
也就是说,可以不再数组定义的时候指定字符串的长度,但是注意字符串的个数是一定要指定的,像这样写 char **testcase = ... 是不行的,不过肯定不行了,因为int *pt=3 也不行,呵呵,这两个例子是一个道理啊。
我觉得肯定是人都喜欢第二种初始化方法了,而且它还有一个优点,起码对喜欢用指针的同志来说是一个大优点。就是可以将这样定义的指针赋给一个二维指针,比如
char **pointer = testcase;
想形式1的定义方法肯定不能这样赋值了。
不过非常非常值得注意的是,上面定义的两个指针,一个一维,一个二维,他们必须在const关键字上一致,意思就是说如果定义testcase前面加了const关键字,定义pointer时也必须加上,否则就会报错:
error C2440: 'initializing' : cannot convert from 'char *[30]' to 'const char **
在写这篇日志的过程中,我突然想到一个问题,就似乎利用上面的方法二初始化二维字符串数组之中,字符串是如何分布的呢?因为字符串的长度是不相等的,完全由编译器来计算,那么它是会按照最长的字符串来定制字符数组的长度,还是让每一个字符串数组都按照自身的大小来占据内存,靠'/0'来识别结尾呢?
为了搞清这个问题,我又做了一些实验。有发现了一些有趣的东西。不过还是另起一文吧。请见:
http://blog.csdn.net/huangzheguyun/article/details/6466329
转自:http://blog.csdn.net/huangzheguyun/article/details/6466322
C语言中二维字符数组的定义和初始化的更多相关文章
- C 语言字符数组的定义与初始化
1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'} ...
- c语言中的字符数组与字符串
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...
- [语法]C语言中二维数组做输入参数
C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...
- C语言中二维数组如何申请动态分配内存
C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...
- C语言字符串与字符数组
字符串儿与字符数组 字符数组的定义: Char buffer[]; 字符数组初始化: Char buffer1[]="hello world"; 利用scanf输入一个字符串儿 代 ...
- 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
[问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...
- 二维字符数组利用gets()函数输入
举例: ][]; ;i<;i++) gets(a[i]); a是二维字符数组的数组名,相当于一维数组的指针, 所以a[i]就相当于指向第i个数组的指针,类型就相当于char *,相当于字符串.
- 各种C#数组的定义和初始化
各种C#数组的定义和初始化2009-08-26 18:28 岁月联盟 字号:T | T一键收藏,随时查看,分享好友!本文介绍了C#数组定义和初始化,包括一维数组.交错数组和多维数组,供大家参考.AD: ...
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
1.数组基础 1.什么是数组: 同一类型数据的集合,就是一个容器. 2.数组的好处: 可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式: (一 ...
随机推荐
- [转]:Android 5.0的调度作业JobScheduler
参考:http://blog.csdn.net/cuiran/article/details/42805057 增加 JobScheduler 的同时,去掉了几个广播, CONNECTIVITY_AC ...
- Install OpenCV3.0 on Eclipse
Neste artigo veremos como usar o OpenCV com Eclipse. Usaremos as versões mais recentes:OpenCV 3.0 ...
- 【Unity】11.3 基本碰撞体(箱体、球形、胶囊、网格)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 碰撞组件(Collider) 是另一种必须随刚体 (Rigidbody) 添加的组件,以便允许它和其他组件发生碰撞.或者 ...
- 使用flow捕获js错误提高代码质量
本文将介绍Flow及其主特性.下面分别从如何安装设置,如何添加类型注释,如何在运行时自动去掉注释等方面来介绍. 安装 目前Flow兼容的操作系统有Mac OS X,Linux(64位),Windows ...
- HTML5学习笔记(十五):方法
在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们给xi ...
- 用casperjs模拟登录,支持多个账户登录
var casper = require('casper').create({ viewportSize:{ width:1920, height:1080 } }); var url1 = 'htt ...
- Speech and Language Processing, NLP 处理
https://www.amazon.com/Speech-Language-Processing-Daniel-Jurafsky/dp/0131873210 http://web.stanford. ...
- linux命令(44):sed,vim;去掉文件中的^M 符号,去掉行首空格和制表符
注:下面的直接粘贴会出错,要重新输入^M 如何输入^M,先 ctrl+v,然后 ctrl+m 第一种方法: cat -A filename 就可以看到windows下的断元字符 ^M要去除他,最简单用 ...
- DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端
最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...
- visual c++中预定义的宏
一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...