Pointers zeigen auf eine Adresse im Speicher.
int *p; // Pointer auf ein Objekt vom typ int
char *c[20]; // Array von 20 Pointern auf Objekte vom typ char
double (*d)[20]; // Ist ein Pointer, der af ein Array mit 20 Elementen zeigt
char **ppc; // Zeigt auf ein Objekt vom Typ Pointer
// das auf ein Objekt vom Typ char zeigt
int * p, q; // p ist pointer
// q ist KEIN pointer
Sizeof: Systemarchitektur abhängig (32 bit = 32/8 -> 4 byte)
Operatoren
int i;
int *p;
int *op;
p = &i; // p zeigt auf die Adresse von i
*p = 4; // modifiziert den Wert von i
// Zeigt auf die gleiche Adresse wie p zum ZEITPUNKT des setzens.
op = p;
*op += 5; // modifiziert Objket i
Pointer müssen immer auf etwas zeigen, sonst wird IRGENDEIN Speicher modifizert.
Der alles mögliche Pointer (Void pointer)
double d = 1.0;
// Void pointer, zeigt auf alles mögliche
void *vp = &d;
// Zuerst auf double pointer casten
// dann wert von double auslesen
printf("%f", * (double*)vp);
Konstante Pointers
Konstant = nicht mehr modifizierbar
int i = 15;
int * const p = &i;
// i kann modifizert werden
i = 16;
printf("%d", *p);
// p aber nicht mehr
p++; // DAS GEHT NICHT!!!
NULL Pointer
Hat die Adresse 0
#include <stdio.h>
int *p1 = 0; //blöde idee, vorallem nicht lesbar
int *p2 = NULL; // perfekt
Für strukturen
typedef struct {
int studNr;
char name[30];
char vorname[30];
} Student;
Student notPointer;
Student *pointer;
notPointer.studNr = 4;
strcpy(notPointer.name, "Mueller");
// Hey, ich zeige auf den notPointer
pointer = ¬Pointer;
printf("%s", (*pointer).name); // Mueller
Pointer Arithmetik
int a[5] = {2, 4, 6, 8, 10};
int *p = a;
// alle folgenden Zeilen sind identisch
a[3] = 1; // vom Compiler intern als *(a + 3) = 1 generiert
*(a + 3) = 1; // a steht für die Start Adresse von a
*(p + 3) = 1; // p ist auf die Start Adresse von a gesetzt
p[3] = 1; // vom Compiler intern als *(p + 3) = 1 generiert
Iterator
int a[5];
// a+5 ist die Adresse *hinter* das
// letzte Element des Arrays: C++ Stil
for(int *it = a; it != a+5; ++it) {
*it = 0;
}
oder
int array[5];
int *it = &array[0]; // zeigt auf das erste Element von a
int *end = &array[5]; // zeigt auf das letze Element von a
for(it; it != end; ++it) {
*it = 0;
}
String Literale
char * str = "I am a literal";
printf("%s", str);
printf("%c", str[0]);
Jagged Arrays
Eindimensionale Arrays von pointern.
char *jagged[] = {
"January",
"February",
"March",
"April",
"Mai",
"June",
"July",
"August",
"September",
"October",
"November",
"December" };
if (jagged[3][2] == 'r') {
...
}
// jagged[3] is “April”
// jagged[3][2] is the third character of April