LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: graydream

C++中如何传递二维数组更方便?

[复制链接]
发表于 2005-7-22 15:36:47 | 显示全部楼层
简单:

aaa((int **)X);

一切OK
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-25 16:41:52 | 显示全部楼层
很奇怪的,我试了很多种写法,虽然指针传过去了,然后强制转换成列指针,但只能索引到第一行。

看样子只能用vector了,顺便问一下,vector有没有像数组那样的简单的初始化方法?我在书上没有发现
回复 支持 反对

使用道具 举报

发表于 2005-7-25 20:25:46 | 显示全部楼层
如果你传指针就要自己计算数组元素的地址,不要把 int a[][] 和 int **x 混为一谈

  1. int a[][]中,如果把a看成地址,相当于这样

  2. a
  3. |
  4. \/
  5. ------------------------------------
  6. |   int     |    int    |   int   |
  7. ------------------------------------
  8. |   int     |    int    |   int   |
  9. ------------------------------------
  10. |   int     |    int    |   int   |
  11. ------------------------------------


  12. int **x中,x是这样

  13. x
  14. |
  15. \/
  16. ----------                                                             ----------
  17. |  int *  |----------------------------------------------------------->|   int   |
  18. ----------                                                             ----------
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-7-25 21:20:21 | 显示全部楼层
void aaa(int ** x)
{
}


main()
{
int X[2][2];
aaa((int**)X);
}
回复 支持 反对

使用道具 举报

发表于 2005-7-25 22:31:21 | 显示全部楼层
最好还是以类封装过的类型来完成你所要做的2维数组操作。可以将许多的细节隐藏在类的实现中。如果在三维的数组的传进来了呢。而且C++可以很方便的做到的。
回复 支持 反对

使用道具 举报

发表于 2005-7-26 08:32:26 | 显示全部楼层
怎么有这么多人用 int **,二级指针和二维数组有关系吗?

只不过 int * 和 int 的 size 恰好一样才不出错。
回复 支持 反对

使用道具 举报

发表于 2005-7-26 16:21:04 | 显示全部楼层
没有办法,很多人分不清楚指针和数组的区别。
回复 支持 反对

使用道具 举报

发表于 2005-11-2 16:07:32 | 显示全部楼层
可以用指向数组的指针,定义一指向二位数组的指针,如:int ( *p)[2],括号中的2表示第二维大小
void aaa(int (*x)[2])
{
}


main()
{
int X[2][2];
aaa(X);
}
回复 支持 反对

使用道具 举报

发表于 2005-11-3 00:59:25 | 显示全部楼层
Post by graydream
很奇怪的,我试了很多种写法,虽然指针传过去了,然后强制转换成列指针,但只能索引到第一行。

看样子只能用vector了,顺便问一下,vector有没有像数组那样的简单的初始化方法?我在书上没有发现



bookstack  同学的方法是正道!

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. typedef vector<int> vec_int;



  5. void printArry(vector<vec_int>& theArray)
  6. {
  7.         for(vector<vec_int>::iterator it = theArray.begin(); it != theArray.end(); it++ ){

  8.                 for( vec_int::iterator colit = it->begin(); colit != it->end(); colit++){
  9.                         cout << *colit << ' ';
  10.                 }
  11.         cout <<endl;

  12.         }
  13. }

  14. int main()
  15. {  
  16.        
  17.     vec_int vec_int1;
  18.         vec_int vec_int2;
  19.         for (int i = 1; i < 4; i++){
  20.                 vec_int1.push_back(i);
  21.         }
  22.         for (int i = 4; i < 7; i++){
  23.                 vec_int2.push_back(i);
  24.         }
  25.         vector<vec_int> array;
  26.         array.push_back(vec_int1);
  27.         array.push_back(vec_int2);
  28.     printArry(array);
  29.     return 0;
  30. }

复制代码


这样够动态了吧. 呵呵!


vector的初始化,<<C++ primer 第三版>>有啊.
PS:偶也是刚擦干她上面的厚厚的灰找到的.
回复 支持 反对

使用道具 举报

发表于 2005-11-7 16:03:12 | 显示全部楼层
今天一不留神在MSDN上发现了一个STL处理多维数组的好例子.

  1. #include <vector>
  2. using namespace std;

  3. template <class T>
  4. class C2DVector
  5. {
  6. public:
  7.    C2DVector():m_dimRow(0), m_dimCol(0){;}
  8.    C2DVector(int nRow, int nCol) {
  9.       m_dimRow = nRow;
  10.       m_dimCol = nCol;
  11.       for (int i=0; i < nRow; i++){
  12.          vector<T> x(nCol);
  13.          int y = x.size();
  14.          m_2DVector.push_back(x);
  15.       }
  16.    }
  17.    void SetAt(int nRow, int nCol, const T& value) throw(std::out_of_range) {
  18.       if(nRow >= m_dimRow || nCol >= m_dimCol)
  19.          throw out_of_range("Array out of bound");
  20.       else
  21.          m_2DVector[nRow][nCol] = value;
  22.    }
  23.    T GetAt(int nRow, int nCol) {
  24.       if(nRow >= m_dimRow || nCol >= m_dimCol)
  25.          throw out_of_range("Array out of bound");
  26.       else
  27.          return m_2DVector[nRow][nCol];
  28.    }
  29.    void GrowRow(int newSize) {
  30.       if (newSize <= m_dimRow)
  31.          return;
  32.       m_dimRow = newSize;
  33.       for(int i = 0 ; i < newSize - m_dimCol; i++)   {
  34.          vector<int> x(m_dimRow);
  35.          m_2DVector.push_back(x);
  36.       }
  37.    }
  38.    void GrowCol(int newSize) {
  39.       if(newSize <= m_dimCol)
  40.          return;
  41.       m_dimCol = newSize;
  42.       for (int i=0; i <m_dimRow; i++)
  43.          m_2DVector[i].resize(newSize);
  44.    }
  45.    vector<T>& operator[](int x)    {
  46.       return m_2DVector[x];
  47.    }
  48. private:
  49.    vector< vector <T> > m_2DVector;
  50.    unsigned int m_dimRow;
  51.    unsigned int m_dimCol;
  52. };

复制代码

C2DVector 类封装了一个动态二维数组。在建立数组时可设置其大小。例如,C2DVector <int>a(3,4); 将建立一个 3 x 4 的数组。

C2DVector 是动态的,因此它的两个维可以增加。例如,my2DArray.GrowCol(5); 可将该二维数组增大到 5 列。此外,由于我们已经重载了操作符 [],因此它可以像常规 C/C++ 二维数组一样使用。因此,my2DArray[x][y] = 5 之类的语法是受支持的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表