C++ 指针二维数组, C++二维指针数组笔记

C++ 二维动态数组

一、 已知第一维

#include <iostream>

using 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;
}
View Code

 

 

二、两维都不知道

#include <iostream>

using 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;
}
View Code

 

 

 三、已知第二维

 

 

 四、 已知第一维, 一次分配内存(保证内存连续性)

 

 五、 两维都未知, 一次分配内存(保证内存的连续性)

 

 

    多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!

 

posted @ 2018-06-06 15:15  我当道士那儿些年  阅读(4982)  评论(0编辑  收藏