一维数组_二维数组
1、数组名
int vector[10]; //vector是一个指针,是一个指向数组首元素的指针。即指向整形的指针。
int matrix[3][10]; //matrix是一个指针,是一个指向(有10个整形元素的)数组的指针。
指向数组的指针的声明方式:
int (*p)[10] = matrix;
2、数组名做函数参数
一维数组:
int vector[10]; void func1(int *vec); void func1(int vec[]);
二维数组:
int matrix[3][10]; void func2(int (*mat)[10]); void func2(int mat[][10]);
二维数组名做函数参数,mat的第1个下标根据(包含10个元素的)整形数组长度进行调整;
第2个下标根据整形的长度进行调整。
3、初始化
二维数组缺省方式;
int two_dim[][5] = { { 00, 01, 02}, { 10, 11 }, { 20, 21, 22, 23 } };
总结:
数组名一般表示指向该数组第1个元素的指针。在sizeof运算符和单目操作符&中例外:
sizeof(array); //表示整个数组所占用的字节
单目操作符&返回一个指向数组的指针,而不是指向第1个元素指针的指针。
除了优先级不同以外,下标表达式array[value]和间接访问表达式*(array+value)是一样的。
指针和数组不同点:声明数组时,同时为其分配了内存空间,用于容纳数组元素;声明指针时只分配了用于容纳指针本身的空间。
数组名做函数参数传递时,传递给函数的是指向数组第1个元素的指针。函数接收到的是实参的拷贝,所以对形参进行操作不会实参。但通过指针间接访问可以修改原先的数组元素。数组形参可以声明为数组,也可以为指针,只有它们做函数的形参时才相等。
注:
C函数的所有参数均以“传值调用”方式进行传递,这意味着函数将获得参数值的一份拷贝。这样函数可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数。但是如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,可间接修改数组元素。
数组参数的这种行为似乎与传值调用规则相悖。但其实并无矛盾之处——数组名的值实际上是一个指针,传递给函数的就是这个指针的一份拷贝。下标引用实际上是间接访问的另一种形式,它可以对指针执行间接访问操作,访问指针指向的内存位置。
参数实际上是一份拷贝,但在这份拷贝上执行间接访问的是原先的数组。
1、传递给函数的标量参数都是传值调用的。
2、传递给函数的数组参数在行为上就像它们是通过传址调用的那样(实际是传值调用)。