Problem mit Zeigern
-
float funktion ( float * pa ) { float x = 10.0; *pa = *pa + *pa; // y=*pa=5+5=10 x = x*x + *pa; // 10*10+10=110 return x; } void main() { float x; float y = 5; //y =5 x = funktion ( &y ); --> x=110 x = x + y; // x=110+10=120 --> siehe *pa = *pa + *pa; // y=*pa=5+5=10 in funktion() printf( "%f" , x ); // 120 }
-
#include <stdio.h> float funktion ( float * pa ) { float x = 10.0; *pa = *pa + *pa; x = x*x + *pa; return x; } int main() { float x; float y = 5; x = funktion ( &y ); x = x + y; printf( "%f" , x ); return 0; }
Dem Zeiger pa wird durch den Funktionsaufruf in main die Adresse von y mitgegeben.
*pa = *pa + *pa // enspricht also y = y + y
Aessina schrieb:
da steht ja funktion(&y) - das würde beteuten , x wird die funktion y zugewiesen , die gibt es aber doch garnicht ?
Du hast das Prinzip der Pointer noch nicht verstanden.
Der Funktion funktion wird die Adresse auf einen float mitgegeben und nicht eine Funktion.
Ersetze einfach mal die Variablen durch Werte und rechne das durch. Denk aber dran, dass die Funktion function die Variable in main ändert.
-
ich bin im erklären leider nicht so gut, aber ich versuchs trotzdem mal
float funktion ( float * pa ) // pa ist der zeiger auf y { float x = 10.0; *pa = *pa + *pa; // der wert der variablen y(!!) wird verdoppelt // denn pa zeigt ja auf die variable y in main() x = x*x + *pa; // ==100.0*100.0+10.0==110.0 - 10.0 ist der verdoppelte wert von y return x; } void main() { float x; float y = 5; x = funktion ( &y ); übergebe den zeiger auf y x = x + y; // == 110.0 + 10.0 (!!) == 120.0, denn y wurde in funktion() ja verdoppelt! printf( "%f" , x ); }
der wert des zeigers pa ist natürlich initialisiert, denn der wert für pa wird ja der funktion als parameter übergeben. nämlich &y. also die adresse der speicherstelle an der y liegt.
der ausdruck *pa liefert den wert, der an der stelle gespeichert ist, auf die pa zeigt. in deinem beispiel ist das der wert der variablen y aus main().
*pa=irgendwas weist der speicherstelle einen wert zu, auf die pa zeigt. in deinem beispiel also der variablen y aus der funktion main()! es ist wichtig, daß du verstehst, daß damit der wert der variablen y in main() verändert wird! deshalb liefert x=x+y; auch nicht 115 sondern 120. der wert von y wird in funktion() verdoppelt.
*pa=*pa+*pa hat den selben effekt wie y=y+y.
-
ich danke euch erstmal für die Antworten
das problem ist für mich einfach bei solchen aufgaben , dass ich nicht recht weiß wo die zeiger jetzt hinzeigen und und und ..
habe noch einmal eine aufgabe gefundenfloat * funktion_1 ( float * pa) { *pa = *pa + 10.0; return pa; } void funktion_2 ( float *pa ) { float *x = pa; *x = *x + 25; } void main() { float x = 10.0; funktion_2 ( funktion_1( &x ) ); printf( "%f" , x ); }
mit dieser aufgabe kann ich eigentlich fast garnichts anfangen
ich weiß das funktion_2 erstmal funktion 1 aufruft und sich da den x wert holt obwohl ich mir da auch noch nicht mal so sicher bin.z.b
in funktion 1 ist
*pa = *pa + 10 ;
welchen wert bekommt pa ? den x wert? also *pa = x(10.0) + 10 = 20 ?
dann gibt return ja pa zurück an mainanschließend würde es in funktion 2 gehen
float *x = pa
da wird ein float zeiger deklariert der die adresse von pa bekommt ?
als nächstes kommt ja
*x = *x + 25 ;
wäre für mich jetzt *x ( aus main - von funktion 1 = 20 + 25 )
d.h 45
also *x = 45 ?
wäre nett von euch mir bei dieser aufgabe nochmal zuhelfen und schritt für schritt meine fragen zu beantworten
damit ich das auch mal irgendwann checke
tut mir leid für so dumme fragen hiermfg,marius
-
sry für die anderen posts - forum hatte irgendwie gelaggt
-
sry für die anderen posts - forum hatte irgendwie gelaggt
-
kann mir keiner helfen
-
rücke den code ordentlich ein, druck ihn aus.
dann nimm ein leeres blatt und nen bleistift und schreib dir dran, welche variablen/funktionen wann welche werte haben.
-
Aessina schrieb:
ich weiß das funktion_2 erstmal funktion 1 aufruft
Nein. Beide Funktionen werden nacheinander aufgerufen. Folgender Code
funktion_2 ( funktion_1( &x ) );
wird vom Compiler wie folgt verarbeitet
tmp = funktion_1( &x ); // "tmp" ist eine vom Compiler erstellte temporare Variable, welche nach dem Aufruf von funktion_2 wieder zerstoert wird funktion_2 ( tmp );
funktion_1 wird ja die Adresse von x übergeben. Jetzt gehst du einfach Schritt für Schritt beide Funktionen durch und schaust, wie sich x dabei verändert.
-
deine beschreibung dessen, was der 2. beispielcode, tut war völlig korrekt. wenn du uns jetzt noch sagen kannst, was
printf( "%f" , x );
für einen wert ausgibt, dann hast du die zeigerkiste kapiert.