数组初始化
当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为0;个数多于数组元素个数时,会视为错误
省略数组中括号中的数字,编译器会根据初始化列表中的项目来确定数组的大小。
days是数组
sizeof days是整个数组的大小
sizeof day[0]是数组中一个元素的大小
c不允许把数组作为一个单元赋给另一个数组,除了初始化外也不允许使用花括号列表的形式赋值
使用越界的数组下标会导致程序改变其他变量的值
c99之前,数组大小的定义只能在方括号中使用整型常量表达式
多维数组
float rain[5][12]//一个内含12个float类型元素的数组
int bos[10][20][30]//box内含10个元素,每个元素是内含20个元素的数组,这20个元素的数组中的每个元素是内含30个元素的数组
初始化多维数组
{
{4,3,1,2},
{5,6,7},//后面一个元素被初始化为0
{1,2,3,4}
};
数组名是数组首元素的地址
dates+2==&dates[2]//相同的地址
*(dates+2)==dateds[2]//相同的值
函数传入数组
可以把数组大小作为第二个参数
int sum(int *ar,int n)
int sum(int a[],int n)
在函数原型中可以省略数组名,在定义中不能省略参数名
指针求差:求差的两个指针分别指向同一个数组的不同元素,通过计算求出两元素之间的距离。差值的单位与数组类型的单位相同
不要解引用未初始化的指针,因为在创建一个指针的时候,系统只分配了储存指针本身的内存,并未分配储存数据的内存,因此,在使用指针之前,必须先用已分配的地址初始化它
const
int sum(const int ar[],int n)//const并不是要求原数组是常量,而是该函数在处理数组时将其视为常量,不可更改。
const double *pd=rates;//指向const的指针不能用于改变值
把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的
double *const pc=rates;//声明并初始化一个不能指向别处的指针
const double *const pc=retes;//该指针不能更改它所指向的地址,也不能修改指向地址上的值
指针和多维数组
int zippo[4][2];
zippo//二维数组首元素的地址(每个元素内含两个Int类型元素的一维数组,与zippo[0]的区别是,zippo是一个占用两个int大小对象的地址,zippo[0]是一个占用一个int大小对象的地址,但是值是相同的)
zippo+2//二维数组的第三个元素(即一维数组)的地址
*(zippo+2)//二维数组的第三个元素(一维数组)的首元素(一个int类型的值)地址
*(zippo+2)+1//二维数组的第3个元素的第2个元素地址
((zippo+2)+1)//二维数组的第三个一维数组元素的第2个int类型元素的值,即zippo[2][1]
*zippo与&zippo[0][0]等价
指向多维数组的指针
int (*pz)[2];//pz指向一个内含两个Int类型的数组
声明一个指向N维数组的指针时,只能省略最左边方括号中的值int sum2(int ar[][12][20][30],int rows);
变长数组
允许使用变量表示数组的维度
int quarters=4;
int regions=5;
double sales[regions][quarters];
变长数组必须是自动存储类别,而且不能在声明中初始化它们。
int sum(int rows,int cols,int ar[rows][cols])