当前位置:嗨网首页>书籍在线阅读

26-本章小结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.11 本章小结

数组是一组数据类型相同的元素。数组元素按顺序存储在内存中,通过整数下标(或索引)可以访问各元素。在 C 中,数组首元素的下标是 0 ,所以对于内含 n 个元素的数组,其最后一个元素的下标是 n-1 。作为程序员,要确保使用有效的数组下标,因为编译器和运行的程序都不会检查下标的有效性。

声明一个简单的一维数组形式如下:

type name [ size ];

这里, type 是数组中每个元素的数据类型, name 是数组名, size 是数组元素的个数。对于传统的C数组,要求 size 是整型常量表达式。但是 C99/C11 允许使用整型非常量表达式。这种情况下的数组被称为变长数组。

C 把数组名解释为该数组首元素的地址。换言之,数组名与指向该数组首元素的指针等价。概括地说,数组和指针的关系十分密切。如果 ar 是一个数组,那么表达式 ar[i] 和* (ar+i) 等价。

对于 C 语言而言,不能把整个数组作为参数传递给函数,但是可以传递数组的地址。然后函数可以使用传入的地址操控原始数组。如果函数没有修改原始数组的意图,应在声明函数的形式参数时使用关键字 const 。在被调函数中可以使用数组表示法或指针表示法,无论用哪种表示法,实际上使用的都是指针变量。

指针加上一个整数或递增指针,指针的值以所指向对象的大小为单位改变。也就是说,如果 pd 指向一个数组的8字节 double 类型值,那么 pd1 意味着其值加 8 ,以便它指向该数组的下一个元素。

二维数组即是数组的数组。例如,下面声明了一个二维数组:

double sales[5][12];

该数组名为 sales ,有5个元素(一维数组),每个元素都是一个内含12个 double 类型值的数组。第1个一维数组是 sales[0] ,第2个一维数组是 sales[1] ,以此类推,每个元素都是内含12个 double 类型值的数组。使用第2个下标可以访问这些一维数组中的特定元素。例如, sales[2][5]slaes[2] 的第6个元素,而 sales[2]sales 的第3个元素。

C 语言传递多维数组的传统方法是把数组名(即数组的地址)传递给类型匹配的指针形参。声明这样的指针形参要指定所有的数组维度,除了第 1 个维度。传递的第 1 个维度通常作为第 2 个参数。例如,为了处理前面声明的 sales 数组,函数原型和函数调用如下:

void display(double ar[][12], int rows);
...
display(sales, 5);

变长数组提供第2种语法,把数组维度作为参数传递。在这种情况下,对应函数原型和函数调用如下:

void display(int rows, int cols, double ar[rows][cols]);
...
display(5, 12, sales);

虽然上述讨论中使用的是 int 类型的数组和 double 类型的数组,其他类型的数组也是如此。然而,字符串有一些特殊的规则,这是由于其末尾的空字符所致。有了这个空字符,不用传递数组的大小,函数通过检测字符串的末尾也知道在何处停止。我们将在第 11 章中详细介绍。