为什么在创建矩阵时使用" ** int A"而不是" int A" (c++)
Why use " ** int A" instead of " int A" when creating matrices (c++)
假设我有一个矩阵 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);
我希望这有帮助!
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)