Beruflich Dokumente
Kultur Dokumente
Eine Funktion ist keine Variable, aber man kann Zeiger auf Funktionen
• definieren
• zuweisen
• in Vektoren eintragen
• an Funktionen übergeben
• als Resultat von Funktionen zurückgeben
111
ptr = funktionsname;
oder
ptr = &funktionsname;
112
Anwendungsbeispiel:
Aufruf einer Funktion, die die Nullstelle einer anderen Funktion berechnet
// x1, x2 = Intervallgrenzen
113
Anwendungsbeispiel:
Windows-Funktionsweise mit „Callback“-Funktionen
114
7.9 (Weitere) komplexe Deklarationen
double *x[100];
x ist kein Zeiger auf einen Vektor mit 100 Elementen vom Typ double, sondern
ein Vektor mit 100 Elementen vom Typ Zeiger auf double !
double (*y)[100];
y ist ein Zeiger auf einen Vektor mit 100 Elementen vom Typ double.
int (*z)();
115
??????????
f1 ist ein Zeiger auf eine Funktion mit zwei Parametern vom Typ long und
dem Rückgabewert vom Typ int.
f ist ein Feld mit 10 Elementen vom Typ Zeiger auf Funktion
mit den Parametern … und dem Rückgabetyp Zeiger auf char.
char* (*f[10])(int, int (*f1)(long, long));
f ist ein Feld mit 10 Elementen vom Typ Zeiger auf Funktion mit den Parametern
vom Typ int und vom Typ Zeiger auf Funktion mit zwei Parametern vom Typ long
und dem Rückgabewert int. Der Rückgabewert der Funktionen im Feld f ist vom Typ
Zeiger auf char.
116
7.10 Zeiger und typedef
117
8. Benutzerdefinierte Datenstrukturen
8.1 Struktur (struct)
nur sinnvoll, wenn keine weiteren Variablen gleichen Typs folgen sollen
118
Zugriff auf Komponenten einer Struktur: Der Punktoperator
Der Pfeiloperator
px->re = 1.1; // == x.re=1.1;
px->im = 2.2; // == y.im=2.2;
119
120
typedef struct tagBITMAP {
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
typedef unsigned short WORD; WORD bmPlanes;
WORD bmBitsPixel;
typedef void* LPVOID; LPVOID bmBits;
} BITMAP, *PBITMAP;
Windef.h
121
typedef struct {
int Breite, Hoehe;
short BytesProPixel;
...
char *Daten;
} Bild;
123
Geschachtelte Strukturen
124
Vektor, dessen Elemente Strukturen sind
ErgX = (*ptr).x;
ErgY = (*ptr).y;
ptr->x = 2.2;
ptr->y = 3.3;
125
Rekursive Strukturen
126
8.2 Union
union vario a;
int x = 123;
double y = 1.234;
127
128
129
8.3 Bitfelder
// Beispiel
#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04
130
Beispiel aus der (Windows-)Praxis
131
132
133
134
135
136
9. Speicherverwaltung
9.1 Speicher reservieren
#include "stdlib.h"
*malloc (memory allocation) gibt einen Zeiger auf den Speicherplatz zurück.
Typ des Zeigers: Pointer auf void
#include "stdlib.h"
int* ptr;
if (ptr = (int*) malloc (sizeof(int)) != NULL);
{
*ptr = 123;
}
else
printf ("Nicht genügend Speicherplatz!");
137
#include "stdlib.h"
int* ptr;
int y;
138
#include "stdlib.h"
*calloc gibt einen Zeiger auf den Speicherplatz zurück und setzt Inhalte auf 0.
Typ des Zeigers: Pointer auf void
#include "stdlib.h"
int* ptr;
if (ptr = (int*) calloc (3, sizeof(int)) != NULL);
printf ("Pointer zeigt auf 3 int");
else
printf ("Nicht genügend Speicherplatz!");
139
#include "stdlib.h"
int* ptr;
if (ptr = (int*) calloc (3, sizeof(int)) != NULL);
printf ("Pointer zeigt auf 3 int");
else
printf ("Nicht genügend Speicherplatz!");
free (ptr);
140
9.3 Werte- und Zeigersemantik
int a, b;
Wertesemantik:
a = 100; Statische Variable
b = a; • Variablentyp und Variablenname
... • Zugriff über Variablenname
• Gültigkeit durch statische Struktur des Programms festgelegt
*a = 100;
Zeigersemantik: *b = *a;
Dynamische Variable ...
free (a);
• keine Variablenvereinbarung free (b);
• kein Variablenname
• Zugriff NUR über Pointer
• werden zur Laufzeit in einem Speicherbereich (Heap) angelegt und können wieder
gelöscht werden (Speicherplatzfreigabe)
• Pointer auf die dynamische Variable ist i.d.R. eine statische Variable
141
9.4 Doppel-Zeiger
Fall 1:
Wir wollen uns 12 Zahlen merken
int a [12];
4 18 66 2 101 7 9 65 56 47 0 22
a a[0]......a[2]...................................................a[11]
*a......*(a+2)...............................................*a+11
142
9.4 Doppel-Zeiger
Fall 2:
Wir wollen uns n Zahlen merken
n = .... ;
a = (int*) malloc (n * sizeof (int));
4 18 66 2 101 ...
a a[0]......a[2]...............................a[n-1]
*a......*(a+2)................
143
9.4 Doppel-Zeiger
Fall 3:
Wir wollen uns k Zahlenreihen merken, jede soll ihre eigene Länge n [ i ] haben.
Wir müssen uns erst einmal auch noch die k Längen merken.
k = .... ;
n = (int*) malloc (k * sizeof (int));
for (i = 0; i < k; i++)
n[i] = ...;
5 4 7 5 10 ...
n n[0]......n[2]...............................n[k-1]
*n......*(n+2)................
144
9.4 Doppel-Zeiger
k = .... ;
n = (int*) malloc (k * sizeof (int));
for (i = 0; i < k; i++)
n[i] = ...;
a[0]
a
a[2]
.
.
.
145
9.4 Doppel-Zeiger
k = .... ;
a[2][4] = 543;
n = (int*) malloc (k * sizeof (int)); *(a[2]+4) = 543;
for (i = 0; i < k; i++) *(*(a+2)+4) = 543;
n[i] = ...;