Wskaźniki. Definiowanie wskaźników Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Real; Przykłady: Wskaźnik.

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Programowanie obiektowe
Zmienne i Typy.
1 Wskaźniki w C Podstawy podstaw podstaw podstaw.....
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Podstawy informatyki Powtórka Grupa: 1A Prowadzący: Grzegorz Smyk
Podstawy informatyki Informatyka stosowana Prowadzący: Grzegorz Smyk
Struktury.
Tablice.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Dynamiczne struktury danych 1
Typy wskaźnikowe ogólne 1 Typy wskaźnikowe ogólne (general access types) umożliwiają pośredni dostęp (indirect access), czyli przez wskaźniki, do zadeklarowanych.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Podstawy programowania
Podstawy programowania PP – LAB5 Wojciech Pieprzyca.
Polsko – Japońska Wyższa Szkoła Technik Komputerowych
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Podstawy informatyki 2013/2014
Podstawy programowania II
Podstawy informatyki (4)
Podstawy programowania w języku C i C++
Podstawy informatyki 2013/2014
Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Float; Przykład: Wskaźnik przechowuje adres obiektu wskazanego.
struct nazwa { lista składników }; Dostęp do składowych struktury Nazwa_Zmniennej_Strukturalnej. Nazwa_Składnika.
Wczytywanie danych z klawiatury, komentarze, zmienne.
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
Jerzy F. Kotowski1 Informatyka I Wykład 11 STRUKTURY I UNIE.
Procedury i funkcje.
Podstawy programowania
Programowanie obiektowe III rok EiT
Podstawy programowania w języku C i C++
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Jerzy F. Kotowski1 Informatyka I Wykład 15 PIERWSZE KROKI.
Programowanie obiektowe III rok EiT
Inicjalizacja i sprzątanie
Jerzy Kotowski Politechnika Wrocławska
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
jeszcze dygresja o macierzach...
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 8 ( )
Programowanie w języku C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Zmienne i typy danych w C#
Kurs języka C++ – wykład 4 ( )
Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model.
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
1 Opisy funkcji Adres strony WWW : html (należy odszukać hyperlink Function Index) (
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 4 ( )
Wskaźniki Elżbieta Labocha.
Opisy funkcji Adres strony WWW :
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

Wskaźniki

Definiowanie wskaźników Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Real; Przykłady: Wskaźnik przechowuje adres obiektu wskazanego typu. Wskaźnik służący do pokazywania obiektów jednego typu nie nadaje się do pokazywania obiektów innego typu.

Praca ze wskaźnikiem Do nadania wskaźnikowi wartości początkowej służy jednoargumentowy operator &. Oblicza on adres obiektu, który stoi po prawej stronie operatora przypisania. Przykład: int * w;// definicja wskaźnika do obiektów //typu int int k = 10; // definicja i inicjalizacja zwykłego //obiektu typu int w = &k;// ustawienie wskaźnika na obiekt k cout << * w;// wypisanie zawartości obiektu * w

Praca ze wskaźnikiem #include void main () { int zmienna = 8, druga = 4; int *wskaznik; clrscr (); wskaznik = &zmienna;// ustawienie // wskaźnika na zmienna cout << "zmienna = " << zmienna << "\n a odczytana przez wskaźnik = " << * wskaznik << endl; cdn.

zmienna = 10; cout << "zmienna = " << zmienna << "\n a odczytana przez wskaźnik = " << * wskaznik << endl; * wskaznik = 200; cout << "zmienna = " << zmienna << "\n a odczytana przez wskaźnik = " << * wskaznik << endl; wskaznik = &druga; cout << "zmienna = " << zmienna << "\n a odczytana przez wskaźnik = " << * wskaznik << endl; }

Uwagi: Do danego obiektu można odnosić się na dwa sposoby: Operacja odniesienia się * do danego obiektu może być zarówno po prawej, jak i po lewej stronie operatora przypisania, np.: przez jego nazwę przez zorganizowanie wskaźnika, który będzie na ten obiekt pokazywał. a = * Wskaznik; * Wskaznik = a;

Wskaźnik typu void: Wskaźnik jest to adres miejsca w pamięci plus informacja o tym, jakiego typu obiekt się pokazuje. Można jednak zdefiniować wskaźnik bez tej wiedzy: void * Wsk; gdzie * Wsk jest wskaźnikiem dowolnego typu void.

Przykład: int * wi1, * wi2; float * wf; wi1 = wi2; wf = wi1;// błąd wf = ( float *) wi1; void * wv; char * wch; int * wi; float * wf; wv = wf; wv = wch; wv = wi;

Uwagi: Wskaźnik każdego niestałego typu można przypisać wskaźnikowi typu void; Wskaźnika typu void nie można przypisać wskaźnikowi prawdziwemu. Trzeba w takich przypadkach posłużyć się operatorem rzutowania: wf = (float *) wv; wi = (int *) wv; wch = (char *) wv;

Podstawowe zastosowanie wskaźników: wskaźniki do tablic umożliwiające ulepszenie pracy z tablicami; funkcje zmieniające wartości przesyłanych do nich argumentów; rezerwacja obszarów pamięci.

Wskaźniki do tablic Nazwa tablicy jest równoważna (prawie...) wskaźnikowi do jej pierwszego elementu const int MAX = 20; int *Wsk;// definicja wskaźnika na obiekty typu int int Tab[MAX]; Wsk = Tab; lub Wsk = &Tab[0];

Wskaźniki do tablic int *Wsk; // definicja wskaźnika na obiekty typu int int Tab[20]; // definicja tablicy typu int Wsk = &Tab [i];// ustawienie wskaźnika na i-ty element //tablicy Tab Wsk = &Tab [0]; // inaczej: Wsk = Tab; Wsk = Wsk + 1; // inaczej: Wsk ++; Wsk += n; // inaczej: Wsk = Wsk + n;

Dwie poniższe instrukcje są równoważne: Wsk = &Tab[0]; Wsk = Tab; Dwa poniższe zapisy są także równoważne: Tab + 4 &Tab [4]; Jeśli Wsk = Tab, to: Wsk++; Tab++;// BŁĄD Nazwa tablicy jest stałym wskaźnikiem do niej samej! Tab[5] *(Tab + 5)//zapisy równoważne

Wskaźniki tablic można od siebie odejmować. Odjęcie od siebie dwóch wskaźników pokazujących na różne elementy tej samej tablicy daje w wyniku liczbę dzielących je elementów tablicy. Liczba ta może być dodatnia lub ujemna. Wskaźniki można też ze sobą porównywać za pomocą operatorów relacji.

Przesyłanie tablic do funkcji: Do funkcji przesyłamy adres tablicy, np.: void fun ( int tab [ ] ); Odbieramy tablicę z funkcji na dwa sposoby: jako tablicę jako wskaźnik

Wskaźnik do obiektu const Jeśli funkcja otrzymuje adres tablicy, to pracuje w tym przypadku na oryginale tablicy i może dowolnie zmieniać wartości jej elementów. Jeśli nie chcemy, aby funkcja te wartości zmieniała, to należy posłużyć się wskaźnikiem do stałego obiektu. Taki wskaźnik wskazuje na obiekty, ale nie pozwala na ich modyfikację.

Stałe wskaźniki: Dotychczas mówiliśmy o wskaźnikach do obiektów stałych. Są to wskaźniki, które nie mogą zmieniać pokazywanego obiektu. Traktują go jako obiekt stały. Sam obiekt, na który pokazują nie musi być rzeczywiście stały. Ważne jest to, że wskaźnik tak go traktuje. Są jeszcze inne wskaźniki z przydomkiem const, które nazywamy wskaźnikami stałymi. int Dworzec; int * const Wsk = & Dworzec;

Stałe wskaźniki, a wskaźniki do stałych: Stały wskaźnik to taki, który zawsze pokazuje to samo. Nie można nim poruszać. Wskaźnik do stałego obiektu, to taki wskaźnik, który uznaje pokazywany obiekt za stały. Nie można go więc modyfikować. Te dwa typy wskaźników można ze sobą łączyć, np. const float * const Wsk = &a;

Wskaźnik zawsze na coś pokazuje: Jeden z najczęściej popełnianych błędów w programach ze wskaźnikami jest brak początkowego ustawienia wskaźnika. Przy braku ustawienia następuje odczyt z przypadkowego miejsca w pamięci oraz zapis do przypadkowego miejsca. void fun () { float a; float * x, * m:// definicja wskaźników bez inicjalizacji m = &a;// ustawienie wskaźnika m *x = 20.5; // wskaźnik x nie jest ustawiony! // w tym momencie możemy skasować // potrzebną daną }

Rezerwacja obszarów pamięci: Rezerwowanie i zwalnianie obszarów pamięci jest wykonywane za pomocą operatorów new i delete. Operator new zajmuje się kreacją, a delete unicestwianiem obiektów. Przykłady: char * Wsk; Wsk = new char;// utworzenie nowego obiektu t. char delete Wsk;// zlikwidowanie tego obiektu float * w; w = new float [10]; delete [ ] w; int * Wsk; Wsk = new int ( 50 );

Cechy obiektów stworzonych operatorem new: Obiekty takie istnieją od momentu, gdy je stworzyliśmy operatorem new do momentu, gdy je skasujemy operatorem delete. Więc, programista decyduje o czasie ich życia. Obiekt tak utworzony nie ma nazwy. Można nim operować tylko za pomocą wskaźników. Obiektów tych nie obowiązują zwykłe zasady o zakresie ważności. Jeśli tylko w danej chwili jest dostępny choćby jeden wskaźnik, który na taki obiekt wskazuje, to mamy dostęp do tego obiektu. Tylko statyczne obiekty są inicjalizowane wstępnie zerami. Natomiast obiekty utworzone operatorem new po utworzeniu przechowują wartości przypadkowe.

Dynamiczna alokacja tablicy: int * Wsk_Tab; Wsk_Tab = new int [ Rozmiar ]; Rozmiar jest wyrażeniem typu int. Została stworzona nienazwana tablica elementów typu int. Wynikiem działania operatora new jest wskaźnik do początku tej tablicy. Operator new daje swobodę. Tablica definiowana jest dynamicznie, w trakcie wykonywania programu, np.:

cout << Ile elementów ma mieć tablica?: ; int Rozmiar; cin >> Rozmiar; int * Wsk_Tab = new int [ Rozmiar ]; * Wsk_Tab = 50;// wpisanie do zerowego elementu // liczby 50 Wsk_Tab [0] = 50;// to samo inaczej * (Wsk_Tab + 4) = 100;// wpisanie do elementu o indeksie 4 // wartości 100 Wsk_Tab [4] = 100;// to samo inaczej delete [ ] Wsk_Tab;// zlikwidowanie wykreowanej // tablicy

Sposoby ustawienia wskaźników: Wskaźnik można ustawić tak, aby pokazywał na jakiś obiekt, wstawiając do niego adres wybranego obiektu: Wsk = & Obiekt; Wskaźnik można również ustawić na to samo, na co pokazuje już inny wskaźnik. Jest to zwykła operacja przypisania wskaźników: Wsk = Nowy_Wsk; cdn.

Wskaźnik ustawia się na początek tablicy podstawiając do niego jej adres. W zapisie jest niepotrzebny operator &: Wsk = Tablica Wskaźnik może także pokazywać na funkcję. Nazwa funkcji jest także jej adresem, zatem i tu zbędny jest operator &: Wsk = Funkcja; Operator new zwraca adres nowoutworzonego obiektu. Taki adres wpisujemy do wskaźnika. Od tej pory wskaźnik pokazuje na ten nowy obiekt: float * Wsk; Wsk = new float; Jeśli wskaźnik ma pokazywać na ciąg znaków, można go ustawić w taki sposób: Wsk = Programowanie komputerów ;

Tablice wskaźników: Elementami tablic mogą być wskaźniki, czyli adresy różnych miejsc w pamięci, np.: float * Wsk_Flo [10]; lub float * (Wsk_Flo [10]); char * Wsk_Lan [ 3]; char * Wsk_Lan [3] = { Matematyka, Fizyka, Progr. Komputerów }; char * Wsk = { abcde };

Przykład 1: Obliczyć wartości dwóch następujących całek: wykorzystując metodę Simpsona.

Przybliżony wzór na obliczenie całki ma następującą postać: gdzie: - długość podprzedziału m - jest parzystą liczbą podprzedziałów.

#include void main () { int a = 1; int *Adr; int &r_a = a; Adr = &a; clrscr(); cout << *Adr << endl; cout << &r_a << endl; cout << &a << endl; cout << Adr << endl; cout << a << endl; cout << r_a << endl; r_a = 2; Adr = &r_a; cout << Adr << endl; cout << *Adr << endl; } Wskaźnik a referencja 1 0x8fa0fff4 1 0x8fa0fff4 2