【问题标题】:Initializing random 2D matrix with pointers in C用C中的指针初始化随机二维矩阵
【发布时间】:2021-12-25 09:06:13
【问题描述】:

我希望我的矩阵如下所示:

1 2 3
X X X
X X X

当 X 为随机数时。

我尝试了以下方法:

void initMat(int *mat, int rows, int cols)
{
   *(mat + 0) = 1;
   *(mat + 1) = 2;
   *(mat + 2) = 3;
   for (int i = 0; i < rows * cols - 3; i++)
   {
       *(mat + 3) = rand() % 6;
       mat++;
   }
}

然后我调用函数:

 initMat((int *)startValues, 3, 3);

当我使用以下函数打印我的矩阵时:

void printMat(const int *mat, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%4d", *mat);
            mat++;
            printf(" ");
        }
        printf("\n");
    }
}

我得到了一些看起来像二维数组的东西,正如我真正想要的那样,例如:

startValues:
   1    2    3
   4    1    5
   4    4    5

但是当我尝试用(在同一个主目录中,在矩阵启动后)打印它时

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%4d", startValues[i][j]);
        }
        printf("\n");
    }

我明白了:

VALUES:

   1   2   3
   3   4   1
   1   5   2

为什么会这样?为什么值不同,有些看起来相同。我应该如何达到每个值?我也尝试使用公式:

m+ cols*i + j //(in my case startValues + 3*i+j in the last loop)

但是它给了我非常大的随机数,我不确定什么时候需要使用它来代替 mat[i][j]。

【问题讨论】:

  • 减一。请将i &lt;= rows * cols - 3;中的结束条件改为i &lt; rows * cols - 3;
  • @WeatherVane 已更改。
  • 旁白:请不要对发布的代码进行“交互式进度更新”。
  • 无法从包含您的 sn-ps 的“想象”代码中复制。请以文本形式发布Minimal Reproducible Example,最短的完整代码,显示您尝试过的内容。您是否将 incremented mat 传递给另一个函数?
  • @WeatherVane 这是我刚刚拆分解释的代码。增加垫子是什么意思?

标签: arrays c pointers matrix multidimensional-array


【解决方案1】:

我建议使用指向可变长度数组 (VLA) 的指针。它使代码更具可读性:

void initMat(int rows, int cols, int mat[static rows][cols])
{
   mat[0][1] = 1;
   mat[0][2] = 1;
   mat[0][3] = 1;

   for (int r = 1; r < rows; r++)
   for (int c = 0; c < cols; c++)
        mat[r][c] = rand() % 6;
}

【讨论】:

  • 我想以我尝试过的方式填充矩阵,并了解为什么它在每种打印方式中都会给我不同的结果。也许我会接受你的提议,但我仍然无法理解我的代码的输出。此外,你的函数给了我一个错误“a parameter is not allowedC/C++(411)”
  • @Ciniminis,您使用的是什么编译器,它是什么 C 标准?
  • @Ciniminis,如果不重现错误,则无法解决每次打印时观察到不同结果的问题。请准备一个显示这种行为的最小程序?或者至少告诉startValues 是如何声明的
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 2020-03-30
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多