使用typedef数组声明一个数组

时间:2017-04-04 00:24:50

标签: c arrays

好的,我目前正在研究2D阵列,如果情况如此,我对二维阵列的尺寸感到困惑:

#define ROW 5
#define COL 10    

typedef int arrint[COL]

并在主函数中声明为:

arrint a2D[ROW]

是2D阵列a2D[5][10]还是a2D[10][5]

1 个答案:

答案 0 :(得分:4)

由于你已经宣布arrint为int [COL == 10],而a2D是其中5个的数组,所以你最终得到了相当于:

a2d[i][j]

Typedef可以使用,但最好将2D数组类型定义为2D数组以避免混淆。在C中,二维数组作为行主要存储在内存中。阅读this帖子以获得详细解释。阵列排列在存储器中,使得第一行首先出现,然后是第二行,依此类推。每行由COL元素组成,因此定义它的方法是:

#include <stdio.h>
#define ROW 5
#define COL 10    
typedef int A2D[ROW][COL];

int main(int argc, char** argv)
{
  A2D a2d = {0};
  int r,c;

  a2d[1][2] = 12;

  for(r=0; r<ROW; r++) 
  {
    printf("Row %d: ", r);
    for(c=0; c<COL; c++)
       printf("%2d ", a2d[r][c]);
    printf("\n");
  }
}

然后要访问第i行第j列的元素,请使用:

Row 0:  0  0  0  0  0  0  0  0  0  0 
Row 1:  0  0 12  0  0  0  0  0  0  0 
Row 2:  0  0  0  0  0  0  0  0  0  0 
Row 3:  0  0  0  0  0  0  0  0  0  0 
Row 4:  0  0  0  0  0  0  0  0  0  0 

以下是一个示例程序:

psql -v schema="$REDSHIFT_SCHEMA" -h "$REDSHIFT_HOSTNAME" -d "$REDSHIFT_DATABASE" -U "$REDSHIFT_USERNAME" -p "$REDSHIFT_PORT" -f "nulltest.sql" -v inputStartDateId=20170318 -v inputEndDateId=20170404

这会产生以下输出:

nulltest.sql