所以假设我有一个矩阵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
,我不必取消引用?
答案 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);
我希望这会有所帮助!