1 一维数组
1.1 数组名
- C语言中,数组名的值时一个指针常量,也就是第一个元素的地址。他的类型取决于数组元素的类型。
- 数组名不完全等于指针。1)数组具有自己的属性,有确定的元素数量,编译器用数组名来记住这些属性;而指针仅是一个标量值。2)只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。(指针常量的值不能被修改,也就是说不能当作左值使用)
- 两种情况数组名不是指针常量使用。1)sizeof,得到整个数组的字节数 2)&取地址
- 数组赋值。必须要用循环一个一个赋值。
- int * c;此处的c就是一个指针变量。
1.2 声明数组参数
函数原型中的一维数组形参无需写明它的元素数目,因为函数并不为数组参数分配内存空间,形参就是一个指针,指向已经分配好内存的地方,没有数组的属性。
1.3 初始化
- 不完整初始化。缺省的值都初始化为0.
- 自动计算数组长度。如果初始值的长度经常改变的话,这样写比较方便。
int array[]= {1,2,3,4,5};//此数组长度就是5个int
- 字符数组初始化。
char array[] = "hello";//字符串最后是/0
2 多维数组
2.1 存储顺序
多维数组抽象可以理解为如下所示,
但是实际上内存中存储的是如下所示,
2.2 数组名
一维数组名是一个指针常量,指向的是数组的第一个元素。
二位数组名,指向的是第一个数组(一维数组)。
- 下标
matrix[3][10];
matrix+1;//表示指向第二个数组
*(matrix+1);//指向第二个数组的第一个元素
*(matrix+1)+5;//指向第二个数组的第6个元素
*(*(matrix+1)+5);//第二个数组的第6个元素的值
//以上也可以写为
*(*(matrix[1])+5);
2.3 数组指针与指针数组
int matrix[10], *vp = matrix;
int matrix[3][10], *mp = matrix;//incorrect statement
//因为Matrix表示的是指向数组的指针,所以应该声明如下
int (*p)[10] = matrix;//由于括号的存在,所以P是一个指针,然后执行
//[],表示指针指向这个[10]数组。[]内的值不能为空
//同理,指针数组应该为,
int *p[10];//按照优先级先执行数组,然后再执行指针,所以这个是//数组指针
2.4 作为函数参数的多维数组
//一维数组
int vector[10];
func(vector);
void func(int vector[]);//
//or
void func(int *vector);
//二维数组
int vector[3][10];
func2(vector);
void func2(int vector[][10]);
//or
void func2(int (*p)[10]);
2.5 初始化
初始化时,花括号很重要,在花括号内省略掉后面几个元素。