关于二维数组当做函数参数的问题
来源:互联网 发布:win7开机优化加速 编辑:程序博客网 时间:2024/06/05 14:19
其实本文章来自 网络文章的拼凑,并非绝对意义上的原创。
在C语言中可以用二维数组作为实参或者形参。
1、函数中用二维数组作为形参,函数声明中可以指定所有维数的大小,也可以省略第1维的维数如
void
f(
int
array[3][10]);
//正确
void
f(
int
array[][10]);
//正确
2、函数中用二维数组作为形参,不能把第2维或者更高维的大小省略,如下面的定义是不合法的:
void
f(
int
array[][]);
//错误
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:
void
f(
int
array[3][]);
//错误
3、二维数组作为实参传递时,必须保证实参第2维的维数与形参第2维的维数相同,因为必须要保证形参和实参的数据类型一致。比如定义如下函数:
void
f(
int
array[][10]);
可以将如下数组传递给函数f
int
a[2][10] = {1,2,3,4};
int
b[4][10] = {1};
如果第二维是固定的,可以类似fun(char* p[4])这样的方式,如果不确定,那么就用二级指针,同时要用一个参数传递第二维的大小,类似fun(char** p, unsiged col),同时在表示其中一个元素时,不能使用p[i][j]这样的写法,必须自行计算出其偏移位置.
大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的:
对于数组 int p[m][n];
如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:
p + i*n + j;
从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组 作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指 针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定 的参数变为维数随即的参数,例如:
void Func(int array[3][10]);
void Func(int array[][10]);
变为:
void Func(int **array, int m, int n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
*((int*)array + n*i + j);
在调用这样的函数的时候,需要注意一下,如下面的例子:
int a[3][3] =
{
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
Func(a, 3, 3);
根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用:
Func((int**)a, 3, 3);
其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。
- 关于二维数组当做函数参数的问题
- 关于二维数组作为参数传递给函数的问题
- 关于二维数组做参数的问题
- 二维数组作函数的参数问题
- 关于二维数组做函数参数,传递形参的形式的问题
- C++中关于二维数组作为函数参数传递的问题
- C++中关于二维数组作为函数参数传递的问题
- 关于把二维数组做参数的问题
- c 语言 二维数组的函数参数传递的问题
- 关于二维数组做参数问题
- 二维数组作为函数参数问题
- 二维矩阵的旋转问题(二维数组作为函数参数)
- 二维数组作为参数的函数
- 二维数组名作函数的参数
- 二维数组作为函数参数的调用
- 二维数组做函数的参数
- 二维数组作为参数传递的问题
- 关于二维数组指针的问题?
- 如何在linux嵌入式开发板上开机自动运行用户应用程序
- Android AIDL尝试
- LeetCode - 5 Longest Palindromic Substring 最长回文子字符串
- 通过Comparator和Comparable对集合进行排序
- New Document
- 关于二维数组当做函数参数的问题
- C++ STL中next_permutation的实现
- MySQL临时表
- 发布webapi 404错误
- 单链表递归反转和非递归翻转
- C语言实现控制行数打印星号金字塔
- java中返回值return的使用
- from now on...
- 深刻的理解Fragment生命周期 都在做什么