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

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

Zmienne i struktury dynamiczne

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

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

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

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

Wykład 1: Wskaźniki i zmienne dynamiczne

Lab 9 Podstawy Programowania

Deklaracja struktury w C++

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

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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:

Proste programy w C++ zadania

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

*W uproszczeniu: jest dziewięciu sędziów przyznających po dwie noty: za wartość techniczną i artystyczną (skala od 0.0 do 6.0)

// 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. 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).

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

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

Język C, tablice i funkcje (laboratorium)

tablica: dane_liczbowe

Programowanie obiektowe W3

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

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

Stałe, tablice dynamiczne i wielowymiarowe

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Programowanie komputerowe. Zajęcia 1

Część 4 życie programu

Programowanie w języku C++

Zajęcia 6 wskaźniki i tablice dynamiczne

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

Programowanie 2 - Tablice i łańcuchy

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

Podstawy programowania komputerów

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

Programowanie komputerowe. Zajęcia 4

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

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

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

Wstęp do programowania

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

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

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

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

Programowanie komputerowe. Zajęcia 5

do instrukcja while (wyrażenie);

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

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Techniki Programowania wskaźniki 2

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

Zadania z podstaw programowania obiektowego

Programowanie obiektowe - zadania

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

Podstawy programowania w języku C++

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

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

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Podstawy i języki programowania

Programowanie i struktury danych

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

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

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY.

Algorytmy i język C++

Wskaźniki. Informatyka

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

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

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

Zadania język C++ Zad. 1. Napisz program wczytujący z klawiatury wiek dwóch studentów i wypisujący informację o tym, który z nich jest starszy.

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

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

r. Tablice podstawowe operacje na tablicach

Struktury, unie, formatowanie, wskaźniki

Zadeklarowanie tablicy przypomina analogiczną operację dla zwykłych (skalarnych) zmiennych. Może zatem wyglądać na przykład tak:

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

Podstawy programowania w języku C++

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

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Tablice są typem pochodnym. Poniżej mamy przykłady deklaracji różnych tablic:

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

lekcja 8a Gry komputerowe MasterMind

Akademia ETI Marcin Jurkiewicz

Wstęp do programowania

Tablice (jedno i wielowymiarowe), łańcuchy znaków

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

C++ wprowadzanie zmiennych

Zajęcia 6 wskaźniki i tablice dynamiczne

Język C++ zajęcia nr 2

Podstawy Programowania Obiektowego

Programowanie 3 - Funkcje, pliki i klasy

Transkrypt:

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 1429536600

> Dzisiejsze zajęcia sponsorują słówka: new oraz delete ++ dynamiczna alokacja/rezerwacja/przydział pamięci 2 / 16

> Stos i sterta Stos przechowuje m.in. zmienne globalne, zmienne statyczne, parametry funkcji. Sterta wydzielony obszar wolnej pamięci kontrolowany ręcznie przez programistę, przeznaczony do przechowywania danych dynamicznych. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 3 / 16

> Dynamiczna alokacja/rezerwacja/przydział pamięci char *wskaznik; wskaznik = new char; *wskaznik = A ; delete wskaznik; // utworzenie obiektu // ten obiekt nie ma nazwy, // tylko adres przypisany do wskaznik // likwidacja obiektu ++ dynamiczna alokacja/rezerwacja/przydział pamięci 4 / 16

> Dynamiczna alokacja/rezerwacja/przydział pamięci char *wskaznik; wskaznik = new char; *wskaznik = A ; delete wskaznik; // utworzenie obiektu // ten obiekt nie ma nazwy, // tylko adres przypisany do wskaznik // likwidacja obiektu float *w; w = new float [16]; w[0] = 3.14; delete [] w; // dla tablic: // wskaźnik definiujemy jak zwykle // dodajemy rozmiar tablicy // przy likwidacji trzeba pamiętać // o nawiasach kwadratowych ++ dynamiczna alokacja/rezerwacja/przydział pamięci 4 / 16

Do każdego new powinno być jedno delete. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 5 / 16

> Na rozgrzewkę Zadeklaruj wskaźnik a typu całkowitoliczbowego. Następnie: * Użyj słowa kluczowego new, aby przydzielić pamięć i stworzyć dynamiczny obiekt, na który będzie wskazywać a. * Przypisz do obiektu wartość 64. * Wyświetl adres przechowywany w a. * W osobnym wierszu wyświetl wartość z a. * Usuń dynamicznie przydzieloną pamięć przy pomocy słowa kluczowego delete. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 6 / 16

> Cechy obiektów stworzonych operatorem new 1. My decydujemy o czasie ich życia (od new do delete). 2. Nie mają nazwy. (Możemy nimi operować tylko poprzez wskaźniki). 3. Nie obowiązują ich zwykłe zasady o zakresie ważności. (Mamy wskaźnik, który na obiekt pokazuje = mamy dostęp). 4. Zaraz po utworzeniu tkwią w nich jeszcze śmieci. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 7 / 16

> I jeszcze raz int *tab; tab = new int [rozmiar]; // lub razem: int *tab = new int [rozmiar]; // np. cout << "Ile elementow ma miec tablica?"<< endl; int rozmiar; cin >> rozmiar; int *tab = new int[rozmiar]; // utworzenie tablicy o rozmiarze podanym przez użytkownika... delete [] tab; // likwidacja tablicy tab = NULL; // dla bezpieczeństwa ++ dynamiczna alokacja/rezerwacja/przydział pamięci 8 / 16

> I jeszcze raz int *tab; tab = new int [rozmiar]; // lub razem: int *tab = new int [rozmiar]; // np. cout << "Ile elementow ma miec tablica?"<< endl; int rozmiar; cin >> rozmiar; int *tab = new int[rozmiar]; // utworzenie tablicy o rozmiarze podanym przez użytkownika... delete [] tab; // likwidacja tablicy tab = NULL; // dla bezpieczeństwa Programista musi kontrolować zakres tablicy i poprawność indeksów! C++ dynamiczna alokacja/rezerwacja/przydział pamięci 8 / 16

Do każdego new powinno być C++ dynamiczna alokacja/rezerwacja/przydział pamięci 9 / 16

Do każdego new powinno być jedno delete. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 9 / 16

Do każdego new powinno być jedno delete. ZAWSZE. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 9 / 16

> Ćwiczenie czyni mistrza 1. Napisz program, który pyta użytkownika o liczbę naturalną, maksymalnie 25 (musisz to zweryfikować). Na tej podstawie tworzy tablicę tej wielkości (alokowaną dynamicznie). Do tablicy wczytuje kolejno liczby podane przez użytkownika. Po podaniu wszystkich liczb: * liczby na indeksach parzystych zamienia na dodatnie, * liczby na indeksach nieparzystych zamienia na ujemne. Następnie należy wydrukować wszystkie liczby na ekranie. 2. Napisz program, który tworzy tablicę (alokowaną dynamicznie) o wielkości wylosowanej z przedziału <16,32>. Następnie wypełnia ją kolejnymi potęgami dwójki, zaczynając od 2 0 dla indeksu 0. Na koniec wydrukuj zawartość tablicy na ekran w następujący sposób: [0] 2ˆ0 = 1 [1] 2ˆ1 = 2 [2] 2ˆ2 = 4 itd. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 10 / 16

> Zagadka Co tu się wyświetli? ++ dynamiczna alokacja/rezerwacja/przydział pamięci 11 / 16

> Zagadka Co tu się wyświetli? A jak się dostać do obiektu 50? ++ dynamiczna alokacja/rezerwacja/przydział pamięci 11 / 16

> Zagadka Co tu się wyświetli? A jak się dostać do obiektu 50? STRACONY! :-( ++ dynamiczna alokacja/rezerwacja/przydział pamięci 11 / 16

> Tablice dwuwymiarowe Zapis typ_zmiennej *tablica=new typ_zmiennej[x][y]; nie stworzy tablicy dwuwymiarowej. Trzeba inaczej: C++ dynamiczna alokacja/rezerwacja/przydział pamięci 12 / 16

> Tablice dwuwymiarowe Zapis typ_zmiennej *tablica=new typ_zmiennej[x][y]; nie stworzy tablicy dwuwymiarowej. Trzeba inaczej: Czego tu brakuje? C++ dynamiczna alokacja/rezerwacja/przydział pamięci 12 / 16

> Tablice dwuwymiarowe (i nie tylko) Prawidłowa konstrukcja (oraz destrukcja) (3 x 4) char **tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4];... tab[0][2] = 128;... for (size_t i = 0; i < 3; i++) delete[] tab[i]; delete[] tab; ++ dynamiczna alokacja/rezerwacja/przydział pamięci 13 / 16

> Tablice dwuwymiarowe (i nie tylko) Prawidłowa konstrukcja (oraz destrukcja) (3 x 4) char **tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4];... tab[0][2] = 128;... for (size_t i = 0; i < 3; i++) delete[] tab[i]; delete[] tab; Kolejne wymiary: analogicznie. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 13 / 16

> Tablice dwuwymiarowe (i nie tylko) Prawidłowa konstrukcja (oraz destrukcja) (3 x 4) char **tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4];... tab[0][2] = 128;... for (size_t i = 0; i < 3; i++) delete[] tab[i]; delete[] tab; Kolejne wymiary: analogicznie. C++ dynamiczna alokacja/rezerwacja/przydział pamięci 13 / 16

> Wyższy wymiar ćwiczeń 1. Stwórz trójwymiarową tablicę dynamiczną. 2. Stwórz tablicę trójkątną o dowolnym rozmiarze i wypełnij ją kolejnymi wartościami zgodnie ze wzorem: 1 2 2 3 3 3 4 4 4 4 itd. 3. Ułóż program obliczający sumę S elementów o indeksach parzystych tabeli dwuwymiarowej. Dla tabeli T [4][5] będzie to suma S = T [0][0] + T [0][2] + T [0][4] + T [2][0] + T [2][2] + T [2][4]. Wielkość tabeli jest pobierana od użytkownika i wypełniana losowymi liczbami całkowitymi. (Oczywiście pamięć ma być przydzielona dynamicznie.) ++ dynamiczna alokacja/rezerwacja/przydział pamięci 14 / 16

> Ćwiczenie (trochę bardziej rozbudowane) 1. 1.1 Zadeklaruj strukturę składającą się z trzech pól: double, int oraz char. 1.2 Napisz funkcję przyjmującą jeden parametr (wskaźnik na utworzoną przez siebie strukturę) i pozwalającą na ustawienie wszystkich trzech pól wartościami przeczytanymi od użytkownika z klawiatury. 1.3 Napisz funkcję wypisującą wartości elementów struktury (przykładowe wyjście: 2.5 10 A ). 1.4 W funkcji main(): 1.4.1 Zainicjuj generator liczb pseudolosowych. 1.4.2 Pobierz od użytkownika wartość typu int. 1.4.3 Zadeklaruj dynamicznie alokowaną tablicę o rozmiarze pobranym od użytkownika w poprzednim podpunkcie. 1.4.4 Wypełnij wszystkie pola wszystkich struktur w tablicy wartościami losowymi. 1.4.5 Wypisz całą tablicę struktur na ekran. W tym celu użyj funkcji napisanej w punkcie 3. ++ dynamiczna alokacja/rezerwacja/przydział pamięci 15 / 16

> Wycieki pamięci i wiszące wskaźniki /* zmienna na stercie, do której nie mamy żadnego wskaźnika */ void fun() { int *wsk = new int; //rezerwacja pamięci na liczbę typu int *wsk = 20; //wpisanie w zarezerwowane miejsce wartości } // po wyjściu z funkcji *wsk już nie istnieje, // ale pamięć dalej jest zaalokowana /* wskaźnik odnoszący się do zmiennej, która została już zdealokowana */ int *wsk = new int; //rezerwacja pamięci na liczbę typu int delete wsk; //dealokacja zmiennej C++ dynamiczna alokacja/rezerwacja/przydział pamięci 16 / 16