1、 定义
数组: 相同类型数据项的集合。
下标变量: 后面跟一个方括号内的下标的变量,指示一个数组元素。
数组下标: 在数组名后的方括号内的数值或表达式,用于指示访问哪个数组元素。
数组是由 ”类型名“ ”标识符“ ”维数“ 组成的复合型数据类型。
”维数“ 表示数组中包含的元素个数,必须大于等于 1 的常量表达式。此表达式只能包含 ”整型字面常量“ ”枚举常量“ ”用常量表达式初始化的整型const对象“。
2、 声明、初始化
语法: 元素类型aname[size]; 未初始化
元素类型aname[size] = { 初始化列表 }; 初始化
a、静态和自动初始化
存储于静态内存的数组只初始化一次,因此当程序执行时,静态数组已经初始化完毕。
对于自动变量的初始化过程就没有那么浪漫啦,因为自动变量位于运行时堆栈中,执行流每次进入它们所在的代码块时,这类变量每次所处的内存位置可能并不相同。在程序开始之前,编译器没有办法对这些位置进行初始化。如果定义的数组比较大,那么每次初始化的时间是非常可观的。 所以就需要综合考虑是不是要声明为 static 。
b、不完整的初始化
c、自动计算数组长度:根据初始值的长度确定
d、字符数组的初始化
比较笨拙的方法: charmessage[ ] = { ‘H', ’e‘, ’l‘,’l‘,’o‘ };
快速初始化字符数组: char message[ ] = ”Hello“;尽管它看上去是一个字符串常量,实际上不是。
区分字符数组与字符串常量
如: char message1[ ] = "Hello";
char *message2 = "Hello";
前者初始化一个字符数组的元素,而后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置。
数组的集中初始化方式如下:
int a[3] = { 1, 2,3 };
int a[3] = { 1, 2 };
int a[ ] = { 1, 2,3 };
int a[3] = { [1] = 1, [ 0 ] = 2 }; (知道此种初始化方法即可)
使用循环顺序存取:
int square[10], i;
for (i = 0; i < 10; i++)
{
scanf("%d", &square[i]);
}
初始化一个三维数组:
3、 下标引用
下标引用实际执行的就是间接访问。
一维数组:
int b[10];
*(b + 3)这个表达式的意思是:首先 b 的值是一个指向整型的指针,所以 3 这个值根据整型值的长度进行调整。加法运算的结果是另一个指向整型的指针,它所指向的是数组第 1 个元素向后移 3 个整数长度的位置。然后,间接访问这个新位置,或者取得那里的值(右值),或者把一个新值存储于该处(左值)。
除了优先级之外,下标引用和间接访问完全相同。
例如下面两个表达是相同的:
array[ subscript ]
*( array + ( subscript ))
下面涉及 ap 的表达式中,写出使用array 的对等表达式
int array[ 10 ];
int *ap = array + 2;
ap