Each register has its address. This is a 32-bit mcu so registers' addresses tend to be 4 bytes apart, even if they don't occupy the full 32 bits. You calculate the registers' address by adding the peripheral's address to the offset.
But this in fact is not very important in practice. There is a header file for each STM32, for example for 'L476 this. You normally #include this file indirectly, through #include "stm32l4xx.h" - this assumes you have set properly the include paths and also added a -DSTM32L476xx switch to the command line when calling compiler - IDEs do this for you automagically.
The device-specific header file (look into it) contains both the peripherals' addresses, and also structs which in fact express the registers' offset. So, for programming, you don't need to know the address nor calculate it, for example to read out the LPTIM1's CNT register into variable "count" you simply write:
count = LPTIM1->CNT;
JW