Tenemos creado en memoria (con malloc) esté array dinámico cuyos elementos son de tipo enteros:
El proceso de creación ha sido... asignamos memoria para un vector de punteros a enteros... algo así como:
 
int **pam = (int **)malloc(2 * sizeof(int *));
 
 
y luego asignamos memoria para cada fila del array:
 
for (i = 0; i < 2; i++) {
    pam[i] = (int *)malloc(2 * sizeof(int));
 
 
también hay una variable tipo estructura cuya definición es:
 
typedef struct matriz
{
    int filas;
    int columnas;
    int **pmatriz;
}tmatriz;
tmatriz var1;
 
 
esta estructura tiene los datos de la matriz dinámica que se ha creado. 
si tenemos un puntero que apunta a var1...
podemos saber las filas del array haciendo por ejemplo...
 
printf("%d", pvar1->filas));
 
pvar1->pmatriz apuntaría a pam
 
 
Entonces, si quiero leer datos de la matriz podría hacer un bucle así:
 
for( i = 0; i < pvar1->filas; i++) {
    for(j = 0; j < pvar1->columnas; j++) {
        printf("%d", pvar1->pmatriz[i][j]);
        
 
Pero si quiero introducir datos nuevos en mi matriz dinamica, a la hora de leer con:   
 scanf("%d", pvar1->&matriz[i][j]);
 
     El compilador se queja 
 lo que he hecho es declarar una nueva variable de tipo puntero a puntero a entero y que
 contenga la dirección de memoria de pvar1->pmatriz, y luego meter los datos usando esa nueva variable
 evitando tener que usar la notación con la estructura. Es decir, algo así: 
 
 int **pmat2 = pvar1->pmatriz;
 
 
 y Luego ya puedo hacer esto  
scanf("%d", &pmat2[i][j]);
 
   Mi duda es como hacerlo de la primera forma, es decir así: 
scanf("%d", pvar1->&matriz[i][j]);
 
 pero correctamente claro xD 
 Perdón por el rollo; espero que se entienda algo jaja 
 Gracias anticipadas!