gpt4 book ai didi

c - 如何创建矩阵的静态数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:24 27 4
gpt4 key购买 nike

我对 C 有疑问。

我应该创建一个包含 4 个元素的静态数组 tmp,并且我应该为这个数组的所有单元格存储一个 2x2 矩阵。

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

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

最佳答案

Can I do this without pointers?

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

  1. 定义二维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 个 int 组成的数组的指针,一个 int(*)[2].

另外这个电话

  matrix_set(a[i]);

传递一个M类型的变量,它是一个int的2x2数组,一个int[2][2],它实际上是一个由 2 个元素组成的数组,类型为 int[2] 的 2 个 int 数组。

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

类型为 array of 2 int 的 2 元素数组的第一个元素是 2 int 的数组。指向后者的指针是 int(*)[2] 类型,这正是 matrix_set()matrix_print()< 两个函数的指针类型 expect,如上所述。

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

#include <stdio.h>

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

#define ARRAY_SIZE (4)

int matrix_set(int (*m)[MATRIX_COLUMNS])
{
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(int (*m)[MATRIX_COLUMNS])
{
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)
{
int a[ARRAY_SIZE][MATRIX_ROWS][MATRIX_COLUMNS];

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 - 如何创建矩阵的静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56207123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com