A ver es un poco lioso, de hecho a mi también me cuestan bastante los punteros dichosos.
En la línea:
lo que se hace es guardar en la variables b el valor de la memoria donde se empieza a guardar la variable "a" que es una matriz 2x6. Vamos a suponer que el valor de "b" es 4000.
(a==[2]x[6]; *a==4000; b=4000)
Bien, a la función "modificar" se le pasan dos datos: *a == 4000 y fil*col==2*6==12.
void modificar( int *a, int tamanio)
{
int j;
for(j = 0; j < tamanio; j++)
*(a+j) = j;
}
En la función se definen las posiciones de memoria que apuntarán al valor (a+j) es decir, se define *(a+j), y se define igualándolo a j.
(Si j=0 -> *(a+j)==*(4000+0)=0; Si j=1 -> *(a+j)==*(4000+1)=1; etc.)
for(int i = 0; i < fil*col; i++)
cout << *(b+i) << " ";
Al volver de la función hay otro bucle que en el que se mostrarán los valores de *(b+i) dónde como sabemos b=4000 y "i" irá desde 0 a 12 por lo que mostrará:
(Si i=0 -> *(b+i)==*(4000+0) --> 0; Si j=1 -> *(b+i)==*(4000+1) --> 1; etc. tal y como se había definido en la función modificar).
Espero haberte ayudado y si me he equivocado corrijanme así aprenderé yo también.
Un saludo!