1 Wska¹niki. 1.1 Wska¹nik typu VOID. Wska¹nik jest obiektem przechowuj cym adres (z pami ci) przypisanej do niego zmiennej.

Podobne dokumenty
1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.

Wska¹niki, tablice dynamiczne wielowymiarowe

Wska¹niki, tablice dynamiczne jednowymiarowe, staªe

Programowanie i struktury danych

7.3 Tablice jednowymiarowe dynamiczne

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

1. Wprowadzenie do C/C++

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

1. Wprowadzenie do C/C++

Wykład 1: Wskaźniki i zmienne dynamiczne

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

DYNAMICZNE PRZYDZIELANIE PAMIECI

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Rekurencyjne struktury danych

Wskaźniki. Informatyka

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Lekcja 9 - LICZBY LOSOWE, ZMIENNE

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

KURS C/C++ WYKŁAD 6. Wskaźniki

Listy i operacje pytania

PROE wykład 7 kontenery tablicowe, listy. dr inż. Jacek Naruniec

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

Algorytmy zwiazane z gramatykami bezkontekstowymi

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Wzorce projektowe strukturalne cz. 1

Lab 9 Podstawy Programowania

ˆ tablice statyczne (o staªej ilo±ci elementów) ˆ tablice dynamiczne (o zmiennej ilo±ci elementów) 7.1 Tablice jednowymiarowe statyczne

Programowanie i struktury danych

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie w języku C++

Podstawy programowania w języku C++

1 Metody iteracyjne rozwi zywania równania f(x)=0

Zmienne i struktury dynamiczne

Programowanie komputerowe. Zajęcia 4

Wskaźniki w C. Anna Gogolińska

ZASADY PROGRAMOWANIA KOMPUTERÓW

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Model obiektu w JavaScript

Techniki Programowania wskaźniki

Lekcja 12 - POMOCNICY

Techniki Programowania wskaźniki 2

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Bash i algorytmy. Elwira Wachowicz. 20 lutego

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

wiczenie 1 Podstawy j zyka Java. Instrukcje warunkowe

Przetwarzanie sygnaªów

Paradygmaty programowania. Paradygmaty programowania

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

ANALIZA NUMERYCZNA. Grzegorz Szkibiel. Wiosna 2014/15

Tablice, funkcje - wprowadzenie

Kompilowanie programów

Podstawy programowania w języku C++

Lab. 02: Algorytm Schrage

Algorytmy tekstowe. Andrzej Jastrz bski. Akademia ETI

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Optymalizacja R dlaczego warto przesi ± si na Linuxa?

Lekcja 8 - ANIMACJA. 1 Polecenia. 2 Typy animacji. 3 Pierwsza animacja - Mrugaj ca twarz

Wskaźniki. Programowanie Proceduralne 1

Projektowanie i programowanie obiektowe (materiały do wykładu cz. VI)

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Lekcja 9 Liczby losowe, zmienne, staªe

Specyfikacja techniczna banerów Flash

JAO - J zyki, Automaty i Obliczenia - Wykªad 1. JAO - J zyki, Automaty i Obliczenia - Wykªad 1

Podziaª pracy. Cz ± II. 1 Tablica sortuj ca. Rozwi zanie

Przykªadowe tematy z JiMP

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Część 4 życie programu

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Listy Inne przykªady Rozwi zywanie problemów. Listy w Mathematice. Marcin Karcz. Wydziaª Matematyki, Fizyki i Informatyki.

x y x y x y x + y x y

Wstęp do Programowania 2

Języki i metodyka programowania. Wskaźniki i tablice.

Algorytmy i język C++

Wstawianie gotowych rysunków w texu - informacje podstawowe.

Podstawy programowania skrót z wykładów:

Zestaw 1 ZESTAWY A. a 1 a 2 + a 3 ± a n, gdzie skªadnik a n jest odejmowany, gdy n jest liczb parzyst oraz dodawany w przeciwnym.

Programowanie obiektowe w C++ Wykªad 4

Dynamiczne struktury danych

Wstęp do wskaźników w języku ANSI C

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

A = n. 2. Ka»dy podzbiór zbioru sko«czonego jest zbiorem sko«czonym. Dowody tych twierdze«(elementarne, lecz nieco nu» ce) pominiemy.

Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

raceboard-s Szybki start

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie wspóªbie»ne

1 Stos: Stack i Stack<T>

Podstawy programowania w języku C++

Lekcja 3 Banki i nowe przedmioty

Podstawy JavaScript. Dawid Poªap. Dawid Poªap Technologia informacyjna Grudzie«, / 13

PARADYGMATY PROGRAMOWANIA Wykład 4

Transkrypt:

1 Wska¹niki. Wska¹nik jest obiektem przechowuj cym adres (z pami ci) przypisanej do niego zmiennej. int a; int *b; a = 11; cout << "a = " << a; b = &a; /*w tej linijce wskaznik jest laczony z adresem zmiennej*/ cout <<" wartosc zmiennej wskazywanej przez b jest rowna " << *b; *b = 14; cout << "a = " << a; Wska¹niki mo»na zastosowa do: { ulepszenia pracy z tablicami, { funkcji mog cych zmienia warto± przesyªanych do nich argumentów, { dost pu do specjalnych komórek pami ci, { rezerwacji obszarów pami ci. 1.1 Wska¹nik typu VOID. Wska¹nik jak wspomniano wy»ej sªu»y do wskazywania adresu jakiego± miejsca (obiektu) w pami ci. Deniuj c wska¹nik nale»y pami ta by jego typ zgadzaª si z typem wskazywanego obiektu. Rozumie mo»na to,»e tworz c wska¹nik do obiektu posiadamy wiedz na temat jego typu. Stosuj c wska¹nik typu void ±wiadomie rezygnujemy z tej ÿwiedzy" a nasz wska¹nik automatycznie traci mo»liwo± odczytania miejsca na które wskazuje. Da si t mo»liwo± ÿodzyska " przez zastosowania rzutowania: 1

int a; void *wsk; (int*)wsk = &a; Taki upo±ledzony wska¹nik mo»e jednak posªu»y do wskazywania na inne wska¹niki. Je±li chcemy by wska¹nik o okre±lonym typie wskazywaª do wska¹nika typu void nale»y wykona rzutowanie. Je±li chcemy wy±wietli warto± zmiennej lub wska¹nika do którego wskazuje wska¹nik typu pustego równie» nale»y wykona rzutowanie. int masa=135, *wag, wyb=0; float km = 14.96, *moc; void *wsk; moc = &km; wag = &masa; cout << "Dobierz motocykl o pojemnosci do 125cm^3 dla siebie\n" << "Jaki parametr jest dla Ciebie najistotniejszy?\n" << "\t1. Masa\n" << "\t2. Moc silnika\n" << "Wprowadz swoj wybor: "; cin >> wyb; if (wyb == 1) { wsk = wag; cout << "Motocykl dla Ciebie to: Yamacha Virago 125\n" <<"Jego masa to: " << *(int*)wsk << "Kg" << endl; if (wyb == 2) { wsk = moc; cout << "Motocykl dla Ciebie to: Honda VT Shadow 125\n" <<"Jego moc to: " << *(float*)wsk << "KM" << endl; 2

1.2 Wska¹niki a tablice. Zaªó»my,»e mamy nast puj c sytuacj : int *wsk; int tab[5]; wsk=&tab[n]; W ten sposób przypisali±my wska¹nik wsk do n-tego elementu tablicy tab. Je- ±li chcemy przypisa wska¹nik do elementu numer zero, wystarczy po prostu wpisa nazw tablicy (nazwa tablicy zawsze wskazuje na jej zerowy element). wsk=&tab; Je±li w trakcie pracy programu chcemy by wska¹nik wskazywaª na kolejny element tej tablicy wystarczy zastosowa poni»sz instrukcj : wsk = wsk+1; //lub wsk++; Aby przesun wska¹nik o n elementów wystarczy wpisa : wsk += n; W przypadku innych typów ni» int nie musimy si przejmowa,»e powy»sza metoda przeskoczy nam do kolejnego bitu. Dzi ki temu,»e kompilator wie jakiego typu mamy wska¹nik, wie równie» o ile bitów musi si przesun by znale¹ kolejny element tablicy (Rys. 1). Rysunek 1: Przemieszczanie si za pomoc wska¹ników po zawarto±ci tablicy. ródªo: Symfonia C++ J. Gr bosz. 3

float tab[4] = {7.23, 12.46, 16.12, 23.28; float *wsk; wsk=tab; cout << "Najblizszy pociag z Krakowa do " << "Krainymlekiemimiodemplynacej odjezdza o: " << *wsk << endl; wsk=wsk+1; cout << "Nastepny pociag odjezdza o: " << *wsk << endl; wsk++; cout << "Kolejny pociag odjezdza o: " << *wsk << endl; wsk+=1; cout << "Ostatni pociag odjezdza o: " << *wsk << endl; 1.3 Wska¹nik jako argument funkcji. Wska¹ników jako argumentów funkcji u»ywa si w celu zmiany warto±ci obiektu przez funkcj. Z poprzednich zaj wiemy,»e najprostszym sposobem by to osi gn jest zastosowanie funkcji o po» danym typie i zwrócenie pewnej warto±ci. Niestety metoda ta pozwala nam na zwrócenie tylko jednej warto±ci. W sytuacjach, gdy chcemy by funkcja wpªyn ªa na wi cej ni» jeden obiekt pomagaj nam wska¹niki. void pizza(int *lpi, float *gotowka); int liczba_pizzy = 0; float pln = 134.28; cout << "Obecnie posiadasz " <<liczba_pizzy << " pizze.\n"; cout << "Masz przy sobie " << pln << " PLN." << endl; cout << "Czas zamowic pizze!" << endl; 4

pizza(&liczba_pizzy, &pln); cout << "Twoja dostawa nadeszla\n"; cout << "Teraz posiadasz " << liczba_pizzy << " pizze.\n"; cout << "Zostalo Ci " << pln << " PLN." << endl; void pizza (int *lpi, float *gotowka) { *lpi = 2; *gotowka = 62.47; W powy»szym kodzie udaªo si zmieni warto±ci dwóch zmiennych za pomoc jednej funkcji. Maªo tego, udaªo si to zrobi wykorzystuj c funkcj void, czyli tak która nie zwraca»adnych warto±ci. Udaªo si to osi gn poprzez zastosowanie wska¹ników. Normalnie do funkcji przesyªana jest kopia obiektu, jednak»e w tym przypadku do funkcji przesªany zostaª konkretny adres konkretnego obiektu i przypisano go do odpowiedniego wska¹nika. Dzi ki temu modykuj c wska¹nik, tak naprawd zmodykowana zostaªa warto± obiektu. 1.4 Zastosowanie wska¹nika przy dost pie do konkretnych komórek pami ci. Istnieje mo»liwo± przypisania wska¹nikowi konkretnej komórki pami ci. Stosuje si to na przykªad gdy do danego adresu przesyªane s dane z jakiego± czujnika, lub innego urz dzenia zewn trznego i komórka ta nie jest w programie nazywana. Zaªó»my,»e chcemy by wska¹nik wskazywaª na komórk 45634. By przypisa do tego adresu wska¹nik wystarczy: wsk = 45634; Istniej niestety sytuacje w których przypisanie wska¹nika do konkretnego adresu nie jest takie proste. Wszystko zale»y od typu komputera lub systemu operacyjnego. Informacje na ten temat mo»na znale¹ w dokumentacji konkretnych kompilatorów. 5

2 Dynamiczny przydziaª pami ci. 2.1 Rezerwacja obszarów pami ci. W celu rezerwacji obszarów w pami ci (np. do stworzenia tablicy dynamicznej) posªu»ymy si operatorem new (w j zyku c odpowiednikiem byª by malloc). By wyczy±ci dany obszar wykorzystywany jest operator delete (odpowiednik c - free). Zaªó»my,»e mamy zdeniowany wska¹nik: int *wsk; Aby stworzy nowy obiekt w pami ci stosujemy nast puj c instrukcj : wsk = new char; Dzi ki temu stworzyli±my w pami ci nowy obiekt typu char. Obiekt ten nie ma nazwy, ale wska¹nik wsk posiada zapisany jego adres w pami ci. W celu wyczyszczenia pami ci z tego obiektu u»ywamy: delete wsk; Cechy stworzonych w ten sposób obiektów: { obiekt taki istnieje od momentu stworzenia (zastosowanie new) do momentu usuni cia, (zastosowanie delete), to programista decyduje o dªugo±ci jego ÿ»ycia" { obiekt ten nie ma nazwy, mo»emy nim operowa jedynie przez wska¹nik do niego wskazuj cy, {takiego obiektu nie obowi zuj standardowe zasady zakresu wa»no±ci. Je±li tylko istnieje wska¹nik do niego wskazuj cy mo»emy z niego skorzysta, { obiekty tworzone w ten sposób s dynamiczne, dlatego zawsze b d przyjmowa ±mieciowe warto±ci, nale»y o tym pami ta i zadba o wpisanie w nie sensownych warto±ci. char * tworzobiekt (void); /* tworzymy tu funkcje wywolywana bez argumentow, ktora zwracac bedzie wskaznik typu char */ char *wsk1, *wsk2, *wsk3; 6

cout << "Teraz nastapi akt stworzenia!\n"; wsk1 = tworzobiekt(); wsk2 = tworzobiekt(); wsk3 = tworzobiekt(); *wsk1 = 'a'; *wsk2 = 'b'; cout << "\nstworzylismy trzy nowe obiekty.\n" << "Do dwoch przypisano wartosci: "<< *wsk1 << *wsk2 << endl << "W trzecim widzimy same smieci: " << *wsk3 << endl; delete wsk1; delete wsk2; delete wsk3; char * tworzobiekt (void) { char *w; cout << endl << "Tworze obiekt!" << endl; w = new char; return w; 2.2 Dynamiczna alokacja tablicy. Dzi ki operatorowi new mo»na równie» tworzy tablice: int *wsk; wsk = new int [rozmiar]; Dzi ki powy»szym dwóm linijkom stworzyli±my tablic o rozmiarze rozmiar (warto± wyra»ona liczb caªkowit ). Dziaªanie operatora new tworzy w pami ci miejsce dla bezimiennej tablicy i przypisuje jej zerowy adres wska¹nikowi wsk. Taka tablica dziaªa na identycznych zasadach jak obiekty tworzone w poprzednim podpunkcie. float srednia (float a, float tab[ ]); 7

int rozm=0, i; float *wsk, wynik; cout << "Program obliczy srednia arytmetyczna kilku liczb\n"; cout << "Podaj ile liczb chcesz wprowadzic w celu obliczenia" << " sredniej: "; cin >> rozm; wsk = new float[rozm]; for (i = 0; i<rozm; i++) { cout << "Podaj wartosc dla " << i+1 << " elementu: "; cin >> wsk[i]; cout << "Policze srednia dla nastepujacych liczb: "; for (i=0; i<rozm; i++) { cout << wsk[i] << ", "; wynik = srednia(rozm, wsk); cout << "Srednia powyzszych liczb wynosi: " << wynik << endl; delete wsk; wsk = NULL; float srednia (float a, float tab[ ]) { int b; float sred; for (b =0; b<a; b++) { sred += tab[b]; sred /= a; return sred; Czasem napisany program mo»e zu»ywa zbyt wiele pami ci i niestety nie uda si stworzy nowego obiektu. Zamiast tego przypisana do niego zostanie warto± NULL (0). Je±li planujemy w programie kreowa wiele obiektów dynamicznych istnieje sposób by zwyczajnie sprawdza, czy dany obiekt zostaª stworzony. Oto przykªad p tli sprawdzaj cej: int rozm; float *wsk; wsk = new float[rozm]; 8

if (!wsk) { error("pamiec sie wyczerpala"); Zadanie W oparciu o zagadnienia wymienione w niniejszej instrukcji prosz udoskonali prosty interface u»ytkowy automatu do sprzeda»y przek sek i napoi stworzony na poprzednich zaj ciach. Wymogi dotycz ce programu: 1. Program ma ÿprzyjmowa " opªaty za wybrane przek ski i ÿwydawa " reszt 2. Pula pieni»na w automacie powinna by z góry ustalona podczas pierwszego uruchomienia programu (np. 50PLN). Pula powinna by rozdzielona na konkretne ilo±ci nominaªów monet (5,2,1,0.5,0.2,0.1 PLN). Wszelkie modykacje w puli pieni»nej powinny by eksportowane do zewn trznego pliku po ka»dej transakcji. 3. Podczas wydawania reszty automat powinien ustala priorytet wydawania monet, których ma w nadmiarze. 4. Podczas dokonywania opªaty przez u»ytkownika, musi on wprowadzi jakimi nominaªami pªaci. Je±li automat nie b dzie w stanie wyda reszty, ma wy±wietli si komunikat z pro±b o zapªat odliczon gotówk. 5. Wszelkie modykacje ilo±ci bilonu w automacie maj by przeprowadzane z wykorzystaniem wska¹ników. 6. Program powinien by wyposa»ony w ukryt funkcj uruchamian odpowiednim kodem, dzi ki której mo»liwa b dzie edycja dost pnej w automacie puli pieni»nej. 9