10.1 数组
数组由相同类型的一系列元素组成。
10.1.1 初始化数组
例:int power[3]={1,2,3}
注意:使用const声明数组
例:const int power[3]={1,2,3}表示数组只读。
注意:存储类别警告
本节描述都为自动存储类别
10.1.2 指定初始化器(c99)
该特性指可以单独只初始化数组中指定的数组元素。
例:int day[10]={31,28,[4]=31,30,31,[1]=29},
打印结果:1--31 2--29 3--0 4--0 5--31 6--30 7--31 8--0 9--0 10--0 :该处1,2,3表示数组中第几个元素。
该处程序[1]:先被初始化为28,后被指定为29。
[4]=31,30,31:[4]被初始化为31,后面的值将用于初始化后面元素;
性质:1:如果指定初始化器后面有更多的值,那么这些值将被用于初始化指定元素后面的元素
2:如果再次初始化元素,最后的初始化将取代之前的初始化。
当未指定元素大小时:
int stuff[]={1,[2]=23} int staff[]={1,[2]=23,4,9}
编译器会把数组大小设置为足够装下初始化的值,即stufff有2个元素,staff有4个元素。
10.1.3 给数组元素赋值
声明数组后,可以借助数组下表或索引
int oxen[size]={1,2,3}
int yaks[size]
yaks=oxen //不允许把数组作为一个单元赋值给另一个数组
yska[size]=oxen[size] //数组下标越界
yaks[szie-1]={1,2,3} //除了初始化以外,不允许使用花括号列表的形式赋值
10.1.4 数组边界
使用越界下标结果是未定义的。
10.1.5 指定数组的大小
声明数组只能在方括号中使用 整形常量表达式,另外表达式的值必须大于零。
10.2 多维数组
例 float rain[5][12]:表示内含5个数组元素的数组,每个数组元素内含12个float类型的元素。
10.2.1 初始化二维数组
例:
float rain[5][2]= { {1,2} {1,2} {1,2} {1,2} {1,2} {1,2} };
10.2.2 其他多维数组
通常处理3维数组需要3层嵌套循环
10.3 数组和指针
指针的值是它指向对象的地址。
在指针前使用*可以得到该指针所指对象的值
在c中,指针加1指的是递增它所指向类型的大小(以字节为单位)。
*间接运算符优先级大于+
所以
*data+2表示第一个元素的值加2.
*(data+2)表示第3个元素的值
10.4 函数数组指针
例:编写一个返回数组中所有元素的和
int sum(int *ar,int n)第一个形参告诉该数组的地址和数据类型,第二个形参告诉函数该数组中元素个数。
在函数原型或函数定义中
int sum(int ar[] , int n )等价与int sum(int *ar , int n)
10.4.1 使用指针形参
函数处理数组必须知道何时开始和结束,可以同时传递两个指针,一个开始,一个结束。
注意:c在给数组分配空间时,指向数组后面第一个指针仍是有效指针
10.4.2 指针表示法和数组表示法
10.5 指针操作
赋值:把地址赋给指针。
解引用:*运算符给出指针指向地址上的值。
取值:&给出指针本身的地址。
指针和整数相加:整数会和指针所指向类型的大小(以字节为单位)相乘,然后把结果与初始值相加。
递增指针:递增可以让数组元素指针指向数组下一个元素。
指针减去一个整数:
递减指针:
指针求差:
比较:
注意:创建一个指针时,系统只分配了储存了指针本身的内存,并未分配其存储数据的内存(即指向的目标内存)。
10.6 保护数组中的数据
10.6 对形式参数使用const
例:int sum(const int ar [] , int n);即表示处理数组时将其视为常量,不可更改,并不是要求原数组是常量。
10.6.2 const的其他内容
指向const的指针不能用于改变数组元素的值。
例:int rate [3]={1,2,3}
const int*pd=rate
*pd=4; //不允许
pd[2]=4 //不允许
rate[0]=2 //允许
规则:把const数据或者非const数据的地址初始化为指向const的指针或为其赋值是合法的,然而只能把非const数据赋值给普通指针。
即要满足:指向const的指针不能用于改变数组元素的值
const int * pa 表示不允许修改指向对象的值。
int const *pb 表示不允许修改其存储的值
10.7 指针和多维数组
10.7.1 指向多维数组的指针
int (*pz)[2] pz指向一个内含两个int 类型值的数组。
int *pax [2] 表示pax是一个内含两个指针元素的数组,每个元素都指向int类型
10.7.2 指针的兼容性
10.7.3 函数和多维数组
void some ( int (*pz)[4] )
如果pz当且仅当是一个函数的形式参数时:
可以这样声明:void some(int pz[] [4])注意:第一个方括号是空的,空的方括号表示pz是一个指针。
10.8 变长数组(VLA)
例 int a=2;int b=2;
int sele [a][b];
注意:变长数组中的变不是指可以修改已创建数组的大小,一旦创建了变长数组,它的大小就保持不变。
这里的变是指:在创建数组示,可以用变量来指定数组的维度。
10.9 复合字面量
{int [2] {1 , 2}}//复合字面量
因为复合字面量是匿名的,必须在创建的同时使用他