C,使用指针扫描和打印Matrix

时间:2016-01-14 13:39:52

标签: c loops pointers matrix scanf

void input(int (*a)[3]){

    int i, j;
    for(i = 0; i < 3; i++){
        a += i;
        for(j = 0; j < 3; j++)
            scanf("%d",*a+j);

    }
}

void print_matrix(int (*a)[3]){

    int i, j;
    for(i = 0; i < 3; i++){
        a += i;
        for(j = 0; j < 3; j++)
            printf("%d ",*(*a+j));
        printf("\n");
    }

    putchar('\n');
}

int main(){

    int matrix[3][3];
    input(matrix);

    printf("Printing matrix using function: \n");
    print_matrix(matrix);


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

如果我输入这样的矩阵:

  

1 1 1

     

2 2 2

     

3 3 3

使用功能打印矩阵可产生正确的输出:1 1 1 2 2 2 3 3 3.

但是使用两个循环打印矩阵会产生如下输出:

  

1 1 1

     

2 2 2

     

-5555 0 -22222

所以我显然有一些错误,但我无法弄清楚在哪里。这里我不明白为什么这对于矩阵中的第三行不起作用。

注意:我知道这可以在不使用指针和函数的情况下完成,但这不是重点,我想完全像这样做,只是无法弄清楚我做了什么错。

2 个答案:

答案 0 :(得分:4)

a += i;a += 1;两个函数中将void input(int (*a)[3])替换为void print_matrix(int (*a)[3])

原因是当我2岁时它走出界限。你正在加2。

此外,在第二个for循环后移动a += 1

答案 1 :(得分:2)

问题在于你如何操纵ainput中的print_matrix

input

    a += i;     // problem is here
    for(j = 0; j < 3; j++)
        scanf("%d",*a+j);

在第一次迭代中,a很好,因为添加了0。它在第二行也很好,因为添加了1以将其移动到下一行。但是在第三个方面,它增加2,将其移出矩阵的边界。

您可以简单地将a += i替换为a++,但如果您这样做,那么您将从应该的位置开始向下写一行。

a += i替换为a++的示例输出:

[dbush] /tmp/x1
1 1 1
2 2 2
3 3 3
Printing matrix using function:
1 1 1
2 2 2
3 3 3

0 0 -668873792
1 1 1
2 2 2

要使其正常工作,请将a++移至外部for循环的底部。

input

for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++)
        scanf("%d",*a+j);
    a++;
}

print_matrix

for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++)
        printf("%d ",*(*a+j));
    printf("\n");
    a++;
}