C语言数组的定义和初始化
一维数组
数组变量也是变量。数组定义的形式与简单变量类似,但需要增加有关元素个数的信息。在被定义变量名之后写一对方括号就是一个数组定义,指定元素个数的方式是在括号里写一个整型表达式。
int a[10];
extern double a1[];
数组元素个数必须能在编译时静态确定,根据这个规定,下面数组定义不合法:
void f(int n) {
int b[n];
}
全局数组和局部静态数组(用关键字 static)同样在程序开始执行前建立并初始化;
局部自动数组也是在程序执行进入相应函数时建立和初始化。
给数组指定初值也是在定义变量时通过附加描述给出元素初值:各元素值的表达式顺序在一对花括号里,表达式间用逗号分隔。例如:
int b[4] = {1, 1, 2, 3};
int b1[4] = {1, 2};
int b2[4] = {1, 2, 0, 0};
int fib1[] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};
int fib2[10] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};
应特别指出,这种为数组元素指定值的写法只能用在初始化时,语句里不能采用这种写法。
多维数组
C 语言里也能定义两维的和更多维的数组。
double a[3][2];
int a1[3][2][4];
多维数组也可以在定义时直接初始化。
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int b[3][2] = {1, 2, 3, 4, 5, 6};
int c[][2] = {{1, 2}, {3, 4}, {5, 6}};
int d[][2] = {1, 2, 3, 4, 5, 6};
一维数组采用连续顺序存储元素的方式实现。多维数组的内部表示也完全一样,同样是依次连续存放数组元素,即其中的各成员数组),而这些成员数组也按同样方式存放它们的元素。
一行(一个成员数组)的元素连续存放,这种形式又被称为按行存放,或者行优先存放。
字符数组
字符数组就是以字符作为元素的数组。由于人们常用 C 语言写与处理字符序列或文本的程序,而字符序列理所当然地应该存放在字符数组中,所以C为处理字符数组提供了特别支持。
对于程序中写出的字符串字面量,系统将用字符数组的形式对其进行存储他们:分配连续的若干个存储单元,顺序存入字符串中的各个字符,每个字符占据一个字节。在存储了字符串常量的所有字符之后,还要另外存一个空字符 '\0’作为字符串的结束标志。
例如下面的字符串虽然只有7个字符,其内部却要占据8个字节的存储。
用这种方式表示字符串是为了处理方便。字符串数据与基本类型的数据不同,不同的字符串可能有不同长度。这种情况下,程序怎么才能从字符串的内部表示确定字符串结束的位置呢?
有了字符串末尾的空字符,处理字符串的程序就可以顺序检查,遇到空字符就知道遇到了字符串结束。虽然空字符不是字符串内容的一部分, 但却是字符串表示中不可缺少的部分。
标准库的字符串处理函数都是基于这种表示定义的, 我们自己写字符串处理程序时也应该遵守这种规则。
下面的问题是:能在自己定义的字符数组里存放字符串吗?回答是肯定的,根据字符串存储形式的规定,只要在数组里顺序存入所需字符,随后存一个空字符,这个字符数组里的数据就有了字符串的表现形式,这个数组也就可以当作字符串使用了。在这种情况下,人们也说这个数组里存了一个字符串。例如有下面定义:
char a[5] = {'i', 's', 'n', 'o', 't'},
。
b[5] = {'g', 'o', 'o', 'd'},
c[5] = {'f', 'i', 'n', 'e', '\0'},
d[5] = {'o', 'k', '\0'};
e[5] = {'o', 'k', '\0', '?', '?'};
为了方便使用,C 语言为字符数组提供了特殊的初始化形式:允许以字符串形式为字符数组的一系列元素指定初值。这种初始化形式应看成一般形式的简写,例如可以写:
char a1[20] = "Peking University";
char a3[] = "Peking University";
如a [3],用字符串做字符数组初始化时也允许不直接给出数组元素个数。这时的数组大小规定为初始化字符串的字符数加 1,因为需要在数组最后存一个空字符。
字符数组可以用在各种需要字符串的地方。例如,如果程序里许多输出语句都用同样输出格式,一种可能方法就是定义一个公用的格式描述数组。例如下面例子:
char outform1[] = "Two reals: %f, %f\n"; printf(outform1, x, y);
这样可以减少重复定义。对输入格式也可以采用同样技术。
参考书籍
《从问题到程序——程序设计与C语言引论》裘宗燕著,北京大学出版社,1999.4
《从问题到程序——程序设计与C语言引论》2003,2004年修订
|