I was asked about this today. In practice, I rarely use 2-dimensional array, instead I use vector of vectors.
To allocate a 2-d array on the stack, a C-style array is
int d[2][3];
Then to refer to an element it is like
d[i][j];
To make a dynamical allocation, one can NOT write his code like this
int **wrong_d = new int[2][3];
since the d
in int d[2][3];
is not a int**
, instead it is of the type
int (*)[3]
or in your evil human words, it is a int[3]
pointer.
It is a little tricky to declare a 2-d array dynamically.
int (*d)[3] = new int[2][3];
Or
int v1 = 2;
int (*d)[3] = new int[v1][3];
The number 3 here can NOT be replace by a non-constant. My understanding is that since this value is associated with the type of d, in a strong type language like C/C++ which should be known by the compiler.
We can check the size of variables to verify this interpretation.
1 #include
2
3 using namespace std;
4
5 int main(int argc, char **argv)
6 {
7 int v1 = 2;
8 int (*d)[3] = new int[v1][3];
9 cout << "sizeof(d): " << sizeof(d) << endl;
10 cout << "sizeof(d[0]): " << sizeof(d[0]) << endl;
11 cout << "sizeof(d[1]): " << sizeof(d[1]) << endl;
12 cout << "sizeof(d[0][0]): " << sizeof(d[0][0]) << endl;
13 return 0;
14 }
The output is:
$./test
sizeof(d): 8 //< 2 pointers, &d[0] and &d[1]
sizeof(d[0]): 12 //< int[3], d[0][0] d[0][1] d[0][2]
sizeof(d[1]): 12 //< int[3], d[1][0] d[1][1] d[1][2]
sizeof(d[0][0]): 4 //< an integer
To save your life, I would recommend to use vectors.
int v1 = 2;
int v2 = 3;
vector > d(v1, vector(v2, 0));
受教了。。以前一直用的是vector<vector > d然后手动循环初始化。。。
看了你的,我也写了一篇: http://jianbo.ws/blog/tech/on-multi-dimensional-arrays/ 哈哈哈
为什么域名要是.ws。。。
猥琐 = =