为什么在创建矩阵时使用" ** int A"而不是" int A" (c++)

Why use " ** int A" instead of " int A" when creating matrices (c++)

本文关键字:int c++ 创建 为什么      更新时间:2023-10-16

假设我有一个矩阵 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[0][0]访问A的值 - 为什么我不必在第一种情况下取消引用它,即**A[0][0]=1

对于第一个示例,关于为什么您不必进行任何取消引用,我猜编译器正在执行繁重的工作。可能发生的情况是,A[i][j]将 A 值的副本作为新地址值递增 j * sizeof(无符号 int *(,然后它将被分配存储在 A[j] 的地址,如以下事实所示:如果您取消引用 *A[i],您将获得第 i 个数组中的第一个值。然后,它将地址指针的值递增 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);

我希望这有帮助!