动态数组参数
来源:互联网 发布:g是什么意思网络用语 编辑:程序博客网 时间:2024/05/04 16:53
例如:int a[3][4]; 把 a 做为参数传给一个函数:func(a),
只有此形式才没有问题:void func(int b[ ][4]);
可是若为如下形式:void func(int* b); 在DevCpp中有Error;在VC中有Warning,但可得到正确的结果。
这下就有问题了:
(1). a 是一个int**型,但在VC中用int*型据然也能得到正确的结果(函数中的*(b + 2),VC理解为一个整数,且正是a[0][1]所对应的整数);
(2).若要写一个对于所有int[ ][ ]都通用的接口似乎是不可能的,因为函数形参的第二个[ ]中必须有数字。
这个(2)是我想问的关键问题,如何写一个通用的接口(例如:对于int[ ][ ])?
---------------------------------------------------------------
严格来说,变量a不是(int **)即二级指针类型,而是一个数组类型。
定义 int a[3][4]其实是与下面的定义方式是有相同效果的,即:
typedef int arraySingleDegree[4];
arraySingleDegree a[3];
意思就是说:变量a是一个具有3个元素的数组,其中每个元素类型为一个一维数组(该一维数组具有4个元素,具体类型为int)。
如果你对上面的话不是很理解的话,可以将一维数组想象为一个结构体,这样的话,一个二维数组其实就相当于一个“结构体”数组,只不过这里的结构体是一个数组而已。
事实上,结构体和一维数组在物理存储上可以视为是没有差别的。上面的一维数组类型arraySingleDegree就相当于一个如下的结构体变量定义:
typedef struct TagArrayAsStruct
{
int iItem1;
int iItem2;
int iItem3;
int iItem4;
}ArrayAsStruct;
类比思考一下,可以有助于你对二维数组的理解。
如果理解了二维数组,那么就可以很容易地和二级指针区别开来。
二级指针变量的内容是一个一级指针变量的地址。由于一级指针变量可以指向任意长度一维数组的首地址,因此二级指针变量就不等同于任何一个二维数组。事实上,一个二维数组一旦定义,则其对应的伪类型即一维数组的长度就是确定的。
所以如果需要对任意二维数组进行操作,就需要定义类似下面的一个接口:
int ActionOnAnyDoubleDegreeArray(int ** ppAddr,
int iLengthOfDegreeOne,
int iLengthOfDegreeTwo);
一家之言,仅供参考,欢迎指正。
---------------------------------------------------------------
你要将a传入接口ActionOnAnyDoubleDegreeArray中吗?这样调用:
iRetVal = ActionOnAnyDoubleDegreeArray((int **)a,3,4);
---------------------------------------------------------------
通用接口用一级指针,加行列数
void f(int *x,int row,int col);
调用时:
设有int a[3][4],则
f(&a[0][0],3,4)
a[i][j]=>x[i*col+j]
----------------------------------------------------------------
首先你要知道二维数组其实有两种.
第一种是连续空间的. 第二种是行索引列的.
1, int* matrix=new int[20*20]; // 20行20列
matrix[20*10+2]=90; // 实际就是matrix[10][2];
2, int** matrix=new int*[20];
for(int i=0; i<20; i++)
matrix[i]=new int[20];
int** p=matrix;
matrix[10][2]=90;
第一种用foo(int* p, int row, int col);
第二种用foo(int** p, int row, int col);
/////////////////////////////////////////
// Exp.
/////////////////////////////////////////
class Widget{
public:
void Compute(int* _matrix
unsigned int i,
unsigned int j);
private:
unsigned int _row;
unsigned int _col;
};
void Widget::Compute(int* matrix
unsigned int i,
unsigned int j){
// 行基址+(列个数*行数)+列数
}
- 动态数组参数
- 动态数组参数SetLength
- 多维动态数组作为函数传递参数
- C++ 使用动态二维数组参数
- fortran 以动态数组为函数参数
- 动态申请二维数组及参数传递
- C++动态二维数组作为函数参数
- 数组、指针数组、数组指针、动态数组、数组作为函数参数
- vc++动态数组作为参数传递注意的问题
- 在异步加载 AsyncTask 中用动态的数组作为参数
- C++动态申请数组和参数传递问题
- c++ 二维动态数组初始化及作为参数传递
- 二维数组的动态申请空间并参数传给函数
- 数组属性,根据参数动态设置类中数组的长度!构造函数传入数组长度!并初始化数组!
- 动态参数
- 动态参数
- 动态参数
- 学习笔记---main函数参数-动态存储管理与动态数组
- 利用反射实现工厂方法
- struts学习中的一点迷惑
- 求一个网络嗅探器的原码,能分析网页内容的
- 自定义组件单元文件结构简析
- Duwamish' Framewokes and data how to run !!!~~~
- 动态数组参数
- zz提问的智慧
- 星座
- 《白鸽》 --伍佰
- zz如何成为一位 hacker
- SAX:Simple API for XML
- AOP:通过面向方面编程提高代码的封装和复用性
- 这几天烦透了
- AOP:通过面向方面编程提高代码的封装和复用性