作为函数参数的多维数组名在传递方式和一维数组名相同-- 实际传递的是个指向数组第一个元素的指针.但是两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便函数形参的下标表达式进行求值.这里有两个例子,说明了它们之间的区别:int vector[10];
...
funcl(vector);
参数vector的类型是指向整型的指针,所以funcl的原型可以是下面两种中的任何一种:
void funcl(int *vec);
void funcl(int vec[]);
作用于vec上面的指针运算把整型的长度作为他的调整因子.
现在让我们来观察一个矩阵:
in matrix[3][10];
......
func2(matrix);
这里,参数matrix的类型是指向包含10个整型元素的数组的指针.父女出的原型应该是怎么样的呢?
你可以使用下面两种形式中的任何一种:
void func2(int (*mat)[10]);
void func2(int mat[][10]);
在这个函数中,码头的第一个下标根据包含10个元素的整型数组的长度进行调整,接着第2个下标根据整型的长度进行调整,这个原先的matrix数组一样.
这里的关键在于编译器必须知道第2个及以后各维的长度才能对下标进行求值,因此在原型中必须声明这些维的长度,第一维的长度并不需要,因为在计算下标值时用不到,因为vec++ 和vect++都是相同的都是整型的字节数作为计算的单位
在编写一维数组形参的函数原型时,你即可一把他写成数组的形式,也可以把它写成指针的形式.但是,对于多维数组,只有第一维可以进行如此选择.尤其是,把func2写成下面这样的原型是不正确的:
void func2(int **mat);
这个例子把码头声明为一个指向整形指针的指针,他和指向整型数组的指针并不是一回事.
因为mat++ 和matrix++表示并不一样.
mat++ 指向下个指针是以一个整型作为间距(4个字节)
matrix++指向下一个数组是一个数组的元素个数作为间距的(10个元素40个字节).
阅读(2096) | 评论(0) | 转发(0) |