Programowanie: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Mku84 (dyskusja | edycje)
Mku84 (dyskusja | edycje)
Nie podano opisu zmian
Linia 31:
# [[Programowanie/Procedury i funkcje/Życie i śmierć zmiennej|Życie i śmierć zmiennej]]
# [[Programowanie/Procedury i funkcje/Zadania|Zadania]]
== Wskaźniki ==
 
=== Idea wskaźnika ===
 
Wskaźniki są elementem języków programowania m.in. C, C++ oraz Pascal. Nazwa wskaźnik pochodzi od staropolskiego słowa "wskaziciel" ( tzn. palec wskazujący).
 
Zmienna wskaźnikowa nie przechowuje w sobie wartości, zamiast tego przechowuje adres innej zmiennej bądź funkcji. Mówi się, że wskazuje na inną zmienną. Innymi słowy wskaźnik przechowuje w sobie adres w pamięci programu, do którego można się odwołać (tzn. dzięki wskaźnikowi mamy dostęp do danych przechowywanych pod adresem, na który wskazuje wskaźnik).
 
Szczegóły użycia wskaźnika zależą od języka programowania.
 
W przypadku projektowania algorytmy wskaźnikowego, ważną rzeczą jest poprawne zobrazowanie sieci połączeń (który wskaźnik wskazuje na jaką zmienną). Pozwala to na zaoszczędzenie czasu i nerwów.
 
Zostanie to zobrazowane w dalszej części kursu.
 
=== Deklarowanie wskaźników ===
 
==== Zobrazowanie graficzne wskaźnika ====
 
Wskaźnik może być zobrazowany jako komórka pamięci, która wskazuje na coś. Innymi słowy, można ją zobrazować w formie kwadracika, z którego środka wychodzi strzałka.
 
<gallery>
File:Idea wskaźnika.png|thumb|zobrazowanie wskaźnika wskazującego na zmienną
</gallery>
 
==== Wskaźnik zmiennej określonego typu ====
 
W języku C wskaźnik powinien wskazywać na zmienną określonego typu. Chroni to przed błędami.
 
===== Wskaźniki do typów prostych =====
 
===== Wskaźniki do stałych =====
 
Wskaźnik do stałej zabezpiecza przed typowymi próbami zmiany wskazywanej zmiennej. Zabezpieczenie to można obejść (o czym będzie w kolejnych rozdziałach).
 
===== Stałe wskaźniki =====
 
Wskaźniki stałe przechowują stały adres. Innymi słowy wskazują stale na jedną komórkę pamięci.
 
==== Wskaźnik do void ====
 
=== Wykorzystanie wskaźników ===
 
==== Przypisanie wskażników ====
 
===== Wskaźnik pusty (NULL) =====
 
Każdy wskaźnik powinien być zainicjowany zaraz po utworzeniu. Tzn. nie powinno dochodzić do sytuacji, w której wskaźnik jest utworzony, ale przechowuje nieokreśloną wartość. Byłby to tzw. wskaźnik dyndający. Dlatego wskaźnik powinien być zainicjowany zaraz po utworzeniu. Jeżeli nie wiadomo, an co ma wskazywać wskaźnik, wówczas należy mu przypisać wartość pustą.
 
Wartość pusta mówi, że wskaźnik jest "zablokowany", tzn nie można odwoływać się do wartość przezeń wskazywanych. Zabezpiecza to przed nieprawidłowościami.
 
Wskaźnik pusty jest przedstawiany graficznie jako prostokąt ze "strzałką zakończoną linią prostopadłą".
 
==== Dereferencja wskaźnika ====
 
==== Efekty uboczne wywołania funkcji ====
 
 
==== Wskaźnikowe struktury danych ====
 
 
==== Podmiana wartości stałej ====
 
Wcześniej napisano, że stała ma wartość ustawianą jedynie na początku swojego istnienia.
Kompilator umożliwia jednak sprytną podmianę wartości stałej przy pomocy rzutowania wskaźnika.
Tworzymy wskaźnik do void wskazujący na stałą.
Wskaźnik możemy rzutować na zwykły typ zmiennej (bez modyfikatora const), dzięki czemu kompilator
pomyśli, że ma do czynienia ze zwykłą zmienną.
 
Dzieje się tak, ponieważ stała jest traktowana jako specyficzny typ. Typy mają swoje ograniczenia,
ale język C pozwala na zmianę typów poprzez rzutowanie. A to umożliwia omijanie ograniczeń typów const.
 
Przykład:
 
<source lang="c">
 
// deklarujemy stałą całkowitoliczbową ...
const int mojaStalaZmienna = 13;
 
//...oraz wskaźnik wskazujący na chroniony obszar pamięci
void* ptrMojaStalaZmienna;// wskaźnik może wskazywać na dowolny typ zmiennej
ptrMojaStalaZmienna = & mojaStalaZmienna;// teraz wskażnik wskazuje na zmienną stałą
 
// spróbujemy nadpisać wartość stałej
 
// to nie przejdzie, bo wskaźnik wskazuje na wartość stałą...
*ptrMojaStalaZmienna = 44;
 
// ...ale po rzutowaniu typu wskaźnika na (int*) kompilator pomyśli, że wskaźnik wskazuje na zwykłą zmienną całkowitą
*(int*)ptrMojaStalaZmienna = 44;
 
// i tym sposobem stała może zostać umiejętnie zmodyfikowana
</source>
 
== Struktury danych ==