一维数组:
(1)数组名
声明:int a ;
int b[10]
A b[10] 为数组,它是一些值的集合。下标和数组名一起使用,用于标识该集合中的某个特定的值。对于b来说,只有在两种情况下,数组名仅代表整个数组,A 数组名作为sizeof操作符的操作数;B 数组名作为 & 的操作数:除此之外,数组名代表数组首元素的地址。
(2)下标引用
int arr[10];
int *ap=arr+2;
即 指针ap指向arr[2],数组名的值是一个指针常量。
注意: A *ap即 arr[2],也可写作 * (arrr+2);
B ap[0] C的下表引用和间接访问表达式是一样的,等同于 *(ap+0);
C *ap +6 先执行间接访问,再执行加号,即arr[2]+6;
. D ap[-1] ap指向第3个元素,使用偏移量为-1使前移一个元素,即arr[1].
E ap[9] 它对等的表达式是arr[11],但数组只有10个元素,所以指向的位置超过数组的右边界,所以该
语句非法,但很少有编译器检测到错误,而它将访问(如果为左值,将修改)某个任意变量的值。
F C实现下标的方法为 如:2[arr]等效于*(2=arr),也就等效于arr[2]。
(3)指针与下标
A 假定指针与下标都正确,下标绝对不会毕指针更有效率,但指针有时会比下标更有效率(当在数组中1次1步(或者某个固定的数字)地移动时,与固定数字相乘的运算在编译时完成,运行时所需的指令就少一些)。
B 声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。
(4)作为函数参数的数组名
A 当一个数组名作为参数传递给一个函数时,传递给函数的是一份该指针的拷贝,函数如果执行了下标引用,即对这个指针执行间接访问操作,并且通过这种间接访问,函数可以访问和修改调用程序的数组。
B C关于参数传递:所有传递给函数的参数都是通过传值方式进行的。传递给函数的是参数的一份临时拷贝(指向数组起始位置的指针的拷贝),所以函数可以自由的操作它的指针形参。
(5) 声明数组参数
A 把一个数组名参数传递给函数,函数形参声明为指针更加准确。但编译器也接受数组。
(6) 初始化
A 存储于静态内存的数组只初始化一次。在程序开始执行之前,链接器对数组元素进行初始化,如果数组为被初始化,数组元素的初始值会自动设置为0。
B 自动变量在缺省情况下是未初始化的,如果声明中给了初始值,每次执行进入其作用域时,变量都将被隐式的赋值语句初始化,而这将花费时间和空间
二维数组
(1) 存储顺序
A 在C中多维数组的元素存储顺序按照最右边的下标率先变化的原则,称为行主序,即按行存储。
(2) 数组名
A 多维数组的数组名指向数组的第1维的元素,即该数组的子数组。 如:int matrix[3] [10]中matrix的值是指向一个包含10个整形元素的数组的指针。
(3)作为函数参数的多维数组
A 矩阵:int matrix[3][10]
...
func2(matrix);
则函数原型应为: void func2(int (*mat)[10]);
void func2(int mat [ ][10]); 中的一种。对于多维数组来说,函数原型写为指针的形式的只有第一维的数组元素。
(4)初始化
A 初始化多维数组时,数组元素的存储顺序非常重要。
颇有不足!以后会更加完善!