牛骨文教育服务平台(让学习变的简单)
博文笔记

C语言中二维字符数组的定义和初始化

创建时间:2009-05-31 投稿人: 浏览次数:59345

继续将一些学习记录写下来,与大家分享。本篇日志关于二维字符数组的定义和初始化。我相信这篇文章属于菜鸟级的,高手请直接无视。

一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它。比如说:

Code:
  1. char testcase[30][MAX_LENGTH] = {"jo","vicent","tom","honey","gigi","lily","susan","peter","bob","ron",  
  2.                             "jason","henry","kiki","ken","auscar","vivian","yiyi","peace","iron","lotus"  
  3.                             "andy","arta","ophone","denial","pipe","wade","james","kobe","kent","angel"};  

通常使用二维字符数组是为了在程序中存储一些字符串关键字。用这样的方式来初始化就最简单不过了。其中,MAX_LENGTH是所有字符串中最大的长度。当然不能忘记"/0"了。

而定义一个字符二维数组,C也提供了简洁的方式,如果我不想统计字符串的长度,我还可以这样定义:

Code:
  1. char *testcase[30] = {"jo","vicent","tom","honey","gigi","lily","susan","peter","bob","ron",  
  2.                             "jason","henry","kiki","ken","auscar","vivian","yiyi","peace","iron","lotus"  
  3.                             "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://student.csdn.net/space.php?uid=37718&do=blog&id=3607

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。