<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Referenzparameter</id>
	<title>Referenzparameter - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Referenzparameter"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Referenzparameter&amp;action=history"/>
	<updated>2026-05-27T05:54:30Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Referenzparameter&amp;diff=61320&amp;oldid=prev</id>
		<title>imported&gt;Diaspomod: /* Beispiel */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Referenzparameter&amp;diff=61320&amp;oldid=prev"/>
		<updated>2019-09-13T21:29:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Beispiel&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Referenzparameter&amp;#039;&amp;#039;&amp;#039; ({{enS}} &amp;#039;&amp;#039;call by reference&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;pass by reference&amp;#039;&amp;#039;) sind [[Parameter (Informatik)|Parameter]] von Unterprogrammen in [[Programmiersprache]]n, mittels derer ein Unterprogramm die übergebenen Argumente wie dessen übergeordnetes Programm verwenden und ändern kann. Jede Veränderung bleibt auch nach Verlassen des Unterprogramms erhalten, da keine Kopien für das Unterprogramm erzeugt werden.&lt;br /&gt;
Der Nachteil hierbei besteht darin, dass eine ungewollte Beeinflussung von Hauptprogrammvariablen im [[Unterprogramm]] möglich ist.&lt;br /&gt;
Der Name kommt daher, dass der [[Compiler]] in den meisten Programmiersprachen die Adresse des Speicherbereichs einer Variablen oder eines Feldelements übergibt (also einen [[Zeiger (Informatik)|Zeiger]] auf die Variable oder das Feldelement), die als [[Referenz (Programmierung)|Referenz]] (Verweis, Alias) aufgefasst werden kann.&lt;br /&gt;
&lt;br /&gt;
Normalerweise stehen neben Referenzparametern auch [[Wertparameter]] zur Verfügung, seltener [[Wertergebnisparameter]].&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
In der Sprache [[Pascal (Programmiersprache)|Pascal]] muss beim Unterprogrammaufruf für jeden Referenzparameter eine [[Variable (Programmierung)|Variable]], ein Feld- oder Strukturelement als tatsächlicher Parameter angegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight highlight=&amp;quot;4,13&amp;quot; lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
// Uebergabe der Variablen X als Referenzparameter in PASCAL&lt;br /&gt;
program Demo(input, output);&lt;br /&gt;
&lt;br /&gt;
procedure Inkrementiere(var n: Integer);&lt;br /&gt;
begin&lt;br /&gt;
    n := n + 1; &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var X: integer;&lt;br /&gt;
begin &lt;br /&gt;
    Write(&amp;#039;Bitte X eingeben&amp;#039;);&lt;br /&gt;
    ReadLn(X);&lt;br /&gt;
    Inkrementiere(X);&lt;br /&gt;
    Write(&amp;#039;Der Nachfolger von X ist: &amp;#039;);&lt;br /&gt;
    WriteLn(X);&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;Inkrementiere&amp;lt;/code&amp;gt; hat den Referenzparameter &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (Zeile 4), der in Zeile 13 durch die Variable &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; als tatsächlicher Parameter &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ersetzt wird. Die Unterprogramme &amp;lt;code&amp;gt;Write&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;WriteLn&amp;lt;/code&amp;gt; (Zeilen 11 und 13) verwenden [[Wertparameter]], während &amp;lt;code&amp;gt;ReadLn&amp;lt;/code&amp;gt; einen Referenzparameter verlangt (Zeile 11), für den hier auch &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; eingesetzt wird. Dadurch ist z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;WriteLn(2*X)&amp;lt;/code&amp;gt; ohne Weiteres möglich, während &amp;lt;code&amp;gt;ReadLn(2*X)&amp;lt;/code&amp;gt; einen Syntaxfehler bei der Übersetzung erzeugt.&lt;br /&gt;
&lt;br /&gt;
Hier ein kleines Beispiel in C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight highlight=&amp;quot;8&amp;quot; lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void do_the_square(double&amp;amp; x) {&lt;br /&gt;
    x = x * x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    double value = 2;&lt;br /&gt;
    do_the_square(value);&lt;br /&gt;
&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;The square_meters are: &amp;quot; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;do_the_square()&amp;lt;/code&amp;gt; arbeitet hier auch mit einer Referenz, und da eine Referenz nur ein Verweis auf eine Variable ist und so kein Wert zurückgegeben werden muss, reicht es, hier im Kopf der Funktion einmal eine Referenz zu setzen.&lt;br /&gt;
 &lt;br /&gt;
Beim Aufruf der Funktion muss nur der Wert &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (Zeile 8) übergeben werden.&lt;br /&gt;
Anschließend hat die Funktion den Wert quadriert und &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; diesen Wert über den Verweis angenommen.&lt;br /&gt;
&lt;br /&gt;
== Formale und tatsächliche Parameter ==&lt;br /&gt;
&lt;br /&gt;
Im Beispiel wird der Referenzparameter &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (Schlüsselwort &amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;) verwendet, der bei der Deklaration des Unterprogramms erzeugt wird. Wird &amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt; weggelassen, so wird ein Wertparameter erzeugt. Beim Aufruf wird der tatsächliche Parameter &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; übergeben. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
! Referenzparameter&lt;br /&gt;
! Wertparameter&lt;br /&gt;
|-&lt;br /&gt;
! formale Parameter&lt;br /&gt;
| einfache Variablen und strukturierte Variablen &lt;br /&gt;
| einfache Variablen und strukturierte Variablen &lt;br /&gt;
|-&lt;br /&gt;
! tatsächliche Parameter&lt;br /&gt;
| nur Variablen, Felder, Feldelemente, Strukturelemente mit genau passendem Datentyp; keine Konstanten und Ausdrücke&lt;br /&gt;
| beliebige Ausdrücke wie &amp;#039;&amp;#039;1.0&amp;#039;&amp;#039;, &amp;#039;&amp;#039;2*X&amp;#039;&amp;#039;, &amp;#039;&amp;#039;sin(x)&amp;#039;&amp;#039; oder auch Typumwandlungen&lt;br /&gt;
|-&lt;br /&gt;
! Übergabe&lt;br /&gt;
| Als &amp;#039;&amp;#039;Adresse&amp;#039;&amp;#039; übergeben (geringer Aufwand bei Feldern)&lt;br /&gt;
| Als &amp;#039;&amp;#039;Kopie&amp;#039;&amp;#039; (hoher Aufwand bei Feldern)&lt;br /&gt;
|-&lt;br /&gt;
! Zuweisung innerhalb Unterprogramm&lt;br /&gt;
| möglich&lt;br /&gt;
| möglich oder verboten (je nach Programmiersprache)&lt;br /&gt;
|- &lt;br /&gt;
! Rückgabe des Wertes bei Unterprogrammende&lt;br /&gt;
| ja&lt;br /&gt;
| nein&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Moderne (optimierende) [[Compiler]] können bei Übergabe von Wertparametern ermitteln, ob eine Kopie nötig ist und gegebenenfalls darauf verzichten.&lt;br /&gt;
&lt;br /&gt;
== Simulation von Referenzparametern durch Zeiger ==&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel ist in der Sprache [[C (Programmiersprache)|C]] geschrieben, welche keine Referenzparameter kennt. Durch Benutzung von [[Zeiger (Informatik)|Zeigern]] kann aber ein ähnliches Verhalten realisiert werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight highlight=&amp;quot;5,12&amp;quot; lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Uebergabe der Variablen x als Zeigerparameter p in C&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void increment_p(int* p) {&lt;br /&gt;
    *p += 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int x = 3;&lt;br /&gt;
&lt;br /&gt;
    increment_p(&amp;amp;x);&lt;br /&gt;
    printf(&amp;quot;Das Ergebnis ist %d\n&amp;quot;, x);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Zeile 15 wird der Adressoperator &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; verwendet, so dass die Adresse der Variablen &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; an die Funktion übergeben wird. Diese wird an den Zeigerparameter&amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; (Zeile 5) übergeben.&lt;br /&gt;
&lt;br /&gt;
== Referenzparameter in Form von &amp;#039;&amp;#039;Referenzen&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
In der Sprache [[C++]] können Referenzparameter ebenso wie in C als Zeiger realisiert werden. Es wurde aber auch eine Spracherweiterung eigens zu diesem Zweck eingeführt. Diese Spracherweiterung nennt sich &amp;#039;&amp;#039;Referenz&amp;#039;&amp;#039; und hat folgende Notation:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void increment_r(int&amp;amp; r) {&lt;br /&gt;
    r += 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Vergleich dazu noch einmal das Beispiel für Zeiger:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void increment_p(int* p) {&lt;br /&gt;
    *p += 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Variante &amp;lt;code&amp;gt;increment_r&amp;lt;/code&amp;gt; entfallen also die Zeigerdereferenzierungen im Funktionsrumpf.&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// ...&lt;br /&gt;
increment_r(x); &lt;br /&gt;
// ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu der Variante mit &amp;lt;code&amp;gt;increment_p&amp;lt;/code&amp;gt; wird also hier beim Aufruf nicht der [[Adressoperator]] &amp;amp; verwendet.&lt;br /&gt;
&lt;br /&gt;
== Verwendende Programmiersprachen ==&lt;br /&gt;
* [[Pascal (Programmiersprache)|Pascal]]&lt;br /&gt;
* [[Modula-2]]&lt;br /&gt;
* [[Fortran]]&lt;br /&gt;
* [[C++]]&lt;br /&gt;
* [[PL/I]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Wertparameter]], auch &amp;#039;&amp;#039;call by value&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;pass by value&amp;#039;&amp;#039;;&lt;br /&gt;
* [[Wertergebnisparameter]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;br /&gt;
[[Kategorie:Programmierparadigma]]&lt;br /&gt;
&lt;br /&gt;
[[en:Call by reference]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Diaspomod</name></author>
	</entry>
</feed>