# On 2 dimensional array of C++

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));
```
1. 受教了。。以前一直用的是vector<vector > d然后手动循环初始化。。。

• grapeot

为什么域名要是.ws。。。

• bobye

猥琐 ＝ ＝