a memory location and addressability
A memory location is one specific spot in memory where a value lives — one box, or a run of neighbouring boxes that together hold one object. Addressability is the simple fact that such a spot has an address you can name: you can point at it, take its address, and come back to it later.
Every object in C — a variable, an array element, a field of a struct — occupies a definite location while it is alive, and that location has a starting address. The smallest addressable unit is one byte: you can name byte 0x1000 but not 'the third bit of byte 0x1000' directly. A larger object like a double sits at one starting address and spans several consecutive bytes from there. Some things are deliberately NOT addressable: a value held only in a CPU register, or a variable the compiler optimised away, has no stable address, and the C bit-field is the classic almost-addressable case — you can read and write it but cannot take its address with &.
Addressability is the bridge from 'a value' to 'a pointer to that value'. The whole machinery of & and *, of arrays and the stack and the heap, rests on the assumption that things in memory have locations you can refer to by number and revisit.
struct point { int x, y; } p; here p has a location, and so does p.y at a known offset inside it; &p.y is valid. But for struct { unsigned flag : 1; } b; the bit-field b.flag has no address — &b.flag is a compile error.
Most objects are addressable; a bit-field is the notable exception.
Having a location while alive is not the same as keeping it: a local variable's location is reused once its scope ends, so an address that was valid a moment ago can become a dangling pointer. Addressability is about 'can be named', not 'stays valid forever'.