C - Pointer

derFREAK27

Member
Registriert
8 Mai 2012
Beiträge
267
Hallo miteinander :).

Ich habe da mal eine kleine Frage:
Die Datei pointer_on_functions.c gibt mir pro Funktion x-Wert zurück, die mit printf ausgegeben werden.
Soweit ist alles klar, aber gibt mir printf von "f1" 4 als x-Wert zurück und nicht 6?
Ich deklariere zuerst x als 4 und dann übergebe ich dem Pointer u die Adresse von x, d.h. dieser sollte dann doch die 4 mit einer 6 überschreiben, oder verstehe ich etwas falsch?

Danke schon mal für Eure Hilfe :)

Code:
//pointer_on_functions.c

#include <stdio.h>
intx=5;
void f1 (int * u)
{
intx=4;
*u=6;
printf ("\nf1 - der Wert von x ist %d", x);
}
void f2 (int x)
{
printf ("\nf2 - der Wert von x ist %d", x);
}
int main (void)
{
printf ("\n\nmain - der Wert von x ist %d", x);
f2 (7);
f1 (&x);
printf ("\nmain - der Wert von x ist %d", x);
return 0;
}
 
hier stand mist - fishmac unter mir hat recht ....
 
Zuletzt bearbeitet:
Code:
printf ("\nf1 - der Wert von x ist %d", x);
Zugriff auf die lokale (in f1 deklarierte Variable) - Shadowing oder wie auch immer der Effekt heisst.
Versuch mal &u statt x bei printf
 
Danke schon mal für Eure Antworten :thumbsup:.
Das war eine Aufgabe aus einem C-Übungsbuch :p.

Also wenn ich es richtig verstanden habe, initialisiere ich die Variable x in f1 neu (d.h. dass auch ein neuer Speicherplatz hierfür im Stack bereitgestellt wird), bei *u übergebe ich aber noch den alten Speicherplatz von x, richtig?
4 anstatt 6 wird bei printf in f1 angezeigt, da ich mit printf auf den Spiecherplatz von x zugreife, dieser aber die neue, lokale Variable x enthält, da lokale Variablen in Funktionen globale überdecken können.

Ich hoffe ich habe Alles richtig verstanden?
 
Das war eine Aufgabe aus einem C-Übungsbuch :p.
Aus welchem?

Also wenn ich es richtig verstanden habe, initialisiere ich die Variable x in f1 neu (d.h. dass auch ein neuer Speicherplatz hierfür im Stack bereitgestellt wird), bei *u übergebe ich aber noch den alten Speicherplatz von x, richtig?
Nein. Initialisieren heisst Variable Wert zuweisen. Deklarieren heisst Speicherplatz zur Verfügung stellen bzw. reservieren.
Bietet Dein Buch einen Abschnitt Call-by-Value / Call-by-Reference?

4 anstatt 6 wird bei printf in f1 angezeigt, da ich mit printf auf den Spiecherplatz von x zugreife, dieser aber die neue, lokale Variable x enthält, da lokale Variablen in Funktionen globale überdecken können.

Nein. Der Speicherplatz "enthält" die Variable nicht. Der Variablenname (in dem Fall "x") ist ein Label für eine Adresse, dort liegt dann der Wert der Variablen. Folgende Analogie zu "x": Du hast ein Blatt Papier (Deklaration; int x) und schreibst auf das Blatt "5" (Zuweisung aus der globalen Sektion Deines Programms; x=5), dann nimmst Du ein weiteres Blatt Papier (Deklaration int x inf f1) und schreibst darauf 4 (Zuweisung in f1). Das zweite Blatt legst Du exakt auf das erste - Was sich dann auf dem ersten (unteren) Blatt befindet kannst Du dann eben nicht mehr sehen.

int x=5;

entspricht

int x;
x=5;
 
Zuletzt bearbeitet:
Call-by-Reference und Call-by-Value sind hier wirklich die interessanten Themen im Beispielcode, zusammen mit dem Thema der Sichtbarkeit von Variablen. Beides sollte in einem guten C-Buch erklärt werden und sollte dieses Beispiel "auflösen". In Kurzform:
Variable x wird einmal als globale Variable deklariert und mit dem Wert 5 initialisiert. Dann startet main und gibt den Wert 5 aus. Dann wird f2 aufgerufen und der Wert übergeben. In f2 existiert nun also eine Kopie von x (Deklaration im Funktionskopf, Initialisierung bei Funktionsaufruf). Die neue Variable heißt aber wieder x. Und enthält den gleichen Wert. Ausgabe also wieder 5.
Nun wird f1 aufgerufen. Dabei wird x nicht kopiert, sondern nur ein Pointer auf x übergeben. Die Adresse, worauf der Pointer zeigt, steht in u - und zeigt halt auf x. In f1 wird nun aber erstmal eine neue Variable deklariert und initialisiert, die wieder mal den Namen x bekommt. Eine lokale Variable. Auch wenn sie genau so heißt wie die globale, ist in unserer Funktion nur die innerste Variable sichtbar. Daher kommt 4 raus bei der Ausgabe. Allerdings zeigt der Pointer u ja noch auf die äußere x-Variable. Dieser Pointer wird dereferenziert, wir greifen nun also auf die globale Variable x zu und weisen den Wert 6 zu. Das hat innerhalb unserer Funktion keinen Unterschied zur Folge. Wenn f1 endet, gehts aber ja zurück in main und bei dieser Ausgabe müsste nun auch 6 rauskommen.

//EDIT: Ich war zu langsam ^^
 
Zuletzt bearbeitet:
Danke, jetzt habe ich Alles wirklich gerafft :thumbup:.
Super...

Und ja, in dem Buch gibt es Call-By-Value und Call-By-Reference, wieso?
Wegen der Verwendung von * und & ...

hmm... Dann hier mal zwei Empfehungen:

1.) ... weil Du so gern bei amazon shoppst :D
C Traps and Pitfalls [Englisch] [Taschenbuch]
Das Teil ist schon etwas älter, aber die Tipps ersparen die Einiges an Stress

2) ... weil Du schon genug ausgegeben hast :D
C von A bis Z

Noch viel Spass beim Lernen!
 
Zuletzt bearbeitet:
Buchtipp: Illik, Erfolgreich Programmieren in C. Titel erschien im Sybex-Verlag und sicher schon 20 Jahre her :(, aber aus meiner Sicht ein sehr gutes Buch inkl. der Pointer-Problematik.
 
Super, danke Euch allen für die Tipps :).
Ich glaube ich brauche dann bald mal ein neues Bücherregal :eek:.
 
Also C traps and Pitfalls enthält Fussanglen, in die Leute im Umfeld des Autors beim Lernen von C getappt sind - Ergo Schwerpunkt Tretminen.
Das andere ist aus der Openbook Serie und online frei verfügbar - Daher musst Du in Deinem Regal keinen Speicherplatz reservieren :D
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben