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

Podobne dokumenty
Lab 9 Podstawy Programowania

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

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:

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

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

DYNAMICZNE PRZYDZIELANIE PAMIECI

Deklaracja struktury w C++

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

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

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Programowanie w języku C++

Wskaźniki w C. Anna Gogolińska

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

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

Wskaźniki. Informatyka

Jak napisać listę jednokierunkową?

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

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.

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

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

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

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

Język C++ zajęcia nr 2

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

Język C++ Różnice między C a C++

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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

Techniki Programowania wskaźniki

Struktury, unie, formatowanie, wskaźniki

Przekazywanie argumentów wskaźniki

Wykład 1: Wskaźniki i zmienne dynamiczne

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

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

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

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

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

Jak Windows zarządza pamięcią?

STL: Lekcja 1&2. Filozofia STL

Część 4 życie programu

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

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

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Programowanie komputerowe. Zajęcia 4

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania w języku C++

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

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

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

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

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

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

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

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

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

Zasady programowania Dokumentacja

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie i struktury danych

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy programowania w języku C++

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

r. Tablice podstawowe operacje na tablicach

1 Podstawy c++ w pigułce.

Zmienne i struktury dynamiczne

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

// deklaracja zmiennej typu int oraz wskaźnika na zmienne tego typu int zmienna = 10;

Techniki Programowania wskaźniki 2

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

I - Microsoft Visual Studio C++

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

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

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

Podstawy programowania w języku C++

Wyjątki (exceptions)

Programowanie obiektowe i C++ dla matematyków

Dynamiczne struktury danych

Wstęp do informatyki- wykład 11 Funkcje

Pytania sprawdzające wiedzę z programowania C++

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

O podstawowych operacjach na tablicach. Mateusz Ziółkowski, MBiU II

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

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

Wskaźniki. Programowanie Proceduralne 1

Czym jest stos i sterta?

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

Czym są właściwości. Poprawne projektowanie klas

Wstęp do informatyki- wykład 7

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

1 Podstawy c++ w pigułce.

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

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

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

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

Informatyka I: Instrukcja 4.2

Program 22. #include <iostream> using namespace std; struct Osoba { string Imie; string Nazwisko; char Plec; int RokUr; };

Programowanie komputerowe. Zajęcia 1

Transkrypt:

Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie wskaźnikami znacznie przyśpiesza wydajność czasową programu, zmniejsza zużycie pamięci oraz skraca kod źródłowy. Czym są wskaźniki? Wskaźnik (ang. pointer) typ zmiennej odpowiedzialnej za przechowywanie adresu do innej zmiennej (innego miejsca w pamięci) w obrębie naszej aplikacji. Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami: * operator wyłuskania wartości zmiennej, na którą wskazuje wskaźnik (wyciąga wartość ze wskaźnika) & operator pobrania adresu danej zmiennej, tablicy, struktury itp (pobiera adres zmiennej) Po co są wskaźniki? Wiele początkujących osób zastanawia się po co istnieją wskaźniki C++? Zanim przeczytasz resztę artykułu, postaram Ci się to przybliżyć. W języku C++ możemy do funkcji przekazać dowolną ilość parametrów. Modyfikując parametry w obrębie ciała funkcji oryginalne zmienne nie zmienią się. Przekazując zmienne do funkcji poprzez wartość (czyli w sposób standardowy), tworzymy wewnątrz funkcji ich kopię! Co z tego faktu wynika? Każda funkcja w C++ może zmodyfikować maksymalnie jedną zmienną, za pomocą wartości zwracanej return. Korzystając z mojego talentu graficznego zobrazowałem Ci przekazywanie parametrów do funkcji poprzez wartość. Jesteśmy w stanie zmodyfikować wartość zmiennej a, ale nie jesteśmy w stanie zmienić innych zmiennych. Karol Trybulec p-programowanie.pl

Co zrobić, aby jedną funkcją zmodyfikować zmienne na raz? Nie można użyć rozkazu return razy, ponieważ każda funkcja zwraca tylko jedną wartość. W tej sytuacji trzeba skorzystać ze wskaźników. Jeżeli przekażemy do funkcji jako jej argument wskaźnik, wtedy operacje na wskaźniku zmieniają zmienną oryginalną z poza ciała funkcji nie operujemy na kopii zmiennej. Dzięki temu, nawet jeżeli funkcja jest typu void i nic nie zwraca, możemy modyfikować wiele zmiennych z poza ciała funkcji: Jak używać wskaźników Zmienna wskaźnikowa (czyli wskaźnik) poprzedzona jest gwiazdką (*) i przechowuje adres pamięci (a nie wartość) zmiennej, na którą wskazuje. Deklarując wskaźnik postępujemy tak jak ze zwykłymi zmiennymi, jednak nazwę wskaźnika poprzedzamy gwiazdką. Uwaga! Gwiazdka przed nazwą wskaźnika nie ma związku z operatorem wyłuskania! int telefon; int *wsk; //zmienna wskaźnikowa typu liczbowego Tak wygląda tworzenie wskaźnika. Utworzone przez nas zmienne są puste. Zmienna telefon nie zawiera żadnej wartości a wskaźnik wsk nie wskazuje żadnej wartości. Bardzo ważne jest aby nie korzystać ze wskaźnika który nie wskazuje na żadną zmienną! Prowadzi to zawsze do błędów i niesie ze sobą nieprzewidziane konsekwencje! Rozbudujmy powyższy przykład: int telefon = ; int *wsk = &telefon; //wskaźnik wsk zawiera adres zmiennej telefon Karol Trybulec p-programowanie.pl

Za pomocą operatora pobrania adresu (&) pobraliśmy adres zmiennej telefon. Adres zmiennej został przypisany wskaźnikowi wsk. Pamiętaj że gwiazdka przed nazwą wskaźnika to nie operator wyłuskania! Chcąc wyświetlić wartość wskaźnika posłużymy się operatorem wyłuskania czyli gwiazdką (*). #include <iostream> using namespace std; int main() int telefon = ; 8 int *wsk = &telefon; //wskaźnik wsk zawiera adres zmiennej telefon 0 cout << *wsk << endl; return ; } Powyższy przykład wyświetli na ekranie wartość zmiennej telefon. Przed wyświetleniem wskaźnika został użyty operator wyłuskania. Pobiera on wartość zmiennej spod adresu ze zmiennej wskaźnikowej. Bez użycia operatora wyłuskania, została by wyświetlona wartość zmiennej wskaźnikowej wsk czyli adres zmiennej telefon: int telefon = ; int *wsk = &telefon; //przypisanie wskaźnikowi adresu zmiennej telefon cout << *wsk << endl; //wyświetlenie wyłuskanej wartości wskaźnika () cout << wsk << endl; //wyświetlenie adresu zmiennej telefon cout << &wsk << endl; //wyświetlenie adresu wskaźnika cout << &telefon << endl; //wyświetlenie adresu zmiennej telefon Używając sizeof na wskaźniku nie mozna zapomnieć o operatorze wyłuskania. W przeciwnym wypadku wynikiem zawsze będzie ta sama wartość, ponieważ każda zmienna wskaźnikowa ma ten sam rozmiar w pamięci. Rzeczą normalną są wskaźniki do wskaźników. Przy ich wyświetlaniu ważna jest ilość operatorów wyłuskania. Jeżeli do wskaźnika drugiego stopnia użyjemy jednego operatora wyłuskania wtedy otrzymamy adres wskaźnika a nie wartość zmiennej na którą wskazują. int telefon = ; int *wsk = &telefon; //wskaźnik wsk zawiera adres zmiennej telefon int **wsk = &wsk; //wskaźnik wsk zawiera adres wskaźnika wsk cout << **wsk << endl; Karol Trybulec p-programowanie.pl

Wskaźniki poddają się rzutowaniu typów. W dowolnym momencie możemy zmienić typ zmiennej wskaźnikowej np. z int na long. Wartość wskaźnika (zmiennej na którą wskazuje) możemy modyfikować bez uzycia nazwy zmiennej: int telefon = ; int *wsk = &telefon; *wsk = ; cout << *wsk << endl; //wskaźnik wsk zawiera adres zmiennej telefon Totalnie błędna byłaby sytuacja, kiedy chcemy nadać zmiennej wskaźnikowej określoną wartość, bez wcześniejszego przypisania wskaźnika do określonej zmiennej: int *wsk; *wsk = ; //źle!! Wskaźniki generyczne Zwykłe wskaźniki używane są aby wskazywać na określony obiekt określonego typu, np zmienna tekstowa, zmienna liczbowa czy struktura. Wskaźniki generyczne dają nam możliwość wskazywania na określony obszar pamięci aplikacji bez ustalania typu wskaźnika. Oznacza to że wskaźnik generyczny będzie miał typ void. int telefon = ; void *wsk = &telefon; //wskaźnik generyczny wsk typu void Przed wykonaniem operacji na wskaźniku generycznym i przed jego wyświetleniem, musimy określić wielkość na jaką wskazuje. W powyższym przykładzie jest to int: Karol Trybulec p-programowanie.pl

#include <iostream> using namespace std; int main() int telefon = ; 8 void *wsk = &telefon; //wskaźnik generyczny wsk typu void 0 *(int*)wsk = ; cout << *(int*)wsk << endl; return ; } Wskaźniki i funkcje W języku C++ przekazujemy argumenty do funkcji poprzez tzw. przekazywanie przez wartość. W języku C oraz C++ możemy przekazywać wartości do funkcji poprzez przekazywanie przez wskaźnik. Wskaźnik będzie wtedy argumentem funkcji. 8 0 8 0 #include <iostream> using namespace std; // funkcja przyjmuje jako argument wskaźnik void zwieksz_liczbe (int *liczba) *liczba+= ; } int main() int numerek = ; int *wsk = &numerek; } zwieksz_liczbe(wsk); //przekazujemy wskaźnik (bez operatorów) cout << numerek << endl; zwieksz_liczbe(&numerek); //przekazujemy bezpośrednio adres zmiennej (operator &) cout << numerek << endl; return ; Karol Trybulec p-programowanie.pl

Należy zwrócić uwagę, że do funkcji której argumentem jest wskaźnik, przekazujemy adres zmiennej za pomocą operatora pobrania adresu (&) a nie samą wartość. Więcej o przekazywaniu wskaźników do funkcji dowiesz się w artykule: przekazywanie argumentów do funkcji C++. Wskaźniki i tablice Tablice są sciśle związane ze wskaźnikami. Nazwa tablicy to wskaźnik na jej pierwszy element. Oznacza to że możemy wyświetlić pierwszy element tablicy umieszczając operator wyłuskania przed jej nazwą: int tablica[] =,,,, }; cout << *tablica << endl; Możemy także tworzyć wskaźniki do określonych elementów tablicy: int tablica[] =,,,, }; int *wsk = &tablica[]; cout << *wsk << endl; Stringi w C to tablica charów. Tworząc wskaźnik będzie to już wskaźnik do wskaźnika a nie zwykły wskaźnik. char* wyraz = "test"; char **wsk = &wyraz; Często spotykane są także tablice wskaźników. Ich tworzenie jest proste i analogiczne do innych typów zmiennych: 8 0 #include <iostream> using namespace std; int main() int liczba =, liczba =, liczba = ; int *wsk[]; } wsk[] = &liczba; wsk[] = &liczba; wsk[] = &liczba; cout << *wsk[] << endl; return ; Karol Trybulec p-programowanie.pl

Dynamiczna alokacja pamięci Często podczas działania programu pojawia się problem dynamicznego zarządzania pamięcią. Problem fajnie można zaprezentować na przykładzie tablicy o różnej ilości elementów. Z pomocą przychodzą wskaźniki oraz operatory new i delete. Najpierw tworzymy wskaźnik określonego typu a następnie zmienną o dowolnej wielkości. Potem przydzielamy wskaźnikowi adres nowej zmiennej utworzonej na stercie: #include <iostream> using namespace std; int main() int *zmienna; 8 zmienna = new int[]; zmienna[] = ; 0 cout << *zmienna << endl; delete zmienna; return ; } W C odpowiednikami new i delete są operatory malloc i free. Można używać operatorów C jak i C++, należy jednak pamiętać aby ich nie mieszać! (malloc + delete oraz new + free)! Dynamiczne tworzenie zmiennych daje nam duże możliwości. Ważne jest aby usuwać je kiedy są niepotrzebne. W przeciwnym wypadku istnieje szansa wystąpienia błędu memory leak. Karol Trybulec p-programowanie.pl