Grundlagen der Informatik 11. Zeiger

Motivation Zeiger und Adressen Zeiger und Funktionen Zeiger und Arrays Dynamische Objekte

Grundlagen der Informatik (Alex Rempel)

1

Grundlagen der Informatik Motivation ●

Dynamische Speicherverwaltung ●

Oft müssen große Speicherblöcke verwaltet werden –



Eine Speicherarithmetik wird gebraucht, um den Adressraum im Code komfortabel duchzugehen

Beispiel –

Mehrdimensionale Arrays sind sehr unhandlich, stattdessen wird oft ein großer eindimensinaler Array verwendet ●

Vorteil: Parameterübergabe an Funktionen vereinfacht

int iArray[12][5]; int i = iArray[3][2];

int iArray[60]; // 12x5 int i = iArray[3*5+2];

Grundlagen der Informatik (Alex Rempel)

2

Grundlagen der Informatik Motivation ●

Dynamische Speicheranpassung ●



Arrays müssen eine feste Größe haben, aber oft werden Arrays mit dynamischer Größe gebraucht Beispiel: –

Benutzer gibt Anzahl n der einzugebenden Elemente ein ●



Dynamische Parameterübergabe ●



Array wird erst danach dynamisch mit der Größe n erzeugt

Ferner auch die Möglichkeit, Arrays zurückzugeben

Etc. Grundlagen der Informatik (Alex Rempel)

3

Grundlagen der Informatik Zeiger und Adressen ●

Zeiger (Pointer) sind Variablen ●

Inhalt der Variable: Adresse im Speicher oder NULL –

Adresse im Speicher ist bei 32b Systemen eine 32b große Zahl ●

– ●



type * name;

Ändert sich der Inhalt, zeigt die Variable auf eine andere Speicherzelle

Inhalt NULL bedeutet, dass die Variable auf nichts zeigt

Beim Anwenden von Rechenoperatoren auf den Zeiger kann der Speicher entsprechend durchlaufen werden Beim Dereferenzieren eines Zeigers bekommt man die Variable, auf welche der Zeiger zeigt –

Der type des Zeigers gibt dabei den Typ der Variable an Grundlagen der Informatik (Alex Rempel)

4

Grundlagen der Informatik Zeiger und Adressen ●

Deklaration ●

Von rechts nach links interpretieren: –



type * name;

Variable name ist ein Zeiger auf etwas vom Typ type

Initialisierung ●

Zuweisung einer Adresse: –



int iNumber = 42; int* iPointer = &iNumber;

iPointer zeigt nun auf Variable iNumber

Falls nicht sofort zugewiesen wird, sollte immer die Initialisierung auf NULL erfolgen (sonst Fehlerquelle): int* iPointer = NULL; Grundlagen der Informatik (Alex Rempel)

5

Grundlagen der Informatik Zeiger und Adressen Name double* pPointer = NULL;

pPointer

Adresse 0x0031FB60 == &pPointer

double* pPointer = NULL; double dNumber = 0.2;

dNumber

0x0031FC50 == &dNumber

double* pPointer = NULL; double dNumber = 0.2; pPointer = &dNumber;

pPointer

0x0031FB60 == &pPointer

dNumber

0x0031FC50 == &dNumber == pPointer

Grundlagen der Informatik (Alex Rempel)

Inhalt 0x00000000 == pPointer

0.2 == dNumber

0x0031FC50 == pPointer == &dNumber 0.2 == dNumber == *pPointer 6

Grundlagen der Informatik Zeiger und Adressen Name double* pPointer = NULL; double dNumber = 0.2; pPointer = &dNumber;

pPointer

Adresse 0x0031FB60 == &pPointer

dNumber

0x0031FC50 == &dNumber == pPointer

double* pPointer = NULL; double dNumber = 0.2; pPointer = &dNumber; *pPointer = *pPointer + 1.3;

pPointer

0x0031FB60 == &pPointer

dNumber

0x0031FC50 == &dNumber == pPointer

Dereferenzierung

Grundlagen der Informatik (Alex Rempel)

Inhalt 0x0031FC50 == pPointer == &dNumber 0.2 == dNumber == *pPointer

0x0031FC50 == pPointer == &dNumber 1.5 == dNumber == *pPointer 7

Grundlagen der Informatik Zeiger und Adressen p is saved in 0x0031FB60 and points to 0x00000000 (no value) ...dNumber=0.2 in address 0x0031FC50 #include p is saved in 0x0031FB60 and points to 0x0031FC50 (value = 0.2) #include using namespace std;

const unsigned char g_ucADDRESSWIDTH = 8; void printPointer(double*& p) { cout