指向int数组的指针数组

时间:2012-01-02 19:46:28

标签: c multidimensional-array

经过大量的战斗后,我在像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;

4 个答案:

答案 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]。

相关问题