Spróbuje opowiedzieć Ci to w sposób łopatologiczny, bo takie rozumowanie najbardziej przypadło mi do gustu.
Jak zapewne wiesz, referencja jest aliasem do zmiennej, czyli taką ksywką, dzięki której nie kopiujemy danych tylko pracujemy na oryginale, bo odnosimy się do tej samej rzeczy, korzystając z jej alternatywnej nazwy. Gdy funkcja, czyli podprogram oczekuje jako parametru referencji, to możesz to sobie porównać do poznania kogoś nowego, po przezwisku, nie znając jego imienia. Idąc tym tokiem rozumowania, cokolwiek powiesz komuś, czy to po jego ksywce, czy imieniu zawsze będzie to ta sama osoba. Dlatego też, gdy przekazujesz zmienną do funkcji jako referencję, to pracujesz na oryginalnych danych, bo cokolwiek zrobisz ze zmienną po jej alternatywnej nazwie, będzie to dotyczyć jej samej.
Wskaźniki działają bardzo podobnie, a właściwie referencje są ich następcami. Różnica jest taka, że do wskaźnika zapisujemy adres naszej szufladki w pamięci, w której siedzą nasze dane. Kiedy przekazujemy do funkcji ten adres, to cały czas operujemy na tej samej szufladcce i tych samych danych. Różnicą jest konieczność używania operatora wyłuskania - możesz to sobie wyobrazić w oparciu o ten przykład: nasze adresy, to ponazywane nazwiskami autorów książek szufladki w bibliotece. Aby otworzyć szufladę i przejrzeć spis dzieł autora musimy pociągnąć za uchwyt. Tym uchwytem w języku C++ jest operator wyłuskania, czyli gwiazdka. Referencja jest po prostu wygodniejsza w użyciu. Poza tym możemy utworzyć referencję stałą, która przekaże dane do funkcji bez kopiowania, czyli zaoszczędzimy na pamięci, ale będą one tylko w trybie do odczytu.
Co do ostatniego pytania to tak - main wypisując dane korzysta w pierwszej kolejności ze zmiennych o jej zasięgu lokalnym, czyli wewnątrz funkcji. Jeśli nie odnajdzie zmiennej o zasięgu lokalny to spróbuje skorzystać ze zmiennej o zasięgu globalnym, czyli deklarowanej poza jakąkolwiek funkcją. Jeśli takowej nie odnajdzie kompilator zgłosi błąd.
Być może w jakiś sposób rozjaśniłem Ci to zagadnienie.
Pozdrawiam! ;)