小结

概念与术语

■ 数组是一种数据类型,而且是一种构造性的数据类型。

■ 数组一般用来描述问题中的一组性质相同且有序的数据。在代码中,数组体现为一组数据类型相同的数据对象。

■ 数组中的每个数据对象都被叫做数组元素。

■ 定义一维数组的一般形式为:

数组元素的类型 数组名元素的个数

其中元素的个数必须是整数类型表达式,除非编译器支持C99,否则必须是常量表达式。

数组元素的类型可以是学过的任何数据类型。数组名必须符合标识符法则。

■ 数组中各个元素在内存中连续存放。

■ 数组的名字作为左值时表示数组所占据的那块内存。

■ 数组的名字可以是左值,但不可以作为“=”运算左面的那个运算对象。C语言没有定义对数组进行整体赋值这种运算。

■ 引用一维数组元素的方法是:

数组名数组元素的编号

■ 数组元素的编号也叫下标。

■ 对数组元素的引用是一个表达式,这个表达式的类型是数组元素的数据类型。其中的[]是一个运算符。

■ 引用数组元素时数组名是右值,这个右值并不表示数组占据的那块内存的整体的值,它的值是数组首个元素占据的内存单元块中那个开始字节的地址。更准确的说法是,这个值是一个指针类型的值。

■ 数组名是一个“常量”,它的值是编译器分配的而不是通过代码方式获得的。

■ 数组元素的编号总是从0开始。

■ 对数组元素的越界访问是一种未定义行为。

■ 数组定义中的[]与数组元素引用中的[]的含义不同,前者是类型说明符,后者是运算符。

■ 可以出现在“=”左面的表达式必须是左值表达式,这种表达式必须表示一块内存,但不是所有的左值表达式都可以出现在“=”的左面。

■ 可以在定义数组时给数组各元素赋初值或给部分数组元素赋初值。给数组赋值通常需要一组数据,数据之间要用“,”隔开,而且这组数据需要用“{}”括起来。

■ 与一维数组名对应的形参的类型应为:

数组元素的类型[]

这是一种不完全类型,只可以用来在描述一种类型或说明形参的类型等极其有限的若干种情况下使用。

■ 数组名做实参时还应该有另外一个实参,即数组元素的个数,否则被调用函数不可能了解数组的大小。

■ const是C语言的一个关键字,含义是所修饰变量不可以被显式地改变,编译器可以根据const限定符进行优化。

■ 形参用const修饰通常有两个好处:防止意外地修改不应该被改变的变量;编译器可以在可能的条件下进行优化。

■“freopen("D:\输入数据.txt","r",stdin);”可以实现把键盘输入重定向到D:\输入数据.txt文件。

■ 二维数组可以看成是若干同样类型的一维数组所构成的数组。

■ 二维数组名做实参时,对应的形参的类型是:

数组元素的类型[][第二维的尺度

风格与习惯

设计以数组名做实参的函数时一定要考虑到还必须传递数组元素的个数。

用表达式“sizeof数组名/sizeof数组名[0]”代替直接写代表数组大小的常数,可以避免把数组尺寸写错。这种写法并不影响程序执行速度,因为多数sizeof运算都是在编译期间完成的(除非是变长数组)。如果觉得“sizeof数组名/sizeof数组名[0]”这个表达式过于烦琐,可以用一个带参数的宏表示。

如果为高维数组的部分元素指定初值,可以使用:

小结 - 图1

风格。数组元素的个数一般是一个整数类型常量表达式,用符号常量为好。

常见错误

对于“int a[5];”,把a[5]当成数组整体赋值或作为参数传递。

在引用数组元素时发生越界行为。

常见错误:int i; double a[i]; /使用变量说明数组有几个元素。/(C99中可以。)

牛角尖

仅仅作为sizeof或&运算符的运算对象时,数组的名字代表数组所占据的那块内存,这时的数组名是左值。在其他场合,数组名总是表示“&数组名[0]”的含义,这时的数组名是右值。

对数组元素的引用是一个表达式,这个表达式具有和同样类型的变量相同的性质。如果与其相同类型的变量可以做左值,那么对数组元素的引用这个表达式也可以作为左值。