You construct a pointer to that address and dereference it. The idiom is *(volatile uint32_t *)0x48000014u, cast the literal address to a pointer to a volatile 32-bit unsigned, then dereference to read or write the register. The volatile is essential: it tells the compiler the value can change outside the program's control (hardware updates it) and that writes have side effects, so it must perform every access exactly as written and never cache or elide them. You typically wrap this in a macro or a register-overlay struct. Getting the type width right (uint32_t vs uint8_t) matters because it determines the access size on the bus, which some peripherals are strict about.
C Programming · Interview question
On a microcontroller, how do you read or write a hardware register at a known address?
A strong answer
What a weak answer sounds like
You know the answer. Do you know what gets you dinged?
Pro breaks down the answer most candidates actually give to this question — and the specific reason an interviewer marks it down. It’s the difference between sounding correct and sounding senior, on all 472 questions.
From the lesson
Pointers & Addresses
A pointer is just a variable that holds an address. Master & and *, NULL, and how passing a pointer lets a function reach back and modify the caller's data.