They are just a conveniece for giving names to values, not memory addresses. Functional languages generally have a much richer notion of data type, and in particular do automatic memory management for dynamic structures. Modern functional languages also support the notion of higher-order programming in which functions can be freely passed as parameters. In Logic Programming the model of computation is not. That is, in theory, when you write a logic program you are not describing a computation, but rather a set of properties of data and relationships that hold between different data.
Computation is just a side effect of proving some relationship holds.
Variables have the same semantics they have in logical expressions, as quantified names that stand in for members of some set. You still give instructions. But now, rather than thinking in terms of functions and procedures that do things to data, you think in terms of data which respond to requests to do things. We'll use this expresssion alot in distinguishing different languages. For instance, in C, the scalar types are first class, but most other types are second class citizens.