Pregunta adicional con la interfaz asignada de memoria

Todavía tengo algunos problemas con mi código c que trata con un dispositivo mapeado de memoria. En este momento declaro el espacio de direcciones para los registros que escribo como puntero volátil y les escribo datos como se muestra a continuación:

volatile unsigned int *wr_register = (int *) 0x40000000;
volatile unsigned int *c_register =  (int *) 0x40000100;
...

main{

  *wr_register = 0x01234567;

  *c_register = 0x01234567;    
  *(c_register+1) = 0x89abcdef;  

}

Esto funciona más o menos bien. Sin embargo, me gustaría tener funciones específicas de lectura y escritura que interactúen con los registros mapeados en memoria. Entonces, idealmente, se vería así:

const unsigned int wr_register = 0x40000000;
const unsigned int c_register  = 0x40000100;

function write_REG(unsigned int address, int offset, int data)
{
    (unsigned int*) (address + offset) = data;
}

main{

  *write_REG(0x40000000, 0, 0x01234567);

  *write_REG(0x40000100, 0, 0x01234567);
  *write_REG(0x40000100, 1, 0x89abcdef);  

}

No lo he probado aún para ser honesto, pero me pregunto si alguien podría decirme si esta es una forma adecuada de hacerlo.

EDITAR: Tal vez sea útil para otra persona, aquí tengo mi función y parece que funcionan. ¡Muchas gracias por los útiles comentarios!

void reg_write(unsigned int address, int offset, int data)
{
    *((volatile unsigned int*)address + offset) = data;
}

int reg_read(unsigned int address, int offset)
{
    return(*((volatile unsigned int*)address + offset));
}   

Muchas gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta