Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model.

Slides:



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

C++ wykład 4 ( ) Przeciążanie operatorów.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Standardowa biblioteka języka C++
Zmienne i Typy.
1 Wskaźniki w C Podstawy podstaw podstaw podstaw.....
Static, const, volatile.
PROGRAMOWANIE STRUKTURALNE
Microsoft Exchange Server 2003 Obieg dokumentów
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
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.
Struktury.
Tablice.
C++ wykład 2 ( ) Klasy i obiekty.
Dynamiczne struktury danych 1
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Podstawy programowania PP – LAB5 Wojciech Pieprzyca.
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
Typy wskaźnikowe, dynamiczne struktury danych
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Podstawy programowania II
Podstawy informatyki (4)
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.
Podstawy programowania
Wczytywanie danych z klawiatury, komentarze, zmienne.
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Jerzy F. Kotowski1 Informatyka I Wykład 11 STRUKTURY I UNIE.
Procedury i funkcje.
Podstawy programowania
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Andrzej Repak Nr albumu
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.
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++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski 1 informatyka +
Programowanie strukturalne i obiektowe C++
Zmienne i typy danych w C#
Kurs języka C++ – wykład 4 ( )
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.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
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.
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Kurs języka C++ – wykład 3 ( )
Wskaźniki Elżbieta Labocha.
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:

Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model jest zalecany w przypadku ograniczenia na pamięć.

Small - mały zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP obszar wolny STACK Far HEAP obszar wolny reszta pamięci do 64 K Model jest zalecany dla średnich aplikacji.

Medium - średni Model jest stosowany w aplikacjach: duży kod (> 64 K) mało danych (< 64 K) Compact - skondensowany Model jest stosowany w aplikacjach: mały kod (< 64 K) wiele danych (> 64 K)

Large - wielki Model jest stosowany w bardzo dużych aplikacjach: duży kod (> 64 K) wiele danych (> 64 K) Huge - potężny Model jest stosowany w bardzo dużych aplikacjach: duży kod (> 64 K) zmienne inicjalizowane (> 64 K)

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, drugi = 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 = &drugi; cout << "zmienna = " << zmienna << "\n a odczytana przez wskaźnik = " << * wskaznik << endl; } ( przykład: PROG36.CPP )

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;

#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 0x8fa0fff

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;  dostęp do specjalnych obszarów pamięci;  rezerwacja obszarów pamięci. ( przykłady: PROG37.CPP, PROG38.CPP )

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. ( przykład: PROG39.CPP ) Wskaźniki można też ze sobą porównywać za pomocą operatorów relacji. ( przykład: PROG40.CPP )

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 ( przykład: PROG41.CPP)

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ę. ( przykład: PROG42.CPP )

Dostęp do konkretnych komórek pamięci Ustawiamy wskaźnik na żądaną komórkę wpisując do niego konkretny adres: Wsk = 56789; cout <<  Obecna temperatura  << * Wsk;

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. ( przykład: PROG43.CPP )

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 ( przykłady: PROG44.CPP, PROG45.CPP )

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; ( przykłady: PROG46.CPP, PROG47.CPP, PROG48.CPP )

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ą }

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; cdn.

 Wskaźnik można ustawić aby pokazywał konkretną komórkę w pamięci, np.: Wsk = ;  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łady: PROG49.CPP, PROG50.CPP )

Wskaźniki do funkcji: Wskaźnik może także pokazywać na funkcję, np.: int (* Wsk_Fun) ( );  Jest to wskaźnik do funkcji wywoływanej bez żadnych argumentów i zwracającej wartość typu int.  Bardzo ważne są tu nawiasy okrągłe. Gdybyśmy je opuścili i napisali definicję: int * Wsk_F ( ); to byłaby to deklaracja funkcji, a nie wskaźnika do funkcji; Jest to funkcja wywoływana bez żadnych argumentów, a zwracająca wskaźnik typu int.

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.

( przykład: CALKA1.CPP, CALKA2.CPP )

Przykład: const int Wysokosc = 25;// definicja stałego obiektu typu int const int * Stały_Wsk;// definicja stałego wskaźnika int * Zwykly_Wsk;// definicja zwykłego wskaźnika Staly_Wsk = & Wysokosc;// ustawienie wskaźnika na obiekcie // Wysokosc; // obiekt jest stały i wskaźnik jest stały: // instrukcja przypisania jest poprawna; Zwykly_Wsk = & Wysokosc;// operacja błędna, ponieważ wskaźnik // jest zwykły, a obiekt stały.

Programy demonstracyjne: PROG36.CPP  PROG43.CPP PROG46.CPP  PROG52.CPP PROG87.CPP