La utilización de punteros como base de matrices sigue el mismo principio que sobre vectores, pero hay que tener en cuenta que el desplazamiento del índice de filas debe ir multiplicado por número de elementos que hay en cada columna (sin embargo, ahora tampoco es necesario multiplicar el desplazamiento total por el tamaño de los elementos).

Ejemplo: Implementaremos el algoritmo que pone a cero todos los elementos de una matriz de 9 x 6 enteros largos (4 bytes por elemento).

#define N_Fil 9 
#define N_Col 6 

long ml[N_Fil][N_Col]; 
int i, j; 

for(i = 0; i < N_Fil; i++) { 
   for(j = 0; j < N_Col; j++) {
      ml[i][j] = 0;
   }
}

Podemos sustituir el acceso a los elementos ml[i][j] mediante el uso del puntero pl, y el cálculo correspondiente al desplazamiento del elemento en función de los índices.

Ejemplo: Acceso a matrices mediante punteros y desplazamientos.

#define N_Fil 9 
#define N_Col 6 

void main(void) { 
   long ml[N_Fil][N_Col]; 
   int i, j; 
   long *pl = ml; 
   for(i = 0; i < N_Fil; i++) {
      for(j = 0; j < N_Col; j++) {
         *(pl + i*N_Col + j) = 0; 
      }
   }
} 

También se puede escoger una representación de tipo matriz para los punteros, es decir:

*(pl + y*N_Col + j) = 0; <=> pl[i][j] = 0;

La pregunta que se plantea es por qué utilizar punteros si obtenemos el mismo resultado que con las tablas. La respuesta es que se permite un mecanismo muy ligado a las posibilidades de Lenguajes Máquina. Es decir, los accesos con punteros corresponden a modos de direccionamiento, y por tanto, se puede hacer una programación más óptima si se piensa en estos términos. Por ejemplo, para inicializar una matriz toda a ceros, cuyos elementos sabemos que están almacenados consecutivamente, podríamos implementar la inicialización como un solo bucle, de la siguiente forma:

for(i=0; i < N_Fil*N_Col; i++) *(pl + i) = 0; 

Yendo un poco más allá, podemos implementar el acceso con modo de direccionamiento registro indirecto autoincrementado, en vez de registro base más desplazamiento:

for(i=0; i < N_Fil*N_Col; i++, pl++) *pl = 0; 

Pin It