我对C有疑问
我应该创建一个由4个元素组成的静态数组tmp
,对于该数组的所有单元,我应该存储一个2x2矩阵。
我可以在没有指针的情况下执行此操作吗?
我尝试使用int[2][2] tmp[4]
,但遇到编译错误。
答案 0 :(得分:3)
我可以在没有指针的情况下这样做吗?
您至少可以避免这样做来显式定义指针:
定义2D int
矩阵类型:
typedef int M[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个int
,int(*)[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()