📜  C程序的输出| 23套

📅  最后修改于: 2022-05-13 01:56:10.976000             🧑  作者: Mango

C程序的输出| 23套

预测以下 C 程序的输出。

#include 
#define R 4
#define C 4
  
void modifyMatrix(int mat[][C])
{
   mat++;
   mat[1][1] = 100;
   mat++;
   mat[1][1] = 200;
}
  
void printMatrix(int mat[][C])
{
    int i, j;
    for (i = 0; i < R; i++)
    {
        for (j = 0; j < C; j++)
            printf("%3d ", mat[i][j]);
        printf("\n");
    }
}
  
int main()
{
    int mat[R][C] = { {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };
    printf("Original Matrix \n");
    printMatrix(mat);
  
    modifyMatrix(mat);
  
    printf("Matrix after modification \n");
    printMatrix(mat);
  
    return 0;
}

输出:程序编译良好并产生以下输出:

Original Matrix
  1   2   3   4
  5   6   7   8
  9  10  11  12
 13  14  15  16
Matrix after modification
  1   2   3   4
  5   6   7   8
  9 100  11  12
 13 200  15  16

乍一看, “mat++;”行modifyMatrix() 中似乎无效。但这是一个有效的 C 行,因为数组参数始终是指针(有关详细信息,请参阅此和此)。在modifyMatrix() 中mat只是一个指向大小为C*sizeof(int) 的块的指针。所以下面的函数原型与“void modifyMatrix(int mat[][C])”相同

void modifyMatrix(int (*mat)[C]);

当我们执行mat++ 时,mat开始指向下一行,并且mat[1][1]开始引用值10。mat[1][1] (值 10)被语句“mat[1][ 1] = 100;” . mat再次递增,并且mat[1][1] (现在值为 14)被modifyMatrix() 中的下几个语句更改为 200。

“mat[1][1] = 100;”这一行有效,因为指针算术和数组索引在 C 中是等效的。

在一个侧面说明,我们不能做在main()作为是在主(2 d阵列),而不是一个指针垫++。