C++ 二维动态数组
一、 已知第一维
#includeusing namespace std;int main(int argc, char const *argv []){ int M = 5; int n = 5; // 声明数组行指针 char * a[M]; for (int i = 0; i < M; i++) { // 声明数组列指针 a[i] = new char[n]; // 列赋值 for (int j = 0; j < n; j ++){ a[i][j] = j; } } // 打印值 for (int i = 0; i < M; i++){ for (int j = 0; j < n; j++){ printf("%d ", a[i][j]); } printf("\n"); } // 打印行指针 printf("a[0] : %p\n", a[0]); printf("a[0] : %p\n", *(a+0)); // 打印具体位置指针 printf("a[0][0]: %p\n", *(a+0)+0); printf("a[0][3]: %p\n", *(a+0)+3); // 值的打印方法 printf("a[1][2]: %d\n", *(*(a+1)+2)); printf("a[1][2]: %d\n", a[1][2]); // delete 内存 for (int i = 0; i < M; i++){ delete [] a[i]; } return 0;}
二、两维都不知道
#includeusing namespace std;int main(int argc, char const *argv []){ int rowsNum = 5; int columnsNum = 5; // 两维都不知道 char **a; a = new char * [rowsNum]; for (int i = 0; i < rowsNum; i++) { a[i] = new char [columnsNum]; for (int j = 0; j < columnsNum; j++) { a[i][j] = j; printf("%d ", a[i][j]); } printf("\n"); } printf("%d\n", sizeof(a)); for (int i = 0; i < rowsNum; i++) { delete [] a[i]; } delete [] a; return 0;}
三、已知第二维
四、 已知第一维, 一次分配内存(保证内存连续性)
五、 两维都未知, 一次分配内存(保证内存的连续性)
多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!