Adresy zmiennych (Podstawy C) - POMOCY!

Witam, mieliśmy na zajęciach ćwiczenie dotyczące adresów zmiennych w C i niestety nic z niego nie rozumiem. Czy ktoś mógłby mi wytłumaczyć o co tutaj chodzi? Mam polecenia do zadania:

  1. Na podstawie różnicy adresów oblicz rozmiar pamięci zarezerwowany dla zmiennej.

  2. Analogicznie sprawdź rozmiary zmiennych innych typów.

Oto kod programu:

Program wyświetla coś takiego:

I jak na podstawie różnicy tych adresów mam podać rozmiar pamięci zarezerwowany dla zmiennej? Oraz co oznaczają kolejne polecenia “%hi” oraz “%p”?

Z góry dzięki za pomoc!

hi <- short int

p <- adres zmiennej

&adres uchwyt do adresu zmiennej adres

zmienna uchwyt do zmiennej

printf wyświetla zmienne właśnie zamiast tych %hi etc :slight_smile:

Teraz pomyśl jak zrobisz zadanie :slight_smile:

Ale co oznacza ten uchwyt do zmiennej? I jak na podstawie tej kombinacji literek i cyfr obliczyć rozmiar pamięci? Wiem tylko tyle że jest to zapisane w systemie szesnastkowym. Wiem też że moje pytanie może wydawać się głupie ale programuje w C pierwszy raz.

Może popełniłem błąd w nazwie, ale ogólnie chodzi o to, gdzie masz ta zmienna jest :slight_smile:

Aby zrozumieć znaczenie adresu zmiennej w C musisz wiedzieć abstrakcyjnie jak działa pamięć komputera. Upraszczając można przyjąć, że pamięć to komórki pamięci ponumerowane 0, 1, 2, 3, …, 0xFFFF (zależy od tego ile masz pamięci). Są one ułożone liniowo - jedna po drugiej. Tworząc zmienną automatyczną w C tak naprawdę rezerwujesz tylko pamięć na stosie programu. Pamięć ta ma przypisany adres (np. 92382) i właśnie ten adres jest nazywany adresem zmiennej. Jest to numer komórki pamięci, w której się ta zmienna znajduje.

Czy przypadkiem nie masz na myśli :

http://4programmers.net/C/Sizeof ?

Być może to by w czymś pomogło

Możesz też zrobić konwersje

(int)(zmienna);

Jak już zaczęli rozwiązywać to zadanie to i ja się wypowiem.

Owe komórki pamięci o których wspomniał Trivial, mają rozmiar jednego bajta. Jedna zmienna jest w stanie być w kilku komórkach i właśnie o to chodzi w zadaniu. Pamięć jest przydzielana po kolei. Czyli mając zmienną x po niej deklarujesz zmienną y. Odejmujesz adres x od y i wychodzi ci ile bajtów ma zmienna x :slight_smile:

Oczywiście w/w sizeof działa lepiej, bo kompilator sam go zamienia go na liczbę, jednak w treści zadania wymagana jest inna (wolniejsza) metoda :slight_smile: