首页 > 解决方案 > 我在通过函数访问二维数组时遇到问题

问题描述

我正在学习指针,我编写这些代码以通过函数添加两个 martix,它编译良好并为 2x2 矩阵提供正确答案,但是对于超过两行和 col,当我尝试使用 3x3 矩阵 [0][0] 元素时它失败了对于第一个矩阵,它自动变为 6,而 [1][0] 每次都变为 9,我不知道为什么会发生这种情况

#include <stdio.h>
//-----------------Function------------------
void add(int (*p1)[10], int (*p2)[10], int (*p3)[10], int r, int c);
void get(int (*p1)[10], int r, int c);
void print(int (*p1)[10], int r, int c);

//---------------Main Program----------------
int main()
{
    //declartion
    int i, j, r, c;
    printf("\n\tenter the row and column of matrix\n\t");
    scanf("%d %d", &r, &c);
    int m1[r][c], m2[r][c], m3[r][c];
    printf("\n\tenter the element of first matrix\n\t");
    get(m1, r, c);
    print(m1, r, c);
    printf("\n\tenter the element of second matrix\n\t");
    get(m2, r, c);
    print(m2, r, c);
    add(m1, m2, m3, r, c);
    printf("\n");
    print(m3, r, c);
    return(0);
}
//-------------Define Function---------------
//get()
void get(int (*p1)[10], int r, int c)
{
    int i, j;
    for(i = 0; i < r; i++)
    {
        printf("\n\t");
        for(j = 0; j < c; j++)
        {
            scanf("%d", (*(p1+i)+j));
        }
    }
}
//--------------------X----------------------
//add()
void add(int (*p1)[10], int (*p2)[10], int (*p3)[10], int r, int c)
{
    int i, j;
    for(i = 0; i < r; i++)
    {
        for(j = 0; j < c; j++)
        {
            //printf("\n%d %d = %d & %d", i, j, *(*(p1+i)+j), *(*(p2+i)+j));
            *(*(p3+i)+j) = *(*(p1+i)+j) + *(*(p2+i)+j);
        }
    }
}
//--------------------X----------------------
//print()
void print(int (*p1)[10], int r, int c)
{
    int i, j;
    for(i = 0; i < r; i++)
    {
        printf("\n");
        for (j = 0; j < c; j++)
        {
            printf("\t%d", *(*(p1+i)+j));
        }
    }
}
//--------------------X----------------------

标签: c

解决方案


  • 删除数组指针符号和固定大小。根据参数使用可变长度数组。
  • 删除无用的评论,如// get...void get...
  • *(arr+i)当您可以编写 readable 时,不要使用不可读的取消引用arr[i]
  • 在每行之后打印新行,而不是在每行之前。

这是一个编译的清理程序。我没有测试过。

#include <stdio.h>

void add   (int r, int c, int p1[r][c], int p2[r][c], int p3[r][c]);
void get   (int r, int c, int p1[r][c]);
void print (int r, int c, int p1[r][c]);

int main (void)
{
    int i, j, r, c;
    printf("\n\tenter the row and column of matrix\n\t");
    scanf("%d %d", &r, &c);
    int m1[r][c], m2[r][c], m3[r][c];
    printf("\n\tenter the element of first matrix\n\t");
    get(r, c, m1);
    print(r, c, m1);
    printf("\n\tenter the element of second matrix\n\t");
    get(r, c, m2);
    print(r, c, m2);
    add(r, c, m1, m2, m3);
    printf("\n");
    print(r, c, m3);
    return(0);
}

void get (int r, int c, int p1[r][c])
{
    for(int i = 0; i < r; i++)
    {
        for(int j = 0; j < c; j++)
        {
            scanf("%d", &p1[i][j]);
        }
    }
}

void add (int r, int c, int p1[r][c], int p2[r][c], int p3[r][c])
{
    for(int i = 0; i < r; i++)
    {
        for(int j = 0; j < c; j++)
        {
            p3[i][j] = p1[i][j] + p2[i][j];
        }
    }
}

void print (int r, int c, int p1[r][c])
{
    for(int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            printf("\t%d", p1[i][j]);
        }
        printf("\n");
    }
}

推荐阅读