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