PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung...

69

Transcript of PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung...

Page 1: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte
Page 2: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Pointer, Arrays und New

Florian Adamsky, B. Sc. (PhD cand.)

[email protected]://florian.adamsky.it/

cbd

Softwareentwicklung im WS 2014/15

1/39

Page 3: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Outline

1 Pointer und Referenzen

2 Arrays

3 Speicherverwaltung

2/39

Page 4: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Wiederholung der letzten Vorlesung

C++ ist maschinennah, schnell und unterstützt das objektorientierteParadigma

eine Klasse ist ein Bauplan und kann in C++ über das Schlüsselwortclass erzeugt werden

eine Klasse besitzt Attribute und Methoden

von einer Klassen können viele Objekte erzeugt werden

der Zugriff auf die Attribute und Methoden eines Objekt erfolgt überden Punktoperator .

Objekte können über Methoden Nachrichten austauschen

Datenkapselung ist kann über die Zugriffsschlüsselwörter private undpublic in C++

3/39

Page 5: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Inhaltsverzeichnis

1 Pointer und Referenzen

2 Arrays

3 Speicherverwaltung

4/39

Page 6: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist ein Pointer/Zeiger?

Definition (Pointer)Für einen Typ T, ist T* ein Zeiger auf T. Ein Pointer (Zeiger) ist eineVariable die eine Speicheradresse speichert und dadurch auf eine andereVariable oder Objekt zeigt. (Analogie: Verknüpfung in Windows)

int x = 5;

int* ptr = &x;

5/39

Page 7: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist ein Pointer/Zeiger?

Definition (Pointer)Für einen Typ T, ist T* ein Zeiger auf T. Ein Pointer (Zeiger) ist eineVariable die eine Speicheradresse speichert und dadurch auf eine andereVariable oder Objekt zeigt. (Analogie: Verknüpfung in Windows)

int x = 5;

int* ptr = &x;

5int

0xf5e

5/39

Page 8: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist ein Pointer/Zeiger?

Definition (Pointer)Für einen Typ T, ist T* ein Zeiger auf T. Ein Pointer (Zeiger) ist eineVariable die eine Speicheradresse speichert und dadurch auf eine andereVariable oder Objekt zeigt. (Analogie: Verknüpfung in Windows)

int x = 5;

int* ptr = &x;

5int

0xf5e

0xf5e

int*

0xeff

5/39

Page 9: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist ein Pointer/Zeiger?

Definition (Pointer)Für einen Typ T, ist T* ein Zeiger auf T. Ein Pointer (Zeiger) ist eineVariable die eine Speicheradresse speichert und dadurch auf eine andereVariable oder Objekt zeigt. (Analogie: Verknüpfung in Windows)

int x = 5;

int* ptr = &x;

5int

0xf5e

0xf5e

int*

0xeff

5/39

Page 10: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Dereferenzierung

Definition (Dereferenzierungs-Operator)Der *-Operator gibt den Wert aus, auf dem der Pointer zeigt.

Example (Beispiel)

int x = 5;

int* ptr = &x;

// Integercout << x << endl; // 5cout << &x << endl; // 0xf5e

// Pointercout << *ptr << endl; // 5cout << ptr << endl; // 0xf5e

6/39

Page 11: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist eine Referenz?

Definition (Referenz)Referenz ist ein Pointer mit automatischer Dereferenzierung. DerUnterschied ist, das Referenzen nach der Initialisierung nicht mehrverändert werden können.

int x = 5;

int& ptr = x;

7/39

Page 12: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist eine Referenz?

Definition (Referenz)Referenz ist ein Pointer mit automatischer Dereferenzierung. DerUnterschied ist, das Referenzen nach der Initialisierung nicht mehrverändert werden können.

int x = 5;

int& ptr = x;

5int

0xf5e

7/39

Page 13: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist eine Referenz?

Definition (Referenz)Referenz ist ein Pointer mit automatischer Dereferenzierung. DerUnterschied ist, das Referenzen nach der Initialisierung nicht mehrverändert werden können.

int x = 5;

int& ptr = x;

5int

0xf5e

0xf5e

int&

0xeff

7/39

Page 14: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist eine Referenz?

Definition (Referenz)Referenz ist ein Pointer mit automatischer Dereferenzierung. DerUnterschied ist, das Referenzen nach der Initialisierung nicht mehrverändert werden können.

int x = 5;

int& ptr = x;

5int

0xf5e

0xf5e

int&

0xeff

7/39

Page 15: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Pointer/Referenzen

Variable Pointer ReferenzenInitialisierung int x = 5; int* ptr = &x; int& ref = x

Wert x *ptr ref

Speicheradresse &x ptr &ref

8/39

Page 16: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Vergleich Pointer und Referenzen

Pointer/ZeigerArithmetische Operationen wieptr++ sind erlaubt

Pointer müssen nichtinitialisiert werden

Können ihren Wert verändert,dadurch auf verschiedeneVariablen zeigen

ReferenzArithmetische Operationensind sind nicht erlaubt

Referenzen müssen initialisiertwerden

Können nicht verändertwerden, dadurch zeigen sieimmer auf die selbe Variable

9/39

Page 17: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Call-By-Value

Definition (Call-By-Value)Die Parameterübergabe Call-By-Value kopiert Argumente eines Funktions-oder Methodenaufrufs in neue Variablen.

Example (Call-By-Value)void tauschen(int x, int y) {

int temp = x; // speicher den Wert von x zwischenx = y; // überschreibe x mit dem Wert von yy = temp; // überschreibe y mit dem Wert von temp

}

// …int a = 23, b = 42;

tauschen(a, b);

cout << a << " " << b << endl;

10/39

Page 18: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Call-By-Value

Definition (Call-By-Value)Die Parameterübergabe Call-By-Value kopiert Argumente eines Funktions-oder Methodenaufrufs in neue Variablen.

Example (Call-By-Value)void tauschen(int x, int y) {

int temp = x; // speicher den Wert von x zwischenx = y; // überschreibe x mit dem Wert von yy = temp; // überschreibe y mit dem Wert von temp

}

// …int a = 23, b = 42;

tauschen(a, b);

cout << a << " " << b << endl;a = 23 und b = 42 keineVeränderung

10/39

Page 19: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Call-By-Reference

Definition (Call-By-Reference)Die Parameterübergabe Call-By-Reference kopiert die Speicheradresse derArgumente in neue Referenzen.

Example (Call-By-Reference)void tauschen(int& x, int& y) {

int temp = x;

x = y;

y = temp;

}

// …int a = 23, b = 42;

tauschen(a, b);

cout << a << " " << b << endl;

11/39

Page 20: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Call-By-Reference

Definition (Call-By-Reference)Die Parameterübergabe Call-By-Reference kopiert die Speicheradresse derArgumente in neue Referenzen.

Example (Call-By-Reference)void tauschen(int& x, int& y) {

int temp = x;

x = y;

y = temp;

}

// …int a = 23, b = 42;

tauschen(a, b);

cout << a << " " << b << endl; a = 42 und b = 23 ,11/39

Page 21: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Pointer-Based Call-By-Reference

Definition (Call-By-Pointer)Die Parameterübergabe Pointer-Based Call-By-Reference kopiert dieSpeicheradresse der Argumente in Pointer/Zeiger.

Example (Pointer-Based Call-By-Reference)void tauschen(int* x, int* y) {

int temp = *x;

*x = *y;

*y = *temp;

}

// …int a = 23, b = 42;

tauschen(&a, &b);

cout << a << " " << b << endl;

12/39

Page 22: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Pointer-Based Call-By-Reference

Definition (Call-By-Pointer)Die Parameterübergabe Pointer-Based Call-By-Reference kopiert dieSpeicheradresse der Argumente in Pointer/Zeiger.

Example (Pointer-Based Call-By-Reference)void tauschen(int* x, int* y) {

int temp = *x;

*x = *y;

*y = *temp;

}

// …int a = 23, b = 42;

tauschen(&a, &b);

cout << a << " " << b << endl; a = 42 und b = 23 ,12/39

Page 23: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Inhaltsverzeichnis

1 Pointer und Referenzen

2 Arrays

3 Speicherverwaltung

13/39

Page 24: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Was ist ein Array?

strukturierter Datentypenthält ein oder mehrere Elemente des gleichen Datentypsdie Elemente sind sequenziell im Speicher angeordnet

Definition eines Arrays ist wie folgt:

int array[10];

Anzahl der Elemente muss zur Compilezeit feststehen

Zugriff auf die einzelnen Elemente erfolgt über [] und fängt bei 0 an

std::cout << array[0] << std::endl;

Initialisierung erfolgt über:

int array[] = {'T', 'H', 'M'};

int array[3] = {'T', 'H', 'M'};

14/39

Page 25: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Array im Speicher

Example (Array-Initialisierung)int array[] = {1, 3, 5};

Adresse Wert0x120

0x122 10x124 30x128 50x12B

0x12D

15/39

Page 26: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Array im Speicher

Example (Array-Initialisierung)int array[] = {1, 3, 5};

0x122

array

0xeff

Name des Arrays ist ein Pointer auf das erste Element

Adresse Wert0x120

0x122 10x124 30x128 50x12B

0x12D

15/39

Page 27: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays als Funktions- oder Methodenparameter

Example (Funktionsparameter)#include <iostream>

void array_ausgabe(int a[], int size) {

for (int i = 0; i < size; i++) {

std::cout << a[i] << std::endl;

}

}

int main() {

int a[5] = {10, 20, 30, 40, 50};

array_ausgabe(a, 5);

}

16/39

Page 28: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays als Funktions- oder Methodenparameter

Example (Funktionsparameter)#include <iostream>

void array_ausgabe(int a[], int size) {

for (int i = 0; i < size; i++) {

std::cout << a[i] << std::endl;

}

}

int main() {

int a[5] = {10, 20, 30, 40, 50};

array_ausgabe(a, 5);

}

Übergabe eines Pointersauf das erste Elementund die Größe des Ar-rays

16/39

Page 29: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays als Funktions- oder Methodenparameter

Example (Funktionsparameter)#include <iostream>

void array_ausgabe(int a[], int size) {

for (int i = 0; i < size; i++) {

std::cout << a[i] << std::endl;

}

}

int main() {

int a[5] = {10, 20, 30, 40, 50};

array_ausgabe(a, 5);

}

Der Compiler übersetztint a[] zu int a*

16/39

Page 30: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays und Pointer-Arithmetik

Name des Arrays ist ein Pointer auf das erste ElementPointer kann man rechnen, dabei kommt es auf den Datentyp drauf an

Example (Addition)if (array[2] == *(array + 2)) {

cout << "Der Ausdruck is gleich" << endl;

}

Example (Subtraktion)int array[10] ;

int* ptr1 = array + 2 ;

int* ptr2 = array + 5 ;

cout << (ptr2 - ptr1) ; // Gibt 3 auscout << (ptr1 - ptr3) ; // Gibt −3 aus

17/39

Page 31: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays und Pointer-Arithmetik (Int)

Example (Array-Initialisierung)int array[3]; // Int ist in der Regel 4 Bytes groß

array[0]

0x100←− array

array[1]

0x104←− array + 1

array[2]

0x108←− array + 2

18/39

Page 32: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays und Pointer-Arithmetik (Short)

Example (Array-Initialisierung)short array[3]; // Short ist in der Regel 2 Bytes groß

array[0]0x100←− array

array[1]0x102←− array + 1

array[2]0x104←− array + 2

19/39

Page 33: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Mehrdimensionale Arrays

Arrays können n Dimensionen haben2-dimensionales Array wird wie folgt definiert

// 4 Zeilen 5 Spaltenint matrix[4][5] = { {10,20,30,40,50},

{15,25,35,45,55},

{20,30,40,50,60},

{25,35,45,55,65}};

Zugriff auf einzelne Elemente über [Reihe][Spalte]

cout << matrix[2][3] << endl; // gibt 50 aus

20/39

Page 34: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Inhaltsverzeichnis

1 Pointer und Referenzen

2 Arrays

3 Speicherverwaltung

21/39

Page 35: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Einleitung

Arbeitsspeicher, Hauptspeicher, RandomAccess Memory (RAM)

Enthält temporäre Daten

Flüchtig→ Daten gehen nach demAusschalten verlorenHohe Geschwindigkeit im Vergleich zurFestplatte

Datenraten: 6–30 GByte/sAbbildung: Bild von Eric Hamiter

22/39

Page 36: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Speicherverwaltung

Kein Programm hat direkten Zugriff auf den Arbeitsspeichern, sondernnur auf virtuellen Speicher

Die virtuelle Speicherverwaltung wird von nahezu allenBetriebssystemen verwendet

23/39

Page 37: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Virtuelle Speicherverwaltung 1

Arbeitsspeicher

0x123

0x3ef

0x500

0x200

Page Table0x500

0x200

Virtueller Speicher

24/39

Page 38: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Virtuelle Speicherverwaltung 2

VorteileDas Betriebssystem kümmert sich um das Speichermanagement

Jeder Prozess darf nur seinen Speicher sehen

Arbeitsspeicher kann über die Festplatte erweitert werden (SWAP)

25/39

Page 39: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack und Heap

Stack (strukturiert)Funktions/Methoden ParameterLokale VariablenFunktions/Methoden Rückgabewerte

Heap (unstrukturiert)dynamischer Speicher

DataStatische und globale Variablen

Code (Text)enthält die ausführbaren Instruktionenschreibgeschützt

Code (Text)

Data (BSS)

Heap

Stack

26/39

Page 40: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack (Datenstruktur)

Stack ist eine Last-in-First-out (LIFO) Datenstruktur

#1

#2

#3

#4

#5 #5

push pop

27/39

Page 41: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 42: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 43: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 44: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 45: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 46: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 47: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 48: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 49: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 50: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 51: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 52: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 53: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack

1 void second_fn(int a) {

2 int b = a;

3 }

45 void first_fn(void) {

6 int zahl = 3;

7 char z = 'c';

8 second_fn(zahl);

9 }

1011 int main(void) {

12 int x = 23, y = 42;

13 first_fn();

14 }

main()

int x = 23;

int y = 42;

first_fn()

main(), line 14

int zahl = 3;

char z = 'c';

second_fn()

first_fn(), line 9

int a = 3;

int b = 3;

28/39

Page 54: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack Overflow

Stack hat nur eine begrenzte GrößeFalls der Speicher aufgebraucht ist, führt das zu einem Stack Overflow

weitere Alloziierungen schwappen in andere Speicherbereiche über

Stack Overflow#include <iostream>

int main(void) {

int stack[100000000]; // Int−Array mit 100.000.000 Eintraegen}

29/39

Page 55: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Stack Overflow

Stack hat nur eine begrenzte GrößeFalls der Speicher aufgebraucht ist, führt das zu einem Stack Overflow

weitere Alloziierungen schwappen in andere Speicherbereiche über

Stack Overflow#include <iostream>

int main(void) {

int stack[100000000]; // Int−Array mit 100.000.000 Eintraegen}

29/39

Page 56: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Vor- und Nachteile des Stacks

VorteileProgrammierInn braucht sich nicht um die Aufräumarbeitenkümmern

Keine Pointer notwendig, da der Zugriff direkt erfolgt

dadurch schneller

NachteileGröße muss zur Compilezeit feststehen

Stack ist nicht besonders groß→ Stack Overflow

langsamer bei call-by-value da viel Kopierarbeit geleistet werden muss

30/39

Page 57: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Übungsaufgabe: Stack (Datenstruktur)

Programmieren Sie eine Klasse Stack die eine Integer-Stack verwaltet. Diefolgenden Methoden müssen dazu implementiert werden:

void push(int x);

int pop();

31/39

Page 58: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Heap

unstrukturierter Speicher den man zur Laufzeit vom Betriebssystemanfordern kann

Speichergröße steht erst zur Laufzeit fest, daher bekommt man vom OSnur einen Pointer

Example (In C)int* zahl = malloc(sizeof(int));

// …free(zahl);

Example (In C++)int* zahl = new int;

// …delete zahl;

32/39

Page 59: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Heap Darstellung

main()

int* ptr = 0x100;

Stack

first_fn()

main(), line 14

Punkt* ptr = 0x4fa;

second_fn()

first_fn(), line 9

Klasse* ptr = 0x2b4

Heap

objekt

objekt

objekt

33/39

Page 60: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays dynamisch auf dem Heap alloziieren

Arrays mit dynamischer Größe mit new auf dem Heap alloziieren

cout << "Wie groß soll das Array werden";

cin >> anzahl;

int* dynArray = new int[anzahl];

Speicher muss wieder mit delete gelöscht werden

delete[] dynArray;

34/39

Page 61: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Arrays dynamisch auf dem Heap alloziieren

Arrays mit dynamischer Größe mit new auf dem Heap alloziieren

cout << "Wie groß soll das Array werden";

cin >> anzahl;

int* dynArray = new int[anzahl];

Speicher muss wieder mit delete gelöscht werden

delete[] dynArray;

34/39

Page 62: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Objekte auf dem Heap

Objekte auf dem Heap erzeugen mit new

Klasse* objekt = new Klasse();

Zugriffe auf Attribute und Methoden würde normalerweise soaussehen:

(*objekt).attribut = 23;

(*objekt).vergroessern();

Vereinfachung über den -> Operator

objekt->attribut = 23;

objekt->vergroessern();

35/39

Page 63: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Objekte auf dem Heap

Objekte auf dem Heap erzeugen mit new

Klasse* objekt = new Klasse();

Zugriffe auf Attribute und Methoden würde normalerweise soaussehen:

(*objekt).attribut = 23;

(*objekt).vergroessern();

Vereinfachung über den -> Operator

objekt->attribut = 23;

objekt->vergroessern();

35/39

Page 64: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Objekte auf dem Heap

Objekte auf dem Heap erzeugen mit new

Klasse* objekt = new Klasse();

Zugriffe auf Attribute und Methoden würde normalerweise soaussehen:

(*objekt).attribut = 23;

(*objekt).vergroessern();

Vereinfachung über den -> Operator

objekt->attribut = 23;

objekt->vergroessern();

35/39

Page 65: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Objekte auf dem Heap

Example (Stack)#include <iostream>

#include "Rechteck.h"

using namespace std;

int main(void) {

Rechteck quadrat;

quadrat.hoehe = 23;

quadrat.breite = 23;

quadrat.vergroessern(10);

cout << quadrat.flaecheninhalt();

}

Example (Heap)#include <iostream>

#include "Rechteck.h"

using namespace std;

int main(void) {

Rechteck* quadrat = new Rechteck();

quadrat->hoehe = 23;

quadrat->breite = 23;

quadrat->vergroessern(10);

cout << quadrat->flaecheninhalt();

delete quadrat;

}

36/39

Page 66: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Objekte auf dem Heap

Example (Stack)#include <iostream>

#include "Rechteck.h"

using namespace std;

int main(void) {

Rechteck quadrat;

quadrat.hoehe = 23;

quadrat.breite = 23;

quadrat.vergroessern(10);

cout << quadrat.flaecheninhalt();

}

Example (Heap)#include <iostream>

#include "Rechteck.h"

using namespace std;

int main(void) {

Rechteck* quadrat = new Rechteck();

quadrat->hoehe = 23;

quadrat->breite = 23;

quadrat->vergroessern(10);

cout << quadrat->flaecheninhalt();

delete quadrat;

}

36/39

Page 67: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Memory Leaks sind Bugs

Example (Memory-Leak)Klasse* objekt = new Klasse();

//…Klasse* objekt2 = new Klasse();

objekt = objekt2;

delete objekt;

37/39

Page 68: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Vor- und Nachteile des Heaps

VorteileSpeicher kann zur Laufzeit allokiert werden

Dynamisch allokierter Speicher bleibt allokiert bis er mit deletegelöscht wird

Heap ist größer als der Stack, daher könnten dort große Array oderObjekte allokiert werdne

NachteileMemory-Leaks

38/39

Page 69: PointerundReferenzen Arrays Speicherverwaltung · PointerundReferenzen Arrays Speicherverwaltung WiederholungderletztenVorlesung C++ istmaschinennah,schnellundunterstütztdasobjektorientierte

Pointer und Referenzen Arrays Speicherverwaltung

Zusammenfassung

Pointer/Referenzen sind Datentypen die Speicheradressen speichern

Unterschied zwischen Pointer und Referenzen

Funktions- und Methodenaufrufe über Call-by-Value,Call-By-Reference und Pointer-Based Call-by-Reference

Arrays und was diese mit Pointern gemeinsam haben

Grundsatzliche Funktionsweise der Speicherverwaltung

Unterschied Stack und Heap

39/39