• Nie Znaleziono Wyników

Wykład 12:

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 12:"

Copied!
37
0
0

Pełen tekst

(1)

1

dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład 12:

Wskaźniki

Wskaźniki i tablice Zmienne dynamiczne

Podstawy programowania

(2)

2

Wskaźniki

Podstawy programowania w C++

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(3)

3

Pojęcie wskaźnika

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Wskaźnik na zmienną danego typu to zmienna, która przechowuje adres zmiennej danego typu.

 Zmienne statyczne są niczym innym jak tylko obszarami pamięci operacyjnej RAM przyznanymi do przechowywania danych.

 Odwołując się do zmiennej poprzez jej nazwę odwołujemy się do przydzielonej jej pamięci.

 Wartością wskaźnika jest adres pamięci RAM, gdzie znajduje się taka zmienna.

 Adres zmiennej przechowujemy w zmiennej

wskaźnikowej.

(4)

4

Definiowanie wskaźników

Wskaźniki

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Zmienne wskaźnikowe dzielą się na różne typy – przeznaczone do przechowywania adresów różnych typów danych.

typ_wskazywanego_obiektu * nazwa wskaźnika;

Np.:

int *wsk_na_int;

char * wsk_na_znak;

float * wsk_na_float;

(5)

5

Pojęcie wskaźnika

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Aby uzyskać adres zmiennej statycznej, który można przechowywać w zmiennej wskaźnikowej posłużyć się można operatorem &

Zdefiniowanie wskaźnika na int oraz zmiennej typu int

Przekazanie adresu „zmiennej” do wskaźnika

(6)

6

Posługiwanie się wskaźnikami

Wskaźniki

int *x; - definicja wskaźnika do obiektów typu int int st; - definicja obiektu typu int z liczbą 100 x = &st; - ustawienie wskaźnika na obiekt st

cout << *x; - wypisanie wartości obiektu wskazywanego przez x cin >> *x; - zapisanie wartości do wskaźnika

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(7)

7

Posługiwanie się wskaźnikami

Wskaźniki

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(8)

8

Posługiwanie się wskaźnikami

Wskaźniki

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Wskaźniki jako argumenty funkcji - przekazując wskaźniki jako argumenty funkcji sprawiamy, że z wnętrza funkcji mamy pełny dostęp do zmiennych przekazanych jako argumenty (możemy je modyfikować).

Efekt jest podobny jak przy przekazywaniu argumentów przez referencję.

(9)

9

Obsługa tablicy za pomocą wskaźników

Podstawy programowania w C++

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(10)

10

Adres tablicy

Podstawy

NAZWA TABLICY jest równocześnie

ADRESEM JEJ ZEROWEGO ELEMENTU

Dla: int tab[10];

zapis: tab

jest równoznaczny z: &tab[0]

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(11)

11

Wskaźnik do tablicy

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Obsługa tablic za pomocą zmiennych:

(12)

12

Wskaźnik do tablicy

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Po elementach tablicy możemy poruszać się na dwa sposoby:

1. przy użyciu indeksów podając kolejne numery komórek począwszy od 0,

2. przeskakując kolejne komórki tablicy z wykorzystaniem

wskaźnika.

(13)

13

Wskaźnik do tablicy

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Przykład – wypisanie elementów tablicy poruszając się po niej

wskaźnikiem.

(14)

14

Przekazywanie tablic do funkcji

Podstawy programowania w C++

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(15)

15

Przekazywanie tablic do funkcji

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Tablicy nie można przesłać przez wartość.

Można tak przesłać pojedyncze jej elementy, ale nie całość.

Mamy funkcję o nagłówku:

void funkcja (float tab[]);

która spodziewa się jako argumentu: tablicy liczb typu float, Taką funkcję wywołujemy na przykład tak:

float tablica[4]={ 7, 8.1, 4, 4.12};

funkcja (tablica);

(16)

16

Stałe wskaźniki i

wskaźniki na stałe

Podstawy programowania w C++

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(17)

17

Wskaźniki i stałe

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Wskaźnik na stałą – wskazuje na zmienną typu z kwantyfikatorem const (stałą).

(18)

18

Wskaźniki i stałe

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Stały wskaźnik – wskazuje zawsze w to samo miejse pamięci (nie można go przesuwać)

Przykładem stałego wskaźnika jest nazwa tablicy

(19)

19

Wskaźniki na funkcję

Podstawy programowania w C++

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(20)

20

Wskaźniki na funkcję

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

Wskaźnik na funkcję – przechowuje adres funkcji. Może być wykorzystany do jej wywołania.

Definicja:

Przypisanie adresu funkcji:

(21)

21

Wskaźniki do funkcji

Podstawy

dr Artur Bartoszewski - Podstawy programowania sem. 1 - WYKŁAD

(22)

22

Zmienne dynamiczne

Podstawy programowania w C++

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

(23)

23

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Wskaźniki można zastosować do dynamicznej alokacji zmiennych – czyli rezerwacji w pamięci obszarów do przechowywania zmiennych w trakcie działania programu.

Tak stworzona zmienna nie ma nazwy, lecz tylko adres.

Adres ten przechowywany jest w statycznej zmiennej

wskaźnikowej (lub bardziej skomplikowanej strukturze danych

takiej jak lista lub drzewo binarne).

(24)

24

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Do dynamicznej alokacji zmiennych służy operator new

int *wsk;

wsk = new int;

Lub krócej:

int *wsk = new int;

Operator new na podstawie typu zmiennej (lub też typu i rozmiaru tablicy) przydzieli odpowiednią ilość pamięci.

Jeśli przydział pamięci powiódł się, to wartość zmiennej „wsk” będzie różna od zera.

Jeśli wartość wskaźnika będzie równa 0, to pamięć nie została przydzielona.

Wartość 0 bardzo często jest zastępowana stałą NULL (zalecane).

Sytuacje w których pamięć nie może zostać przydzielona:

1. rozmiar bloku pamięci, który chcesz zarezerwować jest zbyt duży;

2. system nie posiada więcej zasobów pamięci i w związku z tym nie może jej przydzielić.

(25)

25

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Do dynamicznej alokacji zmiennych służy operator new

int *wsk;

wsk = new int;

Lub krócej:

int *wsk = new int;

Do usunięcia z pamięci zmiennej dynamicznej służy operator delete

delete wsk;

W języku C do przydzielania i zwalniania pamięci służyły głównie funkcje malloc() i free() w C++ zostały one zastąpione

operatorami new i delete.

(26)

26

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Za pomocą operatora delete kasuje się tylko obiekty stworzone operatorem new

Próba skasowania czegokolwiek innego jest błędem.

Uwaga: nie należy dwukrotnie kasować obiektu.

Wyjątkiem jest zastosowanie operatora delete w stosunku do

wskaźnika pokazującego na adres zerowy (NULL) – ponieważ

żaden obiekt nie może mieć adresu 0 - taka konstrukcja nie

powoduje błędu.

(27)

27

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Często stosowana konstrukcja zabezpieczająca przed podwójnym kasowaniem obiektów:

int *wskaznik = new int;

// ……..

delete wskaznik;

wskaznik = NULL;

// ……….

delete wskaźnik; // nie spowoduje bledu

(28)

28

Zmienne dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Cechy obiektów dynamicznych.

• Obiekty utworzone dynamicznie istnieją od momentu, gdy je utworzymy operatorem new do momentu, gdy je skasujemy operatorem delete.

• Obiekt utworzony dynamicznie nie ma nazwy. Można nim operować tylko za pomocą wskaźników.

• Obiektów takich nie obowiązują zwykłe zasady o zakresie ważności (zasady mówiące w których miejscach programu są widzialne, a w których niewidzialne pomimo, że istnieją). Jeśli tylko jest w danym momencie dostępny choćby jeden wskaźnik, który na taki obiekt pokazuje, to mamy do tego obiektu dostęp.

• Obiekty dynamicznie nie są inicjalizowane zerami (po utworzeniu

zawierają przypadkowe wartości).

(29)

29

Tablice dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Dynamiczna alokacja tablic:

int *wsk;

wsk = new int [1000];

Lub krócej:

int *wsk = new int [1000];

Rozmiar tablicy nie musi być stałą. Wystarczy, że jego wartość będzie

znana w momencie alokacji tablicy (niekoniecznie w momencie

kompilacji programu)

(30)

30

Tablice dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Do usunięcia z pamięci dynamicznej tablicy służy konstrukcja:

delete [] wsk;

Jeśli przydzieliliśmy pamięć określając ilość elementów tablicy to

musimy poinformować operator delete o tym, że wskaźnik wskazywał na tablicę – inaczej usuniemy tylko jej pierwszy element.

Aby to zrobić dopisujemy zaraz za operatorem nawiasy kwadratowe [ ]

Nie podajemy w nich rozmiaru tablicy, ponieważ operator sam ustala

rozmiar bloku jaki został przydzielony.

(31)

31

Tablice dynamiczne

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

(32)

32

Tablice wskaźników

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

W tablicy przechowywać można wszystkie rodzaje zmiennych prostych, w tym także wskaźniki adresami różnych miejsc w pamięci.

int *tabl_wsk[1000];

(33)

33

Tablice wskaźników do zmiennych dynamicznych

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

tablica

(34)

34

Tablica dynamiczna dwuwymiarowa

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Tablica dynamiczna dwuwymiarowa to tak naprawdę tablica wskaźników do poszczególnych wymiarów (tablic).

Podczas deklaracji tablicy mamy pełną kontrolę nad wielkością

poszczególnych wymiarów (tablic), statycznie nie da się osiągnąć

takich efektów.

(35)

35

Tablica dynamiczna dwuwymiarowa

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

Generowanie tablicy dwuwymiarowej dynamicznej odbywa dwuetapowo.:

1. tworzymy tablicę wskaźników wskazujących na tablicę

2. tworzymy tablice jednowymiarowe, które „podczepiamy” pod tablicę główną.

int * * tablica2D Tablica wskaźników

do tablic podrzędnych

Tablice drugiego wymiaru nie mają nazw – tylko wskaźniki do początku zapisane w tablicy

nadrzędnej Nazwa tablicy zapisana jest

jako wskaźnik do wskaźnika do zmiennej

(takiej jak przechowywane w

tablicach podrzędnych)

(36)

36

Tablica dynamiczna dwuwymiarowa

Wskaźniki i zmienne dynamiczne

dr Artur Bartoszewski - Programowanie obiektowe , sem. 1I - WYKŁAD

(37)

37

Literatura:

W prezentacji wykorzystano przykłady i fragmenty:

• Grębosz J. : Symfonia C++, Programowanie w języku C++

orientowane obiektowo, Wydawnictwo Edition 2000.

• Jakubczyk K.: Turbo Pascal i Borland C++ Przykłady, Helion.

Warto zajrzeć także do:

• Sokół R. : Microsoft Visual Studio 2012 Programowanie w Ci C++, Helion.

• Kerninghan B. W., Ritchie D. M.: język ANSI C, Wydawnictwo Naukowo Techniczne.

Dla bardziej zaawansowanych:

• Grębosz J. : Pasja C++, Wydawnictwo Edition 2000.

• Meyers S.: język C++ bardziej efektywnie, Wydawnictwo Naukowo Techniczne

dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Cytaty

Powiązane dokumenty

Ziegler, „DFT Studies on the Copolymerization of a -Olefins with Polar Monomers: Ethylene-Methyl Acrylate Copolymerization Catalyzed by a Pd-based Diimine Catalyst”,

Natomiast wartością funkcji memccpy jest adres bajtu w obszarze docelowym (d), który znajduje się bezpośrednio za poszukiwanym bajtem, lub NULL, jeśli

Zatem, gdy trójka tworzy układ. prawoskr tny, mamy polaryzacj

Zaprezentowane wyżej wzory nie pozwalają nam –póki co –obliczyć pochodnej funkcji liniowej f (x )=ax+b Żeby sobie poradzić z tym i bardziej skomplikowanymi przypadkami,

 przed tablicą i-węzłów znajduje się blok z mapa bitową zajętości i-węzłów danej grupy - jest to tablica bitów, z których każdy zawiera informację czy dany i-węzeł

 przed tablicą i-węzłów znajduje się blok z mapa bitową zajętości i-węzłów danej grupy - jest to tablica bitów, z których każdy zawiera informację czy dany i-węzeł

przed tablicą i-węzłów znajduje się blok z mapa bitową zajętości i-węzłów danej grupy - jest to tablica bitów, z których każdy zawiera informację czy dany i-węzeł

Przykład użycia instrukcji DELETE do usunięcia z tabeli Oferty_Wycofane rekordów dodanych uprzednio przy pomocy instrukcji INSERT w Listing 6 przedstawia Listing