TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Relevanta dokument
TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

TDIU01 (725G67) - Programmering i C++, grundkurs

C++ - En introduktion

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

TDDC76 Programmering och datastrukturer

Minnestilldelning (allokering) och frigörande (avallokering) av minne

TDIU01 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

Intro till standardbiblioteket. Eric Elfving

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Föreläsning 6: Introduktion av listor

TDDC76 - Programmering och Datastrukturer

Föreläsning 10. Pekare (Pointers)

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

2 Pekare och dynamiska variabler.

Innehåll. Pekare Syntax

C++ - En introduktion

Övning från förra gången: readword

Skizz till en enkel databas

Det finns många flaggor till g++,

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning 5: Introduktion av pekare

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

*Pekarvärden *Pekarvariabler & *

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Att använda pekare i. C-kod

TDIU01 - Datortenta (DAT2)

Pekare och arrayer. Indexering och avreferering

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

DD2387 Programsystemkonstruktion med C++ Tentamen 2

5 Arv och dynamisk bindning FIGUR

Tentamen EDAF30 Programmering i C++

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

TDIU01 - Datortenta (DAT2)

1 Klasser och objektorientering Vad är objektorientering?

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

grundläggande C++, funktioner m.m.

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Övningar Dag 2 En första klass

1 Namnkontroll (NameControl)

Tillämpad programmering

Poster ( structar ) Postdeklarationer

Enkla datatyper minne

C++ Objektorientering - Klasser. Eric Elfving

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Tentamen i DD2387 Programsystemkonstruktion med C++

Datastrukturer. Typdeklarationer. Ny datastruktur i C- struct. exempel. Ofta bra att kunna fšra ihop information av olika datatyper till en enhet.

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Tentamen EDAF30 Programmering i C++

Introduktionslaboration

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Introduktionslaboration

+Överskådlighet Normalt sätt blir ett program skrivet i det procedurella paradigmet överskådligt. Modifikationer på delproblem kan ske med lätthet.

Filhantering. Grunderna i filhantering. Uppbyggnad av filer. Data hierarkin. Filpekaren. Positionering i filer

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

TDDC77 Objektorienterad Programmering

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 3.1: Datastrukturer, en översikt

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

Funktionens deklaration

Programsystemkonstruktion med C++

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Transkript:

TDP004 Minne och pekare Eric Elfving Institutionen för datavetenskap

1 / 23 Översikt Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor

2 / 23 Internminne - RAM Datorns internminne (RAM, random access memory) består av en ordnad sekvens bitar Vi kan normalt sett adressera (komma åt) en byte i taget (8 bitar)

3 / 23 Minne

4 / 23 Minne Vad händer i minnet? int x {3421}; x: int 3421

5 / 23 Variabler En variabel har alltid: Ett namn En datatyp Ett värde

5 / 23 Variabler En variabel har alltid: Ett namn En datatyp Ett värde En adress

6 / 23 Pekare En pekare lagrar en adress till en given position i minnet Deklareras med en asterisk (*) int * ip;

7 / 23 Pekare Man kan ta fram adressen till en variabel med adressoperatorn (&) int x {3421}; int * ip {&x}; int x: ip: 3421

8 / 23 Pekare För att komma åt det värde en pekare pekar på används avrefereringsoperatorn (*) #include <iostream> using namespace std; int main() { int x {3421}; int *ip {&x}; cout << ip << endl; cout << *ip << endl; return 0; } 14 3421 Vi får bara avreferera pekare som pekar på adresser som vårt program äger

9 / 23 Pekare Pekare används oftast för att skapa dynamiskt minne Vi allokerar nytt minne med new-operatorn Vi kan endast nå det nya utrymmet med hjälp av pekaren int* ip; ip = new int; *ip = 5123; int * ip {new int{5123}};

10 / 23 Pekare Minnesläcka Om vi redan pekar på en minnesadress och ber om nytt utrymme tappar vi bort det vi pekade på. int* ip {new int{44}}; int ip: 44

11 / 23 Pekare Minnesläcka Om vi redan pekar på en minnesadress och ber om nytt utrymme tappar vi bort det vi pekade på. int* ip {new int{44}}; ip = new int{123}; ip: int 44 int 123

12 / 23 Pekare Minnesläcka Om vi redan pekar på en minnesadress och ber om nytt utrymme tappar vi bort det vi pekade på. Detta kallas minnesläcka, ett av de vanligaste felen när vi jobbar med pekare Vi äger fortfarande utrymmet, men har inget sätt att nå det int* ip {new int{44}}; ip = new int{123}; ip: int 44 int 123

13 / 23 Pekare Antag att vi har följande deklaration: int *ip {new int{345}}; int ip: 345

13 / 23 Pekare Antag att vi har följande deklaration: int *ip {new int{345}}; int ip: 345 Vi kan återlämna minnet med delete-operatorn delete ip; int ip: 345

13 / 23 Pekare Antag att vi har följande deklaration: int *ip {new int{345}}; int ip: 345 Vi kan återlämna minnet med delete-operatorn delete ip; int ip: 345 OBS, delete ändrar inte på pekarens värde!

14 / 23 Pekare Värdet nullptr betyder inget värde för pekare 1 int * ip{}; // ip sätts till nullptr 2 ip = new int{}; // det nya heltalet får värdet 0 3 delete ip; 4 ip = nullptr; kodrad: 1 2 3 4 Minnet: int ip: ip: 0 int ip: 0 ip:

15 / 23 Pekare void f(int *p) { delete p; p = new int{2}; } int main() { int *ptr {new int{12}}; f(ptr); cout << *ptr << endl; delete ptr; } Vad händer?

16 / 23 Pekare Precis som vanligt måste vi ta emot referenser om vi vill ändra på värden: void f(int *& p) { delete p; p = new int{2}; } int main() { int *ptr {new int{12}}; f(ptr); cout << *ptr << endl; delete ptr; }

17 / 23 Alias Om man tycker det är jobbigt med alla asterisker kan man skapa ett nytt namn för en typ med aliasdefinition Skrivs på formen using NAMN = TYPBESKRIVNING; using int_ptr = int *; void f(int_ptr & p); int main() { int_ptr ptr { new int{4} }; delete ptr; }

18 / 23 Pekare till klasstyp För att komma åt medlemmar i klasser kan man använda sig av medlemsåtkomstoperatorn (->) struct Book { string title; string author; int pages; }; Book *bp { new Book }; bp->title = "C++ Primer";

18 / 23 Pekare till klasstyp För att komma åt medlemmar i klasser kan man använda sig av medlemsåtkomstoperatorn (->) struct Book { string title; string author; int pages; }; Book *bp { new Book }; bp->title = "C++ Primer"; Man kan använda avreferering också, men då krävs parenteser cout << (*bp).title << endl;

19 / 23 Dynamiska datastrukturer En dynamisk datastruktur kan ändra storlek under programkörningen Vi har redan stött på två dynamiska datastruktur, string och vector som kan lagra flera värden av en viss typ.

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position 7 0 4 12 17 0 1 2 3

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken 7 0 4 12 17? 0 1 2 3 4

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position 7 0 4 12 17? 0 1 2 3 4

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position 7 0 4 12 17 17 0 1 2 3 4

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position Stoppa in värdet 7 0 4 12 12 17 0 1 2 3 4

20 / 23 Dynamiska datastrukturer Tänk er att vi vill stoppa in ett värde sorterat i en vector. Då behöver vi: Hitta rätt position Utöka storleken Flytta alla värden som ligger efter hittad position Stoppa in värdet 7 0 4 7 12 17 0 1 2 3 4

21 / 23 Enkellänkade listor En enkellänkad lista består av noder sammankopplade med pekare. En nod är en post som innehåller två saker, ett värde av någon datatyp samt en pekare till nästa nod i listan. Detta gör en pekare till en nod till en lista. Tom lista (eller slutet av listan) markeras med pekarvärdet nullptr. 3 7 9

22 / 23 Enkellänkade listor 3 7 9

23 / 23 Enkellänkade listor Deklaration av en listtyp: struct List_Node { int data; List_Node * next; }; Alternativ lösning med alias: struct List_Node; using List = List_Node *; struct List_Node { int data; List next; };

Eric Elfving Institutionen för datavetenskap www.liu.se