¿Es malo referirse a los elementos de la matriz de acceso mediante la aritmética de punteros en lugar del operador []?

12

Acabo de comenzar a aprender a programar en C y, para mejorar mi comprensión de los punteros y las matrices, traté de referirme a los elementos de una matriz sin crear ningún puntero:

for(k1 = 0; k1 < ROW; k1++){
    for(k2 = 0; k2 < COLUMN; k2++){

        array[k1][k2] = k1*COLUMN + k2 + 1;

        printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));

    }
}

El código completo se compila y ejecuta sin problemas.

Me imagino que tener que crear un puntero para cada matriz en un gran código fuente parece ser altamente ineficiente.

Entonces, en lugar de tener la dirección de una matriz almacenada y recuperada mediante un puntero, ¿es una mala práctica de programación usar la dirección de la matriz directamente, como se muestra arriba?

    
pregunta Niko Gambt 22.12.2015 - 15:59

3 respuestas

15

Es "malo" solo en la medida en que sea menos legible. a[x] es lo mismo que *(a+x) , por lo que no hay diferencia en la eficiencia o el comportamiento (de hecho, x[a] también funcionará). Es solo que a[x] suele ser mucho más intuitivo para nosotros, los humanos.

Pero eso no quiere decir que la legibilidad no sea un gran problema. Para ver qué tan grande, piensa en cómo "leerías" estas dos expresiones si las vieras en el código:

  • *(a+x) ="La cosa señalada por la suma del puntero a y el entero x "
  • a[x] ="El x th miembro de la matriz a "

De manera similar, cuando necesita referirse a la dirección de un elemento de matriz:

  • (a+x) ="La suma del puntero a y entero x "
  • &a[x] ="La dirección del x th miembro de la matriz a "

La mayoría de las veces, las versiones [] son más fáciles de entender cuando se está viendo un código no trivial que opera en varias matrices diferentes (especialmente matrices de matrices). Es por eso que el operador [] existe en primer lugar.

P.S. Hacer este tipo de cosas estrictamente como un ejercicio de aprendizaje es una muy buena idea. Es importante entender que las matrices realmente son solo punteros y compensaciones.

    
respondido por el Ixrec 22.12.2015 - 16:30
4

Sí, es una mala práctica, pero no por razones de ineficiencia.

El operador de la matriz usa aritmética de punteros debajo del capó, para que sean igualmente eficientes.

El problema con la aritmética del puntero es que es muy propenso a errores y más difícil de leer.

Regla de oro: no uses el puntero aritmético a menos que tengas que hacerlo.

    
respondido por el user694733 22.12.2015 - 16:07
0

Enfría tu aprendizaje c, acabas de descubrir uno de los pequeños trabalenguas. No estás haciendo aritmética de punteros en una matriz, sino una matriz de punteros. No es posible hacer aritmética de punteros en matrices. Una matriz se desintegra a un puntero, pero no es un puntero que se escribe a sí mismo. Lo que tienes (ver comentario de cmaster) es

int *array[]; //This is a array to pointers of type *int. 

array[k1] + k2; //This is pointer arithmetic on one pointer stored in the array  

Al quitar la referencia a este puntero, se obtiene el valor del puntero que acaba de calcular. En general, no tiene sentido hacer lo que está haciendo. Pero puedes linealizar la matriz y luego dar un paso en ella, así.

int array[y_dim*x_dim]; 
int index = x_dim*y + x; 
array[index]; //Gives you the element in x, y!

Stride ella es x_dim. Espero que mi respuesta sea clarificante!

    
respondido por el fhtuft 22.01.2016 - 17:39

Lea otras preguntas en las etiquetas