创建矩阵时,为什么要使用“ ** int A”而不是“ int A”(C ++)

时间:2019-11-29 00:55:07

标签: c++ arrays

所以假设我有一个矩阵A,其中

unsigned int ** A = new unsigned int *[n];
  for(int j = 0; j<n; j++){
    A[j] = new unsigned int[m];
  }

我有点难以理解为什么我们会在这里而不是仅仅使用指针

unsigned int A = new unsigned int [n];
  for(int j = 0; j<n; j++){
    A[j] = new unsigned int[m];
  }

在两种情况下,我都可以以A的身份访问A[0][0]的值-为什么在第一种情况下,即**A[0][0]=1,我不必取消引用?

1 个答案:

答案 0 :(得分:0)

对于第一个示例,关于为什么不必进行任何取消引用的原因,是我猜测编译器正在进行繁重的工作。可能发生的情况是,A[i][j]会将A值的副本作为新地址值增加j * sizeof(unsigned int *),然后将分配给它的地址存储在A [j] ,如以下事实所示:如果取消引用* A [i],则将在ith数组中获得第一个值。然后,它将使我们的地址指针的值增加j * sizeof(unsigned int)以获得您要查找的数字。

第二个示例不适合我编译。您也可以只做unsigned int A[n][m];

  unsigned int n = 10;
  unsigned int m = 15;
  double ** A = new double * [n];
  for(int i = 0; i < n; ++i) {
    A[i] = new double[m]{1, 2, 3, 4};
  }

  std::cout << A << "\t" << *A << std::endl;
  for(int j = 0; j < n; ++j) {
    std::cout << A[j] << "\t" << *A[j] << "\t" << A[j][0] << std::endl;
  }
  for(int j = 0; j < n; ++j) {
    delete(A[j]);
  }
  delete(A);

我希望这会有所帮助!