call-by-reference

Piesbruhder

Mitglied
Hi! Ich hab ein fieses Problem. Ich kapier nämlich nicht wie
call-by-reference funtioniert. In meinem Lehrbuch ist dieser Beispiel-
code:


#include <studio.h>

void Meine_Funktion(int &p1, int *p2, int p3)
{
p1 = 11;
*p2 ) 22;
p3 = 33;
}

void main()
{
int v1=1, v2=2, v3=3;

printf("VORHER: %d, %d, %d \n",v1,v2,v3");
Meine_Funktion(v1,&v2,v3);
printf("VORHER: %d, %d, %d \n",v1,v2,v3");
}

Es kommt raus:
VOHER: 1, 2, 3
NACHHER: 11, 22, 3

Kann mir das einer/eine ausführlich erklären? Irgendwo hab ich ne
Lücke im Hirn. Ich kapiers einfach net.

Bye!
 
Zuletzt bearbeitet:
Ich versuch's mal :).

Also der Einfachheit halber fangen wir beim letzten Parameter an: er wird "by-value" übergeben, d.h. es wird eine lokale Kopie angelegt und am Ende der Funktion wieder zerstört (in etwa als ob du die Variable in der Funktion definierst). Das Resultat ist, dass Zuweisungen an diesem Parameter die Variable die von der aufrufenden Funktion übergeben wurde nicht modifiziert wird, sondern nur die lokale Kopie davon, somit bleibt v3 gleich.´

Der zweite Parameter wird (genaugenommen) auch "by-value" übergeben, mit dem kleinen Unterschied, dass es sich dabei um einen Zeiger handelt (d.h. der Zeiger wird kopiert; nicht der Wert, wie vorher), du kannst nun zwar nicht modifizieren auf welche Adresse in main() der Pointer zeigt, allerdings sehr wohl den Inhalt dieser Adresse (das wurde in C verwendet um "call-by-reference" zu verwirklichen).

Der erste Parameter ist "richtiges" "by-reference" der Parameter p1 ist hier eine Referenz auf v1 (-> "ein Alias für v1" -> "ein anderer Name für v1"). Modifikationen auf p1 verändern also auch direkt v1, da p1 ja nur "ein anderer Name für v1" ist.

Ich hoffe mal es ist verständlich (ich gehe davon aus, dass du Pointer verstehst).
(Referenzen wurden erst in C++ zur Sprache hinzugefügt)
 
hallo,

bei deinem Beispiel glaube ich nicht das
A:"VORHER"
A:"NACHHER" herauskommt.

laut deinem Code kommt
A:"VORHER"
A:"VORHER" raus

(A:"" steht für Ausgabebefehl)

bei printf hast du dieses geschrieben
Code:
printf("VORHER: %d, %d, %d \n",v1,v2,v3");
nach ..,v3 gehört kein " mehr.

auch gibt es keinen header mit <studio.h> sondern <stdio.h>

mfg
michl
 
Die zwei Tippfehler sind für's Prinzip von call-by-reference & call-by-value völlig unbedeutend...
 

Neue Beiträge

Zurück