【问题标题】:How to use a pointer (to a Matrix) as an argument in a Function in C?如何在 C 中的函数中使用指针(指向矩阵)作为参数?
【发布时间】:2021-08-11 03:44:50
【问题描述】:

我正在尝试用 C 语言编写一个对两个 4x4 矩阵求和的代码。 但我希望我的函数有一个指针作为我的参数。我得到的唯一错误是我试图在函数中总结的时间。有人可以帮我吗?

#include <stdio.h>
#include <locale.h>

int i = 0, j = 0;

void calc_soma(int* mat_A, int* mat_B, int* mat_C)
{
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            mat_C[i][j] = mat_A[i][j] + mat_B[i][j];
            printf("%d", mat_C[i][j]);
        }
    }
}

int main()
{
    setlocale(LC_ALL, "Portuguese");

    int i=0, j=0;
    int mA[4][4], mB[4][4], mC[4][4];
    int *mat_A, *mat_B, *mat_C;

    for(i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("Type in the value for Matrix A [%d][%d]: ", i, j);
            scanf_s("%d", &mA[i][j]);
        }
    }
    i, j = 0;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("Type in the value for Matrix B [%d][%d]: ", i, j);
            scanf_s("%d", &mB[i][j]);
        }
    }

    *mat_A = &mA;
    *mat_B = &mB;

    return 0;
}

【问题讨论】:

  • 关于:i, j = 0; i 中的值在此声明中未更新。建议:i=0; j = 0;

标签: c function matrix multidimensional-array arguments


【解决方案1】:

参数的指针类型错误。您想要传递(指向第一个元素的指针)数组,例如 int mA[4][4];,因此它们应该是指向 int[4] 的指针。

void calc_soma(int (*mat_A)[4], int (*mat_B)[4], int (*mat_C)[4])
{
    /* same as original */
}

它们可以简单地写成这样:

void calc_soma(int mat_A[][4], int mat_B[][4], int mat_C[][4])
{
    /* same as original */
}

那么函数可以这样调用:

calc_soma(mA, mB, mC);

mat_Amat_B 的用途尚不清楚,但如果你想获得指向&amp;mA 这样的矩阵的指针,则应该是int(*)[4][4]。请注意,取消引用(如*mat_A)未初始化的指针将调用未定义的行为

int main()
{
    setlocale(LC_ALL, "Portuguese");

    int i=0, j=0;
    int mA[4][4], mB[4][4], mC[4][4];
    int (*mat_A)[4][4], (*mat_B)[4][4], (*mat_C)[4][4];

    /* omit */

    mat_A = &mA;
    mat_B = &mB;

    return 0;
}

使用类似的功能

void calc_soma(int* mat_A, int* mat_B, int* mat_C)

你应该用一维数组来表达矩阵以匹配格式。会是这样的:

#include <stdio.h>
#include <locale.h>

#define ROWS 4
#define COLS 4

int i = 0, j = 0;

void calc_soma(int* mat_A, int* mat_B, int* mat_C)
{
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            mat_C[i * COLS + j] = mat_A[i * COLS + j] + mat_B[i * COLS + j];
            printf("%d", mat_C[i * COLS + j]);
        }
    }
}

int main()
{
    setlocale(LC_ALL, "Portuguese");

    int i=0, j=0;
    int mA[ROWS * COLS], mB[ROWS * COLS], mC[ROWS * COLS];

    for(i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            printf("Type in the value for Matrix A [%d][%d]: ", i, j);
            scanf_s("%d", &mA[i * COLS + j]);
        }
    }
    i, j = 0;
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            printf("Type in the value for Matrix B [%d][%d]: ", i, j);
            scanf_s("%d", &mB[i * COLS + j]);
        }
    }

    calc_soma(mA, mB, mC);

    return 0;
}

【讨论】:

  • 非常感谢您的回答!我正在为大学工作,我必须使用 void calc_soma(int *mat_A, int *mat_B, int *mat_C) 作为我的函数的开始,否则我会按照你的方式做。但我很难像教授要求的那样使用它!
  • @SamuelPereira 已更新。
  • 非常感谢!!非常感谢!!你介意向我解释一下为什么它现在可以工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2011-07-11
相关资源
最近更新 更多