一维数组
1.数组名
Int arr[10]
变量arr称为数组,它是一些值的集合。下标和数组一起使用,用于标识改集合中某个特定的值。例如:arr[0]表示数组arr的第一个值,arr[5]表示数组arr的第四个值。每个特定的值都是一个标量,可以用于任何可以使用标量数据的上下文环境中。
arr[5]表示一个整型。在c中,几乎所有的使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第1个元素的地址。示例数组名类型是“指向int的常量指针”。
数组具有完全不同于指针的特性:数组具有确定的元素,而指针只是一个标量值。编译器用数组名来记住这些属性,只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量(不是指针变量)。指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行操作就是把整个数组移动到内存的其他位置。但是,在程序完成连接后,内存中数组的位置是固定的。因此,数组名的值是一个指针常量。
只有在两种情况下,数组名并不用指针常量来表示:
①当数组名作为sizeof操作符,sizeof返回整个数组的长度。
②当数组名作为单目操作符&,取一个数组名的地址所产生的是一个指向数组的指针,而不是指向某个指针常量值的指针。
2.下标引用
arr[0]表示引用数组中的第一个元素
arr[3]和*(arr+3)这两个表达式是等同的,都是访问数组第四个元素,或者取得那里的值(右值),或者把一个新值存储于该处(左值)。在c中,除了优先级之外,下标引用和简介访问完全相同。
例:
Int array[10];
Int *ap=array+2;
Ap 是array+2也是&array+2。
*ap 是间接访问跟随指针访问它所指向的位置,array[2]。
ap[0] 是err,ap不是一个数组。
ap+6 是array[2]向后移动6个整数位置的元素,与它对等的元素是array+8或&array[8]。
*ap+6 是首先执行间接访问,间接访问的值再与6相加,array[2]+6。
*(ap+6)是array[8]。
ap[6] 是array[8]。
&ap 表达式合法,因为此时没有对等的涉及array的表达式,所以无法预测编译器会把ap放到相对于array的什么位置。
ap[-1] ap指向第三个元素,所以使用偏移量-1得到前一个元素,也就是array[1]。
ap[9] 对应array[11],但数组只有10个元素。这个下标表达式的结果是一个指针表达式,但他所指向的位置越过了数组的右边界。根据标准,这个表达式是非法的。但是少有编译器能检测出这个错误,所以程序能够顺利进行。在绝大多数机器上,它将访问恰好存储于数组最后一个元素后面第2个位置的值
2[array] 把它转换成对等的间接访问表达式*(2+(array))与array[2]是相等的。
指针有时候比下标更有效率。
3.初始化
不完整的初始化
int arr[5] = {1,2,3,4,5,6}; 错误,无法把6个整型值装入5个整形变量中
int arr[5] = {1,2,3,4} ; 合法,最后一个元素初始化为0
int arr[5] = {1,5}; 只允许省略最后几个初始值
自动计算数组长度
int arr[] = {1,2,3}声明中并未给出数组的长度,编译器自动把数组长度设置刚好容纳所有初级值的长度。
字符数组的初始化
char message[] = {‘h’,’e’};
char message[] = “he”;
二维数组
int arr [3][4] //表示三行四列的数组或者四列三行,
1.存储顺序
|
|
|
|
|
|
|
|
|
|
|
|
实线方框表示第一维的3个元素,虚线用于划分第二位维的4个元素(一行一行存储,看成一维数组)
上面每个元素的下标值分别为:
0,1 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
在c中,多维数组的存储顺序按照最右边的下标率先变化的原则,称为行主序。
2.数组名
int arr[3][4]
Arr这个名字的值是一个指向它第一个元素的指针,所以arr是一个指向一个包含4个整型的数组的指针(指向数组的指针)
3.下标
Arr指向第一行,
arr+1指向第二行,
*(arr+1)指向第二行第一个元素,arr+1指向第二行,*间接访问第一个元素,
*(*(arr+1)+3)指向第二行第四个元素,第二个*访问第二行第一个元素,第二个*访问右移三个整型长度的元素,*(arr[1]+3),arr[1][3]
4.指向数组的指针
Int matrmix[3][10];
Int (*p)[10] = matrmix;
p指向matrmix的第一行
Int *pi = matrmix[0][0];//指向matrmix的第一个元素
Int *pi = matrmix[0];//指向matrmix的第一个元素
5.初始化
二维数组初始化
Int matrmix [3][5] = {
{00,01,02,03,04},
{10,11,12,13,14},
{20,21,22,23,24}
};
三维数组初始化
Int three_dim[2][3][5] = {
{
{000, 001, 002, 003, 004 },
{010, 011, 012, 013, 014},
{020, 021, 022, 023, 024}
},
{
{100, 101, 102, 103, 104 },
{110, 111, 112, 113, 114},
{120, 121, 122, 123, 124}
}
};
四维数组初始化
6.数组长度自动计算
在多维数组中,只有第一维才能根据初始化列表缺省的提供。
7.指针数组