首页 > 技术文章 > 一维数组_二维数组

Lunais 2017-07-25 15:14 原文

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、传递给函数的数组参数在行为上就像它们是通过传址调用的那样(实际是传值调用)。

推荐阅读