如何创建矩阵的静态数组

时间:2019-05-19 11:00:31

标签: c arrays static

我对C有疑问

我应该创建一个由4个元素组成的静态数组tmp,对于该数组的所有单元,我应该存储一个2x2矩阵。

我可以在没有指针的情况下执行此操作吗?

我尝试使用int[2][2] tmp[4],但遇到编译错误。

1 个答案:

答案 0 :(得分:3)

  

我可以在没有指针的情况下这样做吗?

您至少可以避免这样做来显式定义指针:

  1. 定义2D int矩阵类型:

    typedef int M[2][2];
    
  2. 定义后者的一维数组类型:

    typedef M A[4];
    

使用这些类型的示例如下:

#include <stdio.h>

#define MATRIX_ROWS (2)
#define MATRIX_COLUMNS (2)

typedef int M[MATRIX_ROWS][MATRIX_COLUMNS];

#define ARRAY_SIZE (4)

typedef M A[ARRAY_SIZE];

int matrix_set(M m)
{
  for (size_t i = 0; i < MATRIX_ROWS; ++i)
  {
    for (size_t j = 0; j < MATRIX_COLUMNS; ++j)
    {
      m[i][j] = (int) ((i+1)*(j+1));
    }
  }

  return 0;
}

int matrix_print(M m)
{
  for (size_t i = 0; i < MATRIX_ROWS; ++i)
  {
    for (size_t j = 0; j < MATRIX_COLUMNS; ++j)
    {
      printf("m[%zu][%zu] = %d\n", i, j, m[i][j]);
    }
  }

  return 0;
}

int main(void)
{
  A a;

  for (size_t i = 0; i < ARRAY_SIZE; ++i)
  {
    printf("setting a[%zu]:\n", i);
    matrix_set(a[i]);
  }

  for (size_t i = 0; i < ARRAY_SIZE; ++i)
  {
    printf("printing a[%zu]:\n", i);
    matrix_print(a[i]);
  }
}

请注意,在C语言下确实在此处使用指针作为此函数声明:

int matrix_set(M m);

实际上是

int matrix_set(int m[2][2]);

等效于

int matrix_set(int (*m)[2]);

因此,尽管不明显,m 指针,即指向2个intint(*)[2]数组的指针。

此通话

  matrix_set(a[i]);

传递类型为M的变量,该变量是int的2x2数组,是int[2][2],实际上是2型数组的两个元素的数组{{ 1}},其中int

如果在C语言中将数组传递给函数,则会将其衰减为指向其第一个元素地址的指针。

由2 int[2]类型的2个元素组成的数组的第一个元素是2 int的数组。指向后者的指针的类型为int,正好是上述两个函数int(*)[2]matrix_set()所期望的指针类型。

因此,编写上述示例的另一种方法,也许是更纯粹的,但等效的方法是:

matrix_print()