Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

5.3 call-by-value

5.3 call-by-value

Wenn man eine Funktion mit einem oder mehreren Werten aufruft, wird nicht die Variable an sich übergeben, sondern die Funktion legt sich eine neue Variable mit einem neuen Namen an (der durchaus auch gleich sein kann) und der Wert wird rein kopiert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
					
// Addiert die zwei übergebenen Werte, addiert eins drauf und gibt Ergebnis zurück
int AddiereUndPlus1(int iSummand1, int iSummand2) {
	// Im Hintergrund wurden die zwei neuen Variablen iSummand1 und iSummand2 erzeugt, wobei
	// der Wert von iZahl1 in iSummand1 rein kopiert wurde und der Wert von iZahl2 in
	// iSummand2. Die Werte in iZahl1 und iZahl2 bleiben ansonsten unberührt. 
	
	int iErgebnis	= iSummand1 + iSummand2;
	iSummand1	= iSummand1 + 1;
	iSummand2	+= 1;	// sieht anders aus wie die Zeile darüber, macht aber das Gleiche
	
	printf("In der Funktion:\n");
	printf("%i\n", iSummand1);
	printf("%i\n", iSummand2);

	return iSummand1 + iSummand2;
} // AddiereUndPlus1 //////////////////////////////////////////////////////////



// DIESE FUNKTION WIRD IN JEDEM FALL ZUERST AUFGERUFEN ////////////////////////
int main(int argc, char** argv) {	
	int iZahl1 = 10;
	int iZahl2 = 20;
	
	printf("Vor dem Aufruf:\n");
	printf("%i\n", iZahl1);
	printf("%i\n", iZahl2);
	
	AddiereUndPlus1(iZahl1, iZahl2);	// Die Funktion gibt zwar was zurück, aber den Wert
						// brauchen wir jetzt nicht
	
	printf("Nach dem Aufruf:\n");
	printf("%i\n", iZahl1);
	printf("%i\n", iZahl2);

	return 0;
} // main /////////////////////////////////////////////////////////////////////
					

Ausgabe:

Vor dem Aufruf:
10
20
In der Funktion:
11
21
Nach dem Aufruf:
10
20

		

Was ist jetzt eigentlich passiert. Um dies zu verstehen, schauen wir uns am besten folgende Grafik an.

Programmablauf und Speicherabbild bei call-by-value

In der Funktion "main" werden zuerst zwei Variablen "iZahl1" und "iZahl2" auf dem Stack erzeugt und anschließend mit den Werten "10" und "20" initialisiert. Dies verdeutlicht der erste obere Kasten.

In Zeile 29 erfolgt jetzt der Funktionsaufruf. Dabei passieren wieder mehrere Sachen, welche ich im lertzten Unterkapitel erläuterte. Wichtig ist momentan nur, dass zuerst die Rücksprungadresse auf den Stack gepackt wird und anschließend werden alle Variablen, die in der Funktion vorkommen, erzeugt. Dabei werden die Funktionsargumente, also die Variablen im Funktionskopf, initialisiert. Dies soll der zweite Kasten verdeutlichen. Das Augenmerk sollte hier darauf liegen, dass die Variablen "iSummand1" und "iSummand2" neue zusätzliche Variablen sind und eine Kopie des Originalwertes erhalten.

Nach den ganzen Berechnungen sieht der Speicher wie der dritte Kasten aus und das entspricht dem, was in den Zeilen 11 bis 13 ausgegeben wird.

Nach dem Funktionsende werden die erzeugten Variablen vom Stack entfernt und der Computer macht in der Programmzeile weiter, welche ebenfalls auf dem Stack abgelegt wurde, also Zeile 32. Der Speicher sieht dann wieder so aus, wie im vierten Kasten. Wie Sie sehen, sind die Ausgangsvariablen unverändert und das erklärt auch die Ausgabe in den Zeilen 32 bis 34.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012