经过大量的战斗后,我在像A [2] [3]这样的声明中想出来,A是与 int(*)[3] 兼容的类型。我的理解是A可以用来指向前三个元素,A + 1指向下三个元素。 有什么办法可以声明一个指向数组的指针数组。
ptr_array
+----+ +----+----+----+
| | ----> | | | |
| | | 24 | 25 | 26 |
+----+ +----+----+----+
| | | 44 | 45 | 46 |
| | ----> | | | |
+----+ +----+----+----+
Array of pointers two dimensional array of three integers
to array of 3
如何声明ptr_array,以便
ptr_array[0] = A;
和
ptr_array[1] = A + 1;
答案 0 :(得分:5)
C中的多维数组是数组的数组。 n维阵列的元素是(n-1)维阵列。例如,A[0]
是int [3]
。
A: |24|25|26|44|45|46| A[0]: |24|25|26| A[1]: |44|45|46|
在某些上下文中,数组被转换为指向数组第一个元素的指针,但数组本身不是指针。
根据C标准,§6.5.2.1-3:
3个连续的下标运算符指定多维数组对象的元素。如果 E 是维度为i×j×...×k的n维数组(n≥2),那么 E (用作除左值以外)是转换为指向尺寸为j×的(n-1)维数组的指针。 。 。 ×k。如果将unary *运算符显式地应用于此指针,或者作为预订的结果隐式应用,则结果是指向的(n-1)维数组,如果用作除左值之外的其他数据本身将被转换为指针。由此得出,数组以行主要顺序存储(最后一个下标变化最快)。
4示例考虑声明
定义的数组对象int x[3][5];
这里x是3×5的整数数组;更确切地说,x是一个由三个元素对象组成的数组,每个元素对象是一个由五个整数组成的数组。在表达式
x[i]
中,它等同于(*((x)+(i)))
,x首先转换为指向五个整数的初始数组的指针。然后根据x的类型调整i,这在概念上需要将i乘以指针所指向的对象的大小,即五个int对象的数组。添加结果并应用间接以产生五个整数的数组。当在表达式x[i][j]
中使用时,该数组又转换为指向第一个int的指针,因此x[i][j]
产生一个int。
如图所示创建ptr_array
:
int (*ptr_array[2])[3]
ptr_array[0] = A;
ptr_array[1] = A+1;
// or:
ptr_array[0] = &A[0];
ptr_array[1] = &A[1];
// or even:
ptr_array[0] = (int(*)[3])A[0];
ptr_array[1] = (int(*)[3])A[1];
// though this last shouldn't be used in production code
以下是如何制定声明。从图中可以看出,ptr_array是一个大小为2的数组。
... ptr_array[2] ...
数组的元素是指针
*ptr_array[2]
到大小为3的数组
(*ptr_array[2])[3]
of thets
int (*ptr_array[2])[3]
如果您一直不确定如何声明这样的内容,可以使用cdecl:
cdecl> declare ptr_array as array 2 of pointer to array 3 of int int (*ptr_array[2])[3]
您可以在开发计算机上安装命令行版本的cdecl(如果尚未安装)。确切的方法取决于平台。检查文档和Web。
答案 1 :(得分:2)
在
int A[2][3]
之类的声明中,A
是指向数组3的指针,表示A
的类型为int(*)[3]
没有。 A
是一个数组,而不是指针。它的类型为int [2][3]
。
如何声明ptr_array,以便
ptr_array[0] = A;
和
ptr_array[1] = A + 1;
如果A+1
表示“第二个长度为3的数组”,那么您只需要这样做:
int (*ptr_array)[3] = A;
数组衰减,在大多数情况下成为指向其第一个元素的指针。我建议阅读关于数组和指针的C FAQ:http://c-faq.com/aryptr/index.html。
答案 2 :(得分:-1)
是。你可以声明一个数组是你喜欢的。
您的声明
int A[2][3];
定义了一个二维的int数组,大小为2x3。 A[0]
是指向 3个整数数组的开头的指针,A[1]
也是如此。 A[0][0]
是第一个数组中的第一个元素。 A[1][2]
是最后一个数组的最后一个元素。
答案 3 :(得分:-1)
A [2] [3]更像是一个数组而不是一个指针。只有一些情况下你可以将数组视为指针。 A是一个6个整数的数组。 A是整数数组类型。
您可以将 ptr_array [0]声明为A [0],将ptr_array声明为A [1]。