ich komme aus der Java-Welt, da existiert dieses ganze Zeiger-Ding nicht - Java hat nur Referenzen
Wobei Java Referenzen allerdings konzeptionell eher sowas wie Pointer sind...
|
C-/C++-Quelltext
|
1
|
main ()
|
Ich weiß nicht, ob das durch meinen Edit verloren ging, aber es müsste eigentlich int main() heißen. Falls dein Compiler das wirklich kompiliert, solltest du dringend auf einen aktuellen Compiler wechseln, denn das ist kein Standard-C. Falls du das in einem Buch gelesen hast, solltest du das Buch dringend durch ein aktuelles Buch ersetzen...
Um deine Frage zu beantworten, kommentiere ich am Einfachsten wohl gleich direkt deinen Code:
|
C-/C++-Quelltext
|
1
2
3
4
|
int zahl = 8;
int *zeiger;
*zeiger = zahl; // Fehler: zeiger ist uninitialisiert, dass das nicht crashed ist pures Glück.
int **zeig = &zeiger; // Ok: zeig zeigt nun auf zeiger
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
printf("\nPointer auf Variablen\n\n");
printf("Integer\n");
printf("zeiger: %d\n", zeiger); // Fehler: Du übergibst an printf einen Pointer, dein Format-String sagt aber, dass es sich um einen Integer handelt. Dass das nicht crashed, ist pures Glück.
printf("*zeiger: %d\n", *zeiger); // Ok
printf("&zeiger: %d\n\n", &zeiger); // Selber Fehler wie vorhin: &zeiger ist ein Pointer und kein Integer.
printf("Pointer\n");
printf("zeiger: %p\n", zeiger); // Hier ist es nun richtig.
printf("*zeiger: %p\n", *zeiger); // Dafür stimmt das nun nicht, *zeiger ist ein Integer und kein Pointer, dein Format-String sagt aber, dass es sich um einen Pointer handelt. Dass das nicht crashed, ist pures Glück.
printf("&zeiger: %p\n\n\n", &zeiger); // Ok, &zeiger ist ein Pointer.
printf("Pointer auf Pointer\n\n");
printf("Integer\n");
printf("zeig: %d\n", zeig); // Wieder selber Fehler, zeig ist ein Pointer und kein Integer.
printf("*zeig: %d\n", *zeig); // Fehler: *zeig ist ebenfalls ein Pointer und kein Integer.
printf("**zeig: %d\n", **zeig); // Ok, **zeig ist ein Integer.
printf("&zeig: %d\n", &zeig); // Fehler: &zeig ist ein Pointer.
printf("Pointer\n");
printf("zeig: %p\n", zeig); // Ok
printf("*zeig: %p\n", *zeig); // Ok
printf("**zeig: %p\n", **zeig); // Fehler: **zeig ist ein Integer, kein Pointer. Dass das nicht crashed, ist pures Glück.
printf("&zeig: %p\n", &zeig); // OK
|
Du stoßt hier an eines der fundamentalen Probleme von printf(), nämlich die mangelnde Typsicherheit. printf() bestimmt den Typ der übergebenen Argumente anhand des Format-String. Wenn da ein "%d" steht, dann geht printf() davon aus, dass es sich um einen int handelt. Wenn da "%p" steht, geht es davon aus, dass es sich um einen Pointer handelt. Dies wird allerdings weder beim Kompilieren noch zur Laufzeit überprüft. Du hast es hier mit sogenanntem "Undefinierten Verhalten" zu tun: Es ist im Rahmen der Sprache C nicht garantiert, was dieser Code auf einem konkreten System genau anstellen wird. Theoretisch darf hier alles passieren, unter anderem auch was du erwartest, genauso dürfte es aber auch crashen oder die Schwerkraft umkehren. Manche Compiler werden hier eine Warnung ausspucken. Auf deinem System mit deinem Compiler ist ein int wohl gleich groß wie ein Pointer, weshalb es bei dir gerade funktioniert. Bereits mit einem anderen Compiler oder gar nur anderen Compilereinstellungen könnte es aber schon Probleme geben, beispielsweise wenn du das zu einer 64-Bit Anwendung kompilierst (Pointer haben 64 bit) auf einer Platform, wo ein int nur 32 Bit hat...
|
C-/C++-Quelltext
|
1
|
system("PAUSE");
|
Ich würde empfehlen, hier einfach einen Breakpoint zu setzen, oder mal zu schauen, ob deine IDE dir da nicht helfen kann. system() ist problematisch, weil nicht portabel und unglaublich ineffizient. Auch erschwert es die Verwendung deiner Anwendung beispielsweise in einem Skript zur Batchverarbeitung...