Witam.
W pierwszym pytaniu po części masz rację, a po części nie. Zmienna ma odrazu swój adres w pamięci, a operator & tylko daje ci do dostęp do wartości tego adresu. Prawda jest taka, że kompilator miejsca odwołań do pamięci wstawi odwołania do adresów używając wskaźników, ale nie muszą to być odwołania absolutne. Procesor (x86) zazwyczaj obsługuje odwoływania się do pamięci względem czegoś, a odwołanie absolutne (pod konkretny adres) jest tylko szczególnym przypadkiem. Po dokładniejszy opis możliwych odwołań patrz Pierwszy Tom Dokumentacji Intela rozdział "Specifying an Offset" (3.7.5). Tam, gdzie w kodzie masz operator &, tam kompilator poprostu wstawi obliczony adres, przez który odwoływał by się do zmiennej. Zauważ też, że wyrażenie
something = &&var;
nie ma sensu.
Jednak to system zarządza pamięcią i to on może ci przydzielic pięc pod konkretnym adresem, więc w tym sensie adres jest generowany przez system.
Ciąg wskaźnik->wskaźnik->wskaźnik->... może być długi na tyle, ile masz pamięci dzielone przez rozmiar wskaźnika. (4 bajty na 32 bit, 8 na 64 bit) Aczkolwiek adwoływanie się przez więcej niż jeden wskaźnik zajmuje więcej czasu, bo tylko pojedyńcze odwołanie można zakodować w kodzie maszynowym i wypełnienie całej pamięci takimi odwołaniami nie miało by większego sensu, bo nie starczyło by miejsca na to, do czego mają się one ostatecznie odwołać. A z resztą i tak nie wypełnisz całej pamięci, ze względu na to, że nie każdą komórkę pamięci wirtualnej system może ci przydzielić, a część jest też w stylu nietykalnego readonly (na pewno na Windows).
Tak. Nazwa jest lokalnym wskaźnikiem z tą róznicą, że np. w C nie możesz mieć takiego wskaźnika, jaki by był na zmienną lokalną, to znaczy w assembly
[EBP - 8]
będzie (zazwyczaj) odwołaniem do zmiennej lokalnej. (Nawiasy kwadratowe oznaczają odwołanie do pamięci, a rejestr EBP zazwyczaj wskazuje na strukturę zwaną ramką stosu).
Natomiast system tego nie widzi. System co najwyżej łapie wyjątki, które mu procesor po takim odwołaniu rzuci. System natomiast zarządza pewnymi strukturami, które określają, które adresy w pamięci wirtualnej będą prowadzić do których adresów w pamięci fizycznej. Zazwyczaj system może to określać oddzielnie dla grup po 4096 bajtów.