One of the side effects of legacy addressing is that we tend to think of memory addresses as devices, ie, timers, coils, etc, instead of what it really is, an address to a spot in contiguous memory and elements such as coils and timers are arbitrary and artificial. Memory itself is not divided or configured - elements are overlays provided by the programming software editor that help us manage memory - and take the guess work out of it. In many PLCs you still have to remember how many words you need to reserve after a particular address when you use if for a timer. File elements remove the guess work. Tags take it one step farther.
A tag is a pointer to a location in memory. Think of it like this: You tell your friend there will be a party at Bob's house. Bob's house has an address, a location on a street in a city, but you and your friend don't know the house number of Bob's house, but both of you do know where Bob's house is, so all you need to tell your friend is that the party is at Bob's house. A tag is kind of like that. Now suppose that Bob's house is a really big house and Bob has a pool and backyard basketball court. So now its Bob's mansion and the address actually consists of more than your typical 100' lot. House and Mansion give us an idea of how large Bob's place is, likewise a tag data type tells the compiler how large a chunk of memory is involved. However, we don't have to know exactly how many acres of land Bob's Mansion occupies. In Bob's place, we can designate parts of Bob's mansion, as in Bob's pool or Bob's tennis court. So you can be more specific: there will be a Bar-B-Que at Bob's deck and swimming at Bob's pool, ie BobsMansion.Deck and BobsMansion.Pool. You and your friend still don't need to know the street address of Bob's mansion to find Bob's pool and deck.
One more note about Tags verses Symbols. Tag names are stored in the PLC because they are an integral part of the program. Symbols are an external association, and do not exist in the PLC, they are not an integral part of the program. Therefore when you upload from a ControlLogix PLC you get the tag name, and if the programmer was kind enough to use a meaningful tag name its easy to decipher the program. You get no such luxury when you upload from a PLC5 or SLC500, all you get is the address with nothing to indicate what it is.