Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Języki programowania z programowaniem obiektowym Laboratorium 9: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne Opracowali: dr hab. inż. Witold Beluch witold.beluch@polsl.pl dr inż. Jacek Ptaszny jacek.ptaszny@polsl.pl Gliwice 2015
Języki programowania z programowaniem obiektowym. Laboratorium 9 1 1. Wskaźniki 1.1. Wskaźnik To obiekt, który przechowuje adres innego obiektu (zmiennej). Zastosowania wskaźników: przyspieszenie operacji tablicowych; funkcje mogą zmieniać wartość przesyłanych do nich argumentów; dynamiczny przydział pamięci (tablice dynamiczne); dostęp do specjalnych komórek pamięci. Wskaźniki mogą pokazywać na: zmienne różnych typów; tablice i ich elementy; inne obiekty. 1.2. Przykłady definicji W jaki sposób zdefiniować wskaźnik pokazano poniżej: Przed użyciem wskaźnika należy go przypisać do konkretnego obiektu (przypisać mu adres tego obiektu). Wskaźnik można przestawić tak, by pokazywał na inny obiekt tego samego typu. Za pomocą wskaźnika można zmodyfikować zawartość obiektu, na który ten wskaźnik pokazuje, np.: 1.3. Wskaźniki a tablice Wskaźniki mogą wskazywać na elementy tablic: Nazwa tablicy jest adresem jej początku! lub: Nazwa tablicy jest stałym wskaźnikiem (takim, którego nie można przesuwać) do jej elementu o indeksie 0.
Języki programowania z programowaniem obiektowym. Laboratorium 9 2 Zatem możemy wskazać np. na czwarty element tablicy (czyli element o indeksie 3) w sposób następujący: 2. Referencje Referencja to inna nazwa tego samego obiektu. Podczas definiowania referencji trzeba ją od razu zainicjalizować: Referencja nie jest kopią zmiennej, ale tą samą zmienną pod inną nazwą modyfikacja referencji powoduje modyfikację oryginału! Referencje są przydatne do przekazywania do funkcji argumentów, które mogą być przez tą funkcję modyfikowane: Wywołanie, np.: Z wywołania funkcji nie wynika, że może ona modyfikować oryginał!
Języki programowania z programowaniem obiektowym. Laboratorium 9 3 3. Dynamiczny przydział pamięci 3.1. Operatory new/new[] oraz delete/delete[] Operatory new oraz new[] służą do tworzenia obiektów korzystając z dostępnego zapasu pamięci (sterty). Operatory delete oraz delete[] służą do zwalniania pamięci przydzielonej odpowiednio operatorami new oraz new[]. Mogą być wykorzystane dla dowolnego typu danych, tj. wbudowanego lub zdefiniowanego przez użytkownika. Obiekty takie nie mają nazwy; dostęp do nich umożliwiają wskaźniki. Np.: stworzenie zmiennej dynamicznej typu double: lub i jej usunięcie: 3.2. Cechy tak stworzonych obiektów Obiekty istnieją od momentu ich utworzenia operatorem new / new[] do momentu skasowania operatorem delete / delete[]. Obiektów tych nie obowiązują zwykłe zasady o zakresie ważności, czyli to, w których miejscach programu są widzialne lub nie. Jeśli w danym momencie jest dostępny jakikolwiek wskaźnik pokazujący na taki obiekt, to obiekt ten jest dostępny. Jeśli z jakiegoś powodu nie ma żadnego wskaźnika pokazującego na taki obiekt, to nie ma możliwości usunięcia takiego obiektu! W obiektach takich zaraz po ich po ich utworzeniu tkwią przypadkowe wartości, należy zatem zadbać o ich zapisanie w nich sensownych wartości, np. poprzez inicjalizację: Po zwolnieniu pamięci operatorem delete[] warto ustawić wskaźnik na 0, co zabezpiecza przed przypadkowym ponownym usunięciem obiektu :
Języki programowania z programowaniem obiektowym. Laboratorium 9 4 3.3. Tworzenie dynamicznych tablic operatorem new[] Rozmiar takich tablic nie musi być znany w momencie kompilacji! Dynamiczne tablice jednowymiarowe: Np.: stworzenie dynamicznej tablicy: lub i jej usunięcie: Nie da się elementom tak tworzonej tablicy nadać wartości początkowych (nie jest możliwa inicjalizacja, jak w przypadku tablic statycznych). Należy zadbać o wypełnienie tablicy sensownymi wartościami... Po zwolnieniu pamięci operatorem delete[] warto ustawić wskaźnik na 0, np.: Przykład: Dynamiczne tablice n-wymiarowe: Dynamiczna tablica n-wymiarowa składa się ze wskaźników do tablic (n-1)-wymiarowych. Niezbędna jest konstrukcja programistyczna w postaci wskaźnik na wskaźnik, np.: Alokacja pamięci odbywa się n-etapowo (patrz: przykład).
Języki programowania z programowaniem obiektowym. Laboratorium 9 5 Przykład: Czy wiesz, że... Heurystyka w informatyce to szczególny, niepełnowartościowy algorytm, pozwalający znaleźć przybliżone rozwiązanie zadania uznanego za trudne. Jednym z przedmiotów realizowanych na specjalności Modelowanie i symulacja systemów mechatronicznych jest przedmiot Metody heurystyczne. W ramach tego przedmiotu zapoznasz się z popularnymi heurystykami i metaheurystykami, jak algorytmy ewolucyjne, sztuczne sieci neuronowe i inne. Więcej na www.imio.polsl.pl/me3_mh.aspx.