Takimi zmiennymi są zmienne globalne, zmienne statyczne w klasie (współdzielone przez wszystkie obiekty klasy, a nawet dostępne spoza klasy), statyczne zmienne lokalne funkcji (współdzielone pomiędzy poszczególnymi wywołaniami funkcji i zachowujące wartość po zakończeniu). automatyczna – gdy pamięć przydzielana jest w trakcie działania programu ale automatycznie. Są to przeważnie zmienne lokalne podprogramów i ich parametry formalne. Są one alokowane przeważnie na stosie w rekordzie aktywacji i znikają po zakończeniu podprogramu. dynamiczna – alokowanie ręcznie w trakcie wykonywania programu przy pomocy specjalnych konstrukcji lub funkcji (malloc, new). W zależności od języka programowania zwalnianie pamięci może być ręczne lub automatyczne. Zazwyczaj nie posiada własnej nazwy, lecz trzeba się do niej odwoływać przy pomocy wskaźnika, referencji lub zmiennej o semantyce referencyjnej.

W większości współczesnych języków programowania zasięg zmiennych jest statyczny (leksykalny). Oznacza to, że podprogram ma dostęp do zmiennych lokalnych bloków w których jest zdeklarowany. Przykładowo: int f() { int a; int g() { print(a);

... } Funkcja g jest zadeklarowana wewnątrz funkcji f, w związku z tym ma dostęp do zmiennej lokalnej zadeklarowanej w funkcji f, czyli: a.