将int[][]赋值给int**
assign int[][] to int**
据我所知,在某些上下文中,数组被转换为指向其第一个元素的指针:
int a[5];
int * p;
p = a;
遵循这种方法,考虑到我可以将数组赋值给指针,为什么不能将二维数组赋值给指针呢?
int a[5][5];
int ** q;
q = a;
但是,可以将指针数组赋值给指针数组:
int * p[5];
int ** q;
q = p;
如果将数组转换为指向其第一个元素的指针,当第二个例子中q = a时,a应该是指向a[0]的指针,a[0]应该是指向a[0][0]的指针,对吗?
此外,如果我这样做,我不会得到错误:
cout << **a;
提前感谢,希望您能帮助我理解
问题是数组int a[5][5];
存储了25个连续的int
。
指向数组/指针的指针,如int **q;
,期望找到指向int
的连续指针数组。
这就是为什么你想做的任务是不可能的。
多维数组可以赋值给单个指针
int a[5][5];
int *p = a;
,因为内存是按行组织的单个块分配的。
a = a11 a12 a13
a21 a22 a23
a = a11 a12 a13 a21 a22 a23
为了更清楚,让我们考虑第一个例子
int a[5];
int * p;
p = a;
In可以这样重写
T a[5];
T * p;
p = a;
其中T是某种类型
C/c++中的二维数组是什么?它是一个数组元素,其元素又是一维数组。所以这个定义
int a[5][5];
可以重写为
T a[5];
其中T的类型为int[5]
还有
T a[5];
T * p;
p = a;
这里T是int[5]
所以p是指向int[5]
类型数组的指针类型必须定义为
int ( *p )[5];
p = a;
int ( * )[5]
和int **
是两个不同的类型。
对于这个代码
int * p[5];
int ** q;
q = p;
这里T是int *
所以p被定义为T *p
然后是int **p
对于多维数组,如果您想指向单个(标量)值,那么您应该使用以下声明:
int a[5][5];
int (*q)[5]; /* pointer to five-element array of basic type int */
q = a;
q[0][0]; /* equivalent to a[0][0] */
其中5
是"列"的大小(紧挨着最左边的"行"大小)。一般来说,对于更多的维度,记住规则是只有最左边的大小被替换为声明器的(*q)
部分。
事实上,当你写函数时,有多维数组参数,那么对于编译器来说,它被认为是上述形式,例如:
int foo(int a[5][5]) { ... }
被有效地替换为:
int foo(int (*a)[5]) { ... }
相关文章:
- cin >> int 给定一个字符串将 int 赋值为 0
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 赋值和添加运算符重载(2个表和int的串联)
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- 如何修复数组赋值从 ascii 值到 int
- 为什么SDL_QueryTexture不为其 int* 参数赋值?
- 不能为类中的 int 赋值
- 在没有初始化列表的情况下,在c++的headerfile中为const int赋值
- 错误:在 GEANY 中将"int"赋值为"char [1]"时类型不兼容
- 将int***赋值给int[][][]
- C++ int 赋值不起作用
- 如何将int赋值给具有字符串流的字符串
- 当我在C++中将临时int赋值给const引用时会发生什么
- 错误:将"int"赋值为"int[2]"时的类型不兼容
- 将const int赋值给指向int的const指针是非法的
- "无符号长整型"和'unsigned long long int'赋值问题
- 将int[][]赋值给int**
- 如果允许将int赋值给float(反之亦然),是否不类型安全?
- 不能将int赋值给返回类的int成员
- 在while循环中滥用cin进行int赋值