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

Podobne dokumenty
Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

Wykład 1: Wskaźniki i zmienne dynamiczne

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

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:

Lab 9 Podstawy Programowania

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

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

Zmienne i struktury dynamiczne

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

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Wskaźniki. Informatyka

Techniki Programowania wskaźniki

Programowanie komputerowe. Zajęcia 4

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

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

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

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

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

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

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

Stałe, tablice dynamiczne i wielowymiarowe

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

Wykład 4: Klasy i Metody

Programowanie obiektowe W3

Podstawy programowania w języku C++

Techniki Programowania wskaźniki 2

Podstawy programowania w języku C++

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Programowanie w języku C++

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

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

Programowanie obiektowe w C++ Wykład 1

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

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

Podstawy programowania w języku C++

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

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

Laboratorium nr 10. Temat: Funkcje cz.2.

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Algorytmy i język C++

tablica: dane_liczbowe

Podstawy programowania komputerów

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

#include <iostream.h> #include <conio.h>

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

Języki i techniki programowania Ćwiczenia 2

Język C zajęcia nr 11. Funkcje

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

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

Zajęcia 6 wskaźniki i tablice dynamiczne

Konstruktor kopiujacy

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Programowanie i struktury danych

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wykład 8: klasy cz. 4

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

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

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

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

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Podstawy Programowania C++

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

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Deklaracja struktury w C++

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

Język C, tablice i funkcje (laboratorium, EE1-DI)

Podstawy programowania w języku C++

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wskaźniki w C. Anna Gogolińska

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

Podstawy Programowania Obiektowego

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Dynamiczne struktury danych

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Alokacja pamięci dla tablicy dwuwymiarowej

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wstęp do wskaźników i dynamicznej alokacji pamięci w językach ANSI C i C++

IX. Wskaźniki.(3 godz.)

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

MATERIAŁY DO ZAJĘĆ II

r. Tablice podstawowe operacje na tablicach

Programowanie i struktury danych

Język C, tablice i funkcje (laboratorium)

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

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

Język C zajęcia nr 12. Struktury i unie

Transkrypt:

Laboratorium nr 9 Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium: wskaźniki referencje zastosowanie wskaźników wobec tablic dynamiczny przydział pamięci, operatory new i delete tablice dynamiczne jak sprawdzić, czy operacja alokacji pamięci się powiodła? zadania laboratoryjne

Wskaźniki

Każda zmienna ma unikalny adres wskazujący obszar pamięci zajmowany przez tą zmienną. Adres ten można przechowywać w tzw. zmiennej wskaźnikowej (wskaźniku). Wskaźnik to obiekt (zmienna), która przechowuje adres do innego obiektu (zmiennej). Przed użyciem wskaźnika, musimy go przypisać do konkretnego obiektu (przypisać mu adres tego obiektu). Wskaźnik można łatwo przestawić, by pokazywał na inny obiekt tego samego typu. Do każdego wskaźnika można podstawić adres 0, zwany czasem NULL (np. wsk=0; lub wsk=null;). Ustawienie wskaźnika na ten adres powoduje, że wskaźnik nie pokazuje na nic sensownego.

Wskaźnik float pi=3.14; //definicja zmiennej pi float *wsk=π //definicja wskaźnika do zmiennej typu float LUB float *wsk; wsk=π cout<< wartosc zmiennej pi: <<pi; cout<< wartosc zmiennej wsk: <<wsk; cout<< adres zmiennej pi: <<π cout<< adres zmiennej wsk: <<&wsk; 3.14 FFF0 FFF0 FFFF pi=3.141; *wsk=3.1415; //zmiana wartości zmiennej pi //zmiana wartości zmiennej pi za pomocą wskaźnika cout<< wartosc pi za pomoca wskaznika: <<*wsk; 3.1415 adres FFF0 pi=3.14 adres FFFF wsk=fff0

Referencje

Referencja jest inną nazwą obiektu (zmiennej). Podczas definiowania referencji trzeba ją od razu zainicjalizować. Referencja nie jest kopią zmiennej, ale tą samą zmienną pod inną nazwą.

Referencja int a=5; //definicja i inicjalizacja zmiennej a int &ref=a; //definicja referencji o nazwie ref, //oraz ustawienie jej na zmienną a cout<< wartosc zmiennej a: <<a; cout<< wartosc zmiennej ref: <<ref; 5 5 ref++; //dodanie do ref wartosci 1 cout<< wartosc zmiennej a: <<a; cout<< wartosc zmiennej ref: <<ref; 6 6 cout<< adres zmiennej a: <<&a; cout<< adres zmiennej ref: <<&ref; FFF0 FFF0 adres FFF0 a=5 ref=5

Zastosowanie wskaźników wobec tablic

Przykład z ruchu wskaźnika wobec tablicy: int *wskaznik; //definicja wskaźnika do typu int int tablica[10]={0,1,2,3,4,5,6,7,8,9}; //definicja 10-elem. tablicy typu int wskaznik=&tablica[0]; //ustawienie wskaźnika na początek tablicy (element 0) wskaznik=tablica; //ustawienie wskaźnika na początek tablicy (element 0) cout<<*wskaznik<<endl; //wyświetlenie pierwszego elementu (liczba 0) wskaznik=&tablica[3]; //ustawienie wskaźnika na 4 element tablicy cout<<*wskaznik<<endl; //wyświetlenie 4 elementu (liczba 3) wskaznik=wskaznik+1; //przesunięcie wskaźnika na 5 element tablicy cout<<*wskaznik<<endl; //wyświetlenie 5 elementu (liczba 4) wskaznik++; //przesunięcie wskaźnika na 6 element tablicy cout<<*wskaznik; //wyświetlenie 6 elementu (liczba 5) cout<<*wskaznik++; //wyświetlenie 6 elementu (liczba 5) //i przesunięcie wskaźnika na element 7 cout<<*wskaznik<<endl; //wyświetlenie 7 elementu (liczba 6) cout<<*(wskaznik++); //wyświetlenie 7 elementu (liczba 6) //i przesunięcie wskaźnika na element 8 cout<<*wskaznik<<endl; //wyświetlenie 8 elementu (liczba 7) cout<<*(wskaznik+1); //wyświetlenie 9 elementu (liczba 8) (bez przesuwania wskaźnika) wskaznik+=2; //przesuniecie wskaźnika na 10 (ostatni element tablicy) cout<<*wskaznik<<endl; //wyświetlenie 10 elementu (liczba 9) wskaznik++; cout<<*wskaznik<<endl; //UWAGA: niebezpieczne, wskaźnik poza obszarem tablicy!!! //wyświetlenie elementu spoza tablicy (śmieć) Zostaną wyświetlone elementy tablicy w następującym porządku: 0 3 4 5 5 6 6 7 8 9 śmieć

Dynamiczny przydział pamięci, operatory new i delete

Operatory new i delete służą do dynamicznego alokowania pamięci operacyjnej komputera. Mogą być wykorzystane dla dowolnego typu danych, tj. wbudowanego lub zdefiniowanego przez użytkownika. Dynamiczne przydzielanie pamięci umożliwia programiście tworzenie i usuwanie zmiennych, a tym samym pełne sterowanie czasem ich istnienia. Zmienne przechowywane są w specjalnie wydzielonym obszarze pamięci do swobodnego używania (ang. heap zapas, ang. free store swobodnie dostępny magazyn). Do przydzielania i zwalniania pamięci służą odpowiednio słowa kluczowe new i delete. Za pomocą operatora delete kasuje się tylko obiekty stworzone operatorem new. Dostęp do zmiennych dynamicznych umożliwiają wskaźniki. Cechy obiektów stworzonych operatorem new: 1 obiekty istnieją od momentu ich utworzenia operatorem new do momentu skasowania operatorem delete, to my decydujemy o czasie życia obiektów 2 obiekty takie nie mają nazwy, można nimi operować tylko za pomocą wskaźników 3 obiektów tych nie obowiązują zwykłe zasady o zakresie ważności, czyli to, w których miejscach programu są widzialne lub niewidzialne 4 w obiektach dynamicznych (tworzonych operatorem new) zaraz po ich utworzeniu tkwią jeszcze śmieci (przypadkowe wartości), musimy zatem zadbać o wstępną inicjalizację tych obiektów

Przykład 1: float *nazwa; nazwa = new float; //definicja wskaźnika do typu float //utworzenie obiektu float o odpowiedniej wielkości LUB float *nazwa = new float; //można w jednej linii zaalokować pamięć *nazwa=1; delete nazwa; nazwa=0; //zapisanie wartości 1 do obiektu typu float //zwolnienie pamięci zajmowanej przez obiekt //odłączenie wskaźnika od pamięci Przykład 2: int *wsk; wsk = new int(10); LUB int *wsk = new int(10); cout<<*wsk<<endl; delete wsk; wsk=0; //definicja wskaźnika do typu int //inicjalizacja dynamicznie zaalokowanej pamięci //można w jednej linii zaalokować pamięć //wyświetlenie zawartości obiektu //zwolnienie pamięci zajmowanej przez obiekt //odłączenie wskaźnika od pamięci UWAGA: Po zwolnieniu zaalokowanej wcześniej pamięci, nadaj wskaźnikowi, którym się posługiwałeś wartość 0, aby mieć do niej dostęp. Spowoduje to odłączenie wskaźnika od tego obszaru pamięci.

Tablice dynamiczne

Przykład 1: float *t; t = new float[10]; //definicja wskaźnika do typu float //utworzenie 10-elementowej tablicy typu float LUB float *t = new float[10]; //można w jednej linii zaalokować tablicę for(int i=0;i<10;i++) cin>>t[i]; delete [] t; t=0; //wczytanie danych do tablicy //zwolnienie pamięci zajmowanej przez tablicę //odłączenie wskaźnika od pamięci Przykład 2: int *tab,rozmiar=5; tab = new int[rozmiar]; //definicja wskaźnika do typu int oraz zmiennej int //dynamiczne zaalokowanie pamięci o podanym rozmiarze LUB int *tab = new int[rozmiar]; //można w jednej linii zaalokować pamięć for(int i=0;i<rozmiar;i++) cout<<tab[i]<<endl; //wyświetlenie zawartości tablicy delete [] tab; tab=0; //zwolnienie pamięci zajmowanej przez tablicę //odłączenie wskaźnika od pamięci UWAGA: Po zwolnieniu zaalokowanej wcześniej pamięci, nadaj wskaźnikowi, którym się posługiwałeś wartość 0, aby mieć do niej dostęp. Spowoduje to odłączenie wskaźnika od tego obszaru pamięci.

Przykład 3: int m = 3; int n = 5; int **macierz; //liczba wierszy //liczba kolumn macierz = new int*[m]; for (int j=0;j<m;j++) macierz[j]=new int[n]; //KROK 1: alokacja wierszy //KROK 2: alokacja kolumn for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>macierz[i][j]; //wczytanie danych do macierzy for (int i=0;i<m;i++) delete[] macierz[i]; delete[] macierz; //KROK 1: usuwanie kolumn //KROK 2: usuwanie wierszy macierz=null; //odłączenie wskaźnika od pamięci

Jak sprawdzić, czy alokacja pamięci się powiodła?

double *t; t = new double[10000]; //definicja wskaźnika do typu double //utworzenie 10000-elementowej tablicy typu double if(!t) { cout<< brak pamięci ; } LUB if(t==null) { cout<< brak pamięci ; } LUB if(t==0) { cout<< brak pamięci ; }

Zadania laboratoryjne