When you declare a variable, a memory zone is reserved and an identifier is associated with that memory zone, like
int nNumber;
Behind the curtains, there are no identifier names, just addresses of memory, each one with an allocated fixed size. This
int &memstart = start;
is valid (if you avoid declaring "
memstart" before). But here you don't allocate for "
memstart" a new memory. You just assign a new identifier (the "
memstart") for the existing previously-allocated memory zone which have already a memory-identifier binding with identifier "
start". That ampersand unary operator is telling "declare a new identifier for that given memory zone". After the declaration, each identifier represent the same address. When you address either of them, you address just one common memory zone. After initialization, the unary ampersand operator answers,
just answers the address of the identifier. It doesn't change an address of a previously-declared identifier. That is why
&memstart += 1;
won't work. If you want the dynamic functionality of addressing a different memory zone, you have to use pointers. This is what pointers do. When you declare:
int* pIntNumber;
you declare as with any other identifier declaration (except for the ones declared through reference like said above), a zone of memory and associate the "
pIntNumber" identifier with it. But in this memory you write only addresses of other memory zones. These things are explained in the tutorial:
http://www.cplusplus.com/doc/tutorial/pointers/
Having a declared pointer means that you write an address at one time, then if needed, write another address, and so on. The "
pIntNumber" is representing (like other identifiers) an unchangeable zone of memory that holds a changeable value representing someone else's address of memory. That is why you use pointers when needing to address different memory zones. If you'll have troubles understanding the pointers after reading the tutorial, I'll try to help you in a mode detailed manner.