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

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

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

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

W dowolnym momencie można zmienić typ wskaźnika.

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

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

Programowanie - wykład 4

Część 4 życie programu

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

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Techniki Programowania wskaźniki

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

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:

I - Microsoft Visual Studio C++

Wstęp do informatyki- wykład 7

1 Podstawy c++ w pigułce.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

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

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

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

Techniki Programowania wskaźniki 2

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

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

C++ wprowadzanie zmiennych

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Pytania sprawdzające wiedzę z programowania C++

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

Programowanie komputerowe. Zajęcia 4

Programowanie komputerowe. Zajęcia 1

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Program 14. #include <iostream> #include <ctime> using namespace std;

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

DYNAMICZNE PRZYDZIELANIE PAMIECI

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

3. Instrukcje warunkowe

Podstawy Programowania

1 Podstawy c++ w pigułce.

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Zmienne i struktury dynamiczne

Operacje wejścia/wyjścia odsłona pierwsza

C++ - [1-3] Debugowanie w Qt Creator

Podstawy Programowania Podstawowa składnia języka C++

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Wstęp do Informatyki

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie i struktury danych

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

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Struktury Struktura polami struct struct struct struct

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

Wyjątki (exceptions)

Przekazywanie argumentów wskaźniki

4. Funkcje. Przykłady

Wstęp do informatyki- wykład 11 Funkcje

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

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

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

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

Lab 9 Podstawy Programowania

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Język C zajęcia nr 11. Funkcje

tablica: dane_liczbowe

Wstęp do informatyki- wykład 6

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

Wykład 1: Wskaźniki i zmienne dynamiczne

Wstęp do informatyki- wykład 5 Instrukcja selekcji if-else Operatory arytmetyczne i logiczne

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

IX. Wskaźniki.(3 godz.)

Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo

Wstęp do informatyki- wykład 9 Funkcje

Wstęp do programowania

Programowanie komputerowe. Zajęcia 3

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

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

Podstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe

Podstawy programowania. Wykład: 6. Tablice statyczne. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

STL: Lekcja 1&2. Filozofia STL

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Inicjacja tablicy jednowymiarowej

Podstawy algorytmiki i programowania - wykład 4 C-struktury

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Pytanie 1. Pytanie 2. Pytanie 3 WOJEWÓDZKI KONKURS INFORMATYCZNY. Treść pytania

Wstęp do programowania

Informacja o programowaniu w c++ Dr Maciej Bobrowski

Transkrypt:

1 Wskaźniki Wskaźnik (ang. pointer) jest obiektem (zmienną) przechowującym adres pamięci. Definiowanie wskaźników: typ *nazwa wskaznika; np.: int *wsk na x;, double *xxx;, char *znak;. Aby można było pracować ze wskaźnikiem, trzeba najpierw go ustawić, tak aby pokazywał na coś sensownego, np.: int *wsk; //definicja wskaźnika do obiektów typu int int x = 4; //definicja zwykłego obiektu typu int wsk = &x; //ustawienie wskaźnika o nazwie wsk tak, //by pokazywał na obiekt x cout << *wsk; //wyświetlony zostaje obiekt, na który pokazuje wskaźnik wsk Oprócz tego, że wskaźnik zawiera adres miejsca w pamięci, gdzie znajduje się jakiś konkretny obiekt (na który został ustawiony wcześniej wskaźnik), to dodatkowo wskaźnik zawiera wiedzę jakiego typu jest ten obiekt, na który pokazuje. Dlatego wskaźnik służący do pokazywania na obiekty jednego typu nie nadaje się do pokazywania na obiekty innego typu. Wobec tego, podczas kompilacji takiego kawałka kody, pojawi się komunikat o błędzie: double *wsk; int x = 4; wsk = &x; //błąd!!! Próba wstawienia do wskaźnika do pokazywania //na obiekty double, adresu obiektu typu int Wiedza, jakiego typu jest obiekt, na który wskazuje (pokazuje) wskaźnik, jest niezbędna do tego aby móc poprawnie zinterpretować ten obiekt oraz (w przypadku, gdy mamy do czynienia z tablicą) ewentualnie poruszać się po sąsiednich obiektach. Zdarzają się jednak przypadki, choć bardzo rzadko, że wiedza ta nie jest nam potrzebna, a wręcz uniemożliwia nam działanie (np. gdy do jakiś starszych funkcji bibliotecznych trzeba wysłać adres jakiegoś obiektu w pamięci. Funkcję taką interesuje jedynie gdzie ten obiekt jest, a nie co w nim jest). W takich przypadkach możemy użyć wskaźnika, który pozbawiony jest wiedzy o typie, czyli wskaźnik bez typu, a mianowicie void. Taki wskaźnik co prawda może pokazywać na obiekty dowolnego typu (czyli zawierać adresy miejsc gdzie znajdują się obiekty dowolnego typu). Ale logiczne jest, że skoro taki wskaźnik jest pozbawiony wiedzy o tym na co pokazuje, nie może wyświetlać tego na co pokazuje i nie może ewentualnie poruszać sie po sąsiednich obiektach. 1.1 Główne zastosowania wskaźników ulepszenie pracy z tablicami funkcje mogące zmieniać wartości przesyłanych do nich argumentów dostęp do specjalnych komórek w pamięci rezerwacja obszarów w pamięci 1

1.1.1 Ulepszenie pracy z tablicami Przykład stosowania wskaźników do pokazywania na elementy tablic: int *wskaznik; //definicja wskaźnika int tablica[20]; //definicja tablicy 20-elementowej wskaznik = &tablica[4]; //ustawienie wskaźnika na element tablicy z indeksem 4 W instrukcji powyżej ustawiliśmy wskaźnik na element tablicy z indeksem 4 (piąty element licząc od zera, bo pamiętam, że elementy tablicy numerowane sa od zera!). W przypadku gdy chcemy ustawić wskaźnik na zerowy element tj. element początkowy tablicy, to przez analogię piszemy: wskaznik = &tablica[0]; //ustawienie wskaźnika na początkowy element tablicy Ale pamiętając, że: NAZWA TABLICY JEST RÓWNOCZEŚNIE ADRESEM ZEROWEGO JEJ ELE- MENTU. Stąd wynika prosty wniosek, że to samo co powyżej możemy uzyskać pisząc po prostu: wskaznik = tablica; //ustawienie wskaźnika na początkowy element tablicy Załóżmy teraz, ze po ustawieniu wskaźnika na element początkowy, chcemy go przesunąć o jedno miejsce w prawo, czyli na element o indeksie 1. Oczywiście można to napisać po prostu tak: wskaznik = &tablica[1]; //ustawienie wskaźnika na element tablicy o indeksie 1 ale skoro wiemy, że nazwa tablicy jest jednocześnie adresem jej zerowego (początkowego) elementu, to możemy to przesunięcie napisać następująco: wskaznik = tablica + 1; //ustawienie wskaźnika na element tablicy o indeksie 1 Pamiętając, że początkowo ustawiliśmy sobie wskażnik na zerowy element wskaznik = tablica;, to ostatnie wyrażenie jest w tym przypadku różnoznaczne z takim zapisem: wskaznik = wskaznik + 1; //ustawienie wskaźnika na element tablicy o indeksie 1 A to z kolei, jak już wiemy, jest zawsze równoznaczne, takiemu zapisowi: wskaznik++; Naturalnie, nie zawsze pojawia się potrzeba przesuwania wskaźnika o jedno miejsce w prawo. W sytuacji gdy chcemy przesuwać wskaźnikiem o n elementów w prawo wystarczy napisać: wskaznik += n; co jest równoznaczne z: wskaznik = wskaznik + n; Oczywiście, mozemy się poruszać w każdą stronę po elemenach tablicy, żeby przesuwać się w lewą str (czyli w stronę obniżania się wartości indeksów) znak + zastępujemy znakiem. Przy przesuwaniu się w taki sposób po elementach tablicy istnieje jednak pewna pułapka, możemy np. ustawić sobie wskaźnik na element tablicy, który tak naprawdę nie istnieje. W takiej sytuacji kompilator najczęściej nie pokaże nam błędu! Na przykład: int *wskaznik; //definicja wskaźnika int tablica[5]; //definicja tablicy pięcioelementowej wskaznik = &tablica[4]; //ustawienie wskaźnika na element tablicy z indeksem 4 wskaznik += 2; //przesunięcie wskaźnika o 2 pozycje w prawo, //czyli ustawienie go na element o indeksie 6 //a element taki nie istnieje!!!! 2

Kolejny przykład: wskaznik = tablica; //ustawienie wskaźnika na początkowy element tablicy wskaznik--; //przesuniecie wskaźnika o 1 element w lewo, //czyli na element o indeksie -1, a element taki nie istnieje!!!! Dodanie do wskaźnika jakieś liczby całkowitej powoduje, że pokazuje on tyleż elementów tablicy dalej. Niezależnie od tego, jakie są te elementy. Przykład zastosowania wskaźnika w pracy z tablicą: # include <iostream> # include <cmath> using namespace std; int main() int *wi; double *wd; int tabint[10] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; double tabdoub[10]; wd = tabdoub; for(int i = 0 ; i < 10 ; i++) *(wd++) = i / 100.0; wi = tabint; wd = tabdoub; for(int i = 0 ; i < 10 ; i++) cout << i << "-> \t" << *wi << "\t\t" << *wd << endl; 3

wi++; wd++; wi = &tabint[3]; wd = tabdoub + 5; for(int i = 0 ; i < 4 ; i++) *(wi++) = -111; *(wd++) = -555.5; cout << "tresc tablicy po wstawieniu nowych wartosci: \n"; wi = tabint; wd = tabdoub; for(int i = 0 ; i < 10 ; i++) cout << i << "-> \t" << *(wi++) << "\t\t" << *(wd++) << endl; system ("Pause"); return 0; 0-> 0------>0 1-> 1------>0.01 2-> 2------>0.02 3-> 3------>0.03 4-> 4------>0.04 5-> 5------>0.05 6-> 6------>0.06 7-> 7------>0.07 8-> 8------>0.08 9-> 9------>0.09 tresc tablicy po wstawieniu nowych wartosci: 0-> 0------>0 1-> 1------>0.01 2-> 2------>0.02 3-> -111------>0.03 4-> -111------>0.04 5-> -111------>-555.5 6-> -111------>-555.5 7-> 7------>-555.5 8-> 8------>-555.5 9-> 9------>0.09 Dozwolone operacje arytmetyczne na wskaźnikach to: 4

dodawanie i odejmowanie od nich liczb naturalnych - przesuwanie wskaźników odejmowanie dwóch wskaźników pokazujących na tę samą tablicę Odejmowanie od siebie dwóch wskaźników pokazujących na różne elementy tej samej tablicy, daje w rezultacie liczbę dzielących je elementów tablicy. Liczba ta może byc dodatnia lub ujemna. Wskaźniki można ze sobą porównywać, używając operatorów: ==! = < > <= >= Jeżeli dwa wskaźniki pokazuja na jakieś elementy tej samej tablicy, t wskaźnik, który jest mniejszy, pokazuje na obiekt o mniejszym indeksie. 1.1.2 Zastosowanie wskaźników w argumentach funkcji Przykład działania wskaźników w argumentach funkcji: # include <iostream> # include <cmath> using namespace std; float zwiekszacz (float *wsk); float funk_zwykla (float argument); //*************************************************************** int main () float m1, m2, n1, n2, *wskazn; cout << "podaj dwie liczby \n"; cin >> m1 >> m2; wskazn = &m1; n1 = zwiekszacz(&m1); n2 = funk_zwykla(m2); cout << "teraz pierwsza liczba wynosi: " << m1 << " a wartosc funkcji zwiekszacz wynosi: " << n1 << endl; cout << "po kolejnym wywolaniu funkcji jej wartosc wynosi: " << zwiekszacz(&m1) << endl; cout << "teraz druga liczba wynosi: " << m2 << " a wartosc funkcji zwyklej wynosi: " << n2 << endl; cout << "po kolejnym wywolaniu funkcji jej wartosc wynosi: " << funk_zwykla(m2) << endl; system ("pause"); return 0; float zwiekszacz (float *wsk) *wsk += 100; 5

return *wsk/100; float funk_zwykla (float argument) argument += 100; return argument/100; 6