Most of what I\'ve read about the address operator, &, says it\'s used to get just that - an address. I recently heard it described differently, though, as
While you're right that the type of &i1 is int*, I think you're assigning too much weight to that idea. I wouldn't describe anything in C as "type-awareness" and there's definitely no "remembering that the data in that location is to be interpreted as type int". C types exist only at the source level and not after compilation.
This may be clearer in an example with union:
union something {
int a;
char b;
};
now if you have a variable x of type something, you can have &x.a of type int* and &x.b of type char*, but they're pointing at the same address.