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
类型值,那么 pd
加 1
意味着其值加 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
章中详细介绍。