Zmienna to logiczna konstrukcja zgodna z przeznaczeniem algorytmu, podczas gdy lokalizacja pamięci to fizyczna konstrukcja opisująca działanie komputera. Ogólnie rzecz biorąc, w celu wykonania programu istnieje (wygenerowane przez kompilator) odwzorowanie między logicznym pojęciem zmiennej a pamięcią komputera.
(Nawet w języku asemblera mamy pojęcie zmiennych (logicznych) przechodzących do algorytmu i zamiaru oraz (fizycznych) lokalizacji pamięci, chociaż są one bardziej zbieżne w asemblerze.)
Zmienna jest pojęciem wysokiego (er) poziomu. Zmienna reprezentuje albo nieznane (jak w matematyce lub przypisaniu programistycznym) albo symbol zastępczy, który można zastąpić wartością (jak w programowaniu: parametry).
Lokalizacja pamięci to koncepcja niskiego (er) poziomu. Lokalizacja pamięci może być używana do przechowywania wartości, czasami do przechowywania wartości zmiennej. Rejestr procesora jest jednak innym sposobem przechowywania wartości niektórych zmiennych. Rejestry procesora są również lokalizacjami pamięci o niskim (er) poziomie, ale nie są lokalizacjami pamięci, ponieważ nie mają adresów, tylko nazwy.
W pewnym sensie zmienna jest mechanizmem abstrakcji do wyrażania zamiarów programu, podczas gdy lokalizacja pamięci jest fizyczną jednostką środowiska przetwarzania, która zapewnia przechowywanie i wyszukiwanie.
Pytanie 003: Czy to prawda, że wskaźnik jest przechowywany w miejscu pamięci 0x23452? Dlaczego?
Nie możemy powiedzieć z całą pewnością. To, że istnieje tam wartość, która działałaby jako adres, nie oznacza, że jest to ten adres, zamiast tego może być liczbą całkowitą (dziesiętną) 144466. Nie możemy przyjmować założeń dotyczących interpretacji wartości jedynie na podstawie tego, jak wyglądają one liczbowo.
Pytanie 004: Czy to prawda, że wskaźnik jest przechowywany w miejscu pamięci 0x23452? Dlaczego?
To jest rzeczywiście dziwne pytanie. Oczekują pewnych założeń na podstawie pól, jednak zauważmy, że adresy zwiększają się o 1 dla każdego pola. W każdym nowoczesnym komputerze oznaczałoby to, że każda skrzynka może pomieścić bajt-bajt adresowalność jest normą od dziesięcioleci. Jednak bajt ma tylko 8 bitów i może mieścić się w zakresie od 0 do 255 (dla wartości bez znaku); ale pokazują znacznie większą wartość przechowywaną w jednym z tych adresów, więc są bardzo podejrzane. (Mogłoby to zadziałać, gdyby była to maszyna adresowana do słowa, ale nie mówi o tym i niewiele jest obecnie maszyn, chociaż niektóre maszyny edukacyjne są takie.)
Na podstawie czterech fiszek, które wam wszystkim pokazałem, zdefiniowałbym wskaźniki w nieco inny sposób:
Wskaźnik to lokalizacja pamięci, której wartością jest adres pamięci innej lokalizacji pamięci.
Chociaż zdarzają się sytuacje, w których takie myślenie jest prawidłowe, mieszacie tu metafory. Pojęcie zmiennej odnosi się do algorytmu i jego celu - nie trzeba zakładać, że wszystkie zmienne mają lokalizacje pamięci. Niektóre zmienne (zwłaszcza tablice) mają lokalizacje pamięci, ponieważ lokalizacje pamięci obsługują adresowanie (podczas gdy rejestry procesora można nazwać nieindeksowane).
Do wykonania istnieje logiczne mapowanie między zmiennymi i instrukcjami a lokalizacjami pamięci procesora i sekwencjami instrukcji procesora. Zmienna, której wartość nigdy się nie zmienia (np. Stała), niekoniecznie wymaga lokalizacji pamięci, ponieważ wartość może być odtwarzana do woli (np. W razie potrzeby dla sekwencji kodu generowanych przez kompilator).
a
,0x23453
.nil
itp. w nich są wartości. Może ci się to wydawać oczywiste, ale nie czułbym się komfortowo, udzielając decydujących odpowiedzi na te pytania, nie widząc, jak te pola są zdefiniowane. Naprawdę nie ma sposobu, aby dowiedzieć się, czya
na drugim obrazku jest znak, ciąg znaków (jeśli są inne) lub nazwa zmiennej. Jeśli jest to ciąg, to czy jestnil
również ciąg? Czy wartość „zerowa”?