use*_*092 48 c++ arrays pointers multidimensional-array
我有一个关于指向2d数组的指针的问题.如果数组是这样的
int a[2][3];
Run Code Online (Sandbox Code Playgroud)
那么,这是一个指向数组的指针a吗?
int (*p)[3] = a;
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,我想知道什么[3]意思int(*p)[3]?
cpx*_*cpx 38
int a[2][3];
Run Code Online (Sandbox Code Playgroud)
a被读作int的数组3的数组2,它只是一个数组数组.写的时候
int (*p)[3] = a;
它声明p为指向第一个元素的指针,该元素是一个数组.因此,p指向3个int的数组,它是数组数组的元素.
考虑这个例子:
int a[2][3]
+----+----+----+----+----+----+
| | | | | | |
+----+----+----+----+----+----+
\_____________/
|
|
|
p int (*p)[3]
Run Code Online (Sandbox Code Playgroud)
这里,p你的指针指向3个int的数组,它是数组数组的元素.
Aar*_*aid 36
int[2][3]您应该将其视为"数组数组",而不是将其称为"二维数组".它是一个包含两个项目的数组,其中每个项目本身就是一个包含3个int的数组.
int (*p)[3] = a;
Run Code Online (Sandbox Code Playgroud)
您可以使用p它指向两个项目中的任何一个a.p指向一个三int数组 - 即第一个这样的项.p+1会指向第二个三int数组.要初始化p以指向第二个元素,请使用:
int (*p)[3] = &(a[1]);
Run Code Online (Sandbox Code Playgroud)
以下是指向两个项目中第一个的等效方法.
int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
Run Code Online (Sandbox Code Playgroud)
严格地说,不,int (*p)[3] = a;不是指针a.它是指向第一个元素的指针a.第一个元素a是三个整数的数组.p是一个指向三个int数组的指针.
a因此将声明指向该数组的指针:
int (*q)[2][3] = &a;
Run Code Online (Sandbox Code Playgroud)
的数值p和q有可能(或者甚至要求是)相同,但它们是不同类型的.当您对p或执行算术运算时,这将发挥作用q.p+1指向数组的第二个元素a,同时q+1指向内存刚好超出数组的末尾a.
记住:cdecl是你的朋友:int a[2][3], int (*q)[2][3].
这[3]是该类型的一部分.在这种情况下,p是一个指向大小为3的数组的指针,该数组包含整数.
数组的特定类型总是包括它的大小,因此你有类型,int *[3]或者int *[5]不仅仅是int *[]具有未定义大小的类型.
int *x[20]; /* type of x is int *[20], not just int *[] */
int y[10][10]; /* type of y is int[10][10], not just int[][] */
Run Code Online (Sandbox Code Playgroud)