在堆上声明一个数组

int main( )
{  
#if 0
    // 方式一:
    int** pArr = NULL;
    pArr = new int*[4];
    for(int i = 0; i < 4; i++){
        pArr[i] = new int[8];
    }
    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 8; ++j){
            pArr[i][j] = i * j;
        }
    }
    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 8; ++j){
            if(j == 0) cout << endl;
            cout << pArr[i][j] << '\t';
        }
    }
    // 删除
    for(int i = 0; i < 4; ++i){
        delete [] pArr[i];
    }
    delete [] pArr;
#endif
    // 方式二:
    cout << sizeof(int[5]) << endl;
    // 初始化
    int(*pArr)[8] = new int[4][8];
    memset(pArr, 0, sizeof(int[4][8]));
    // 或者
    // int(*pArr)[8] = new int[4][8]{{0}};
    cout << sizeof(int[4][8]) << endl;

    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 8; ++j){
            pArr[i][j] = i * j;
        }
    }
    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 8; ++j){
            cout << pArr[i][j] << '\t';
        }
        cout << endl;
    }
    cout << endl;
    delete[] pArr;
    
    // 取地址
    int arr[3][4]{{0}};
    int(*p)[3][4] = &arr;
    cout << arr[2][3] << endl;
    cout << *p[2][3] << endl;
    
    return 0;
}

输出:

Start

0	0	0	0	0	0	0	0	
0	1	2	3	4	5	6	7	
0	2	4	6	8	10	12	14	
0	3	6	9	12	15	18	21	
0
Finish

在栈上声明一个数组

int main( )
{
    int a[3];           // 全部初始化为 0
    int b[3]{4};        // 第一个值是 4,其余初始化为 0
    int c[3] = {4};     // 同上
    // new 一维数组
    int* d = new int[3]{4}; // 同上

    // 与 vector 不同
    vector<int> v(3, 4);// 3 个值都是 4
    return 0;
}