Salida del programa C | Conjunto 23

Prediga la salida del siguiente programa C.

#include <stdio.h>
#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;
}

Salida: El programa compila bien y produce la siguiente salida:

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

A primera vista, la línea “mat++;” en modifyMatrix() parece inválido. Pero esta es una línea C válida ya que los parámetros de array son siempre punteros (ver this y this para más detalles). En modifyMatrix() , mat es solo un puntero que apunta a un bloque de tamaño C*sizeof(int) . Entonces, seguir el prototipo de función es lo mismo que «void modificar Matrix (int mat [] [C])»

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

Cuando hacemos mat++, mat comienza a apuntar a la siguiente fila y mat[1][1] comienza a referirse al valor 10. mat[1][1] (valor 10) se cambia a 100 por la instrucción “mat[1][ 1] = 100;” . mat se incrementa nuevamente y mat[1][1] (ahora el valor 14) se cambia a 200 por el siguiente par de declaraciones en modifyMatrix() .

La línea “mat[1][1] = 100;” es válido ya que la aritmética de punteros y la indexación de arrays son equivalentes en C.

En una nota al margen, no podemos hacer mat++ en main() ya que mat es una array 2D en main() , no un puntero.

Escriba comentarios si encuentra que la respuesta/explicación anterior es incorrecta, o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *