<?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=Referenz_%28Programmierung%29</id>
	<title>Referenz (Programmierung) - 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=Referenz_%28Programmierung%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Referenz_(Programmierung)&amp;action=history"/>
	<updated>2026-06-05T05:14:56Z</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=Referenz_(Programmierung)&amp;diff=136195&amp;oldid=prev</id>
		<title>imported&gt;Aka: /* Beispiel in Pascal */ Tippfehler entfernt, Kleinkram</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Referenz_(Programmierung)&amp;diff=136195&amp;oldid=prev"/>
		<updated>2024-05-05T22:08:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Beispiel in Pascal: &lt;/span&gt; &lt;a href=&quot;/index.php?title=Benutzer:Aka/Tippfehler_entfernt&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer:Aka/Tippfehler entfernt (Seite nicht vorhanden)&quot;&gt;Tippfehler entfernt&lt;/a&gt;, Kleinkram&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Referenz&amp;#039;&amp;#039;&amp;#039; ist ein Verweis auf ein [[Objekt (Programmierung)|Objekt]]. Eine Referenz ist damit ein [[Aliasname]] für ein bereits bestehendes Objekt.&lt;br /&gt;
&lt;br /&gt;
== Definitionen ==&lt;br /&gt;
Ein [[Zeiger (Informatik)|Zeiger]] ist eine in einer Variablen abgelegte Speicheradresse. Über diese kann das durch sie referenzierte Datenobjekt zugegriffen werden. Technisch ist der Zeiger die einzige Möglichkeit, nicht-absolut auf ein im Hauptspeicher befindliches Datenobjekt zu verweisen. In höheren Programmiersprachen tauchen Zeiger meist implizit auf. In der Zuweisung a = a + 1 ist zum Beispiel mit dem linken a die Speicheradresse der Variablen a und mit dem rechten a ihr Wert gemeint (Wodurch dieser mathematisch falsche Ausdruck überhaupt erst Sinn ergibt).  Bei expliziter Verwendung wird die Speicheradresse in einer (Zeiger-)Variablen abgelegt und kann über diese zum Zugriff auf das Datenobjekt verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Ein [[Handle]] ist eine abstrakte Referenz und kann auf verschiedene Arten dargestellt werden. Ein häufiges Beispiel sind [[Datei-Handle]]s, bei denen der zugehörige Metadatensatz (Dateideskriptor) geöffneter Dateien durch eine ganzzahlige [[Losnummer]] identifiziert wird. Das Betriebssystem erwartet bei allen Handhabungen dieser geöffneten Datei (Lesen, Schreiben, Schließen etc.)  die Angabe der zugehörigen Losnummer.&lt;br /&gt;
&lt;br /&gt;
Bei [[Verteiltes System|verteilten Systemen]] kann die Referenz mehr als eine [[Speicheradresse]] oder einen [[Bezeichner]] enthalten. Es kann auch eine eingebettete Spezifikation der [[Netzwerkprotokoll]]e enthalten, die zum Lokalisieren und Zugreifen auf das referenzierte [[Objekt (Programmierung)|Objekt]] verwendet werden, sowie die Art und Weise, wie [[Information]]en [[codiert]] oder [[Serialisierung|serialisiert]] werden. So kann beispielsweise eine [[WSDL]]-Beschreibung eines Remote-[[Webservice]]s als Referenzform angesehen werden. Es enthält eine vollständige Spezifikation zum Auffinden und Binden eines bestimmten [[Webdienste]]s. Ein Verweis auf ein verteiltes Live-Objekt ist ein weiteres Beispiel: Es handelt sich um eine vollständige Spezifikation zum Erstellen einer kleinen [[Softwarekomponente]], die als [[Proxy (Rechnernetz)|Proxy]] bezeichnet wird und anschließend eine [[Peer-to-Peer]]-Interaktion durchführt und über die der lokale [[Computer]] möglicherweise Zugriff erhält Daten, die repliziert werden oder nur als schwach konsistenter Nachrichtenstrom existieren. In all diesen Fällen enthält die Referenz den vollständigen Satz von [[Anweisung (Programmierung)|Anweisungen]] oder ein Rezept für den Zugriff auf die Daten. In diesem Sinne dient es demselben Zweck wie ein Bezeichner oder eine Speicheradresse.&lt;br /&gt;
&lt;br /&gt;
== Referenzen in C++ ==&lt;br /&gt;
&lt;br /&gt;
In der [[Programmiersprache]] [[C++]] werden Referenzen sehr häufig und für verschiedene Zwecke eingesetzt:&lt;br /&gt;
# als (kürzerer oder verständlicherer) Aliasname für ein bereits bestehendes [[Objekt (Programmierung)|Objekt]]&lt;br /&gt;
# zur Optimierung, um Kopien von Objekten zu vermeiden&lt;br /&gt;
# in speziellen Memberfunktionen, wie Copy- &amp;amp; Move-Konstruktoren und [[Zuweisungsoperator]]en&lt;br /&gt;
# als sogenannte &amp;#039;&amp;#039;universelle Referenz&amp;#039;&amp;#039; (engl.: &amp;#039;&amp;#039;universal reference&amp;#039;&amp;#039;), die bei [[Template (C++)|Templates]] einen &amp;#039;&amp;#039;beliebigen Parametertyp&amp;#039;&amp;#039; repräsentiert.&lt;br /&gt;
&lt;br /&gt;
Es gibt in [[C++]] sogenannte &amp;#039;&amp;#039;Lvalue-Referenzen&amp;#039;&amp;#039;, die durch ein an den Typ angehängtes &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; gekennzeichnet werden, und (seit [[C++11]]) zusätzlich noch &amp;#039;&amp;#039;Rvalue-Referenzen&amp;#039;&amp;#039;, die durch &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt; gekennzeichnet werden.&lt;br /&gt;
&lt;br /&gt;
=== Codebeispiele ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Unterschied von Referenz und Kopie:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int original = 5;&lt;br /&gt;
int kopie = original;&lt;br /&gt;
int&amp;amp; referenz = original;&lt;br /&gt;
&lt;br /&gt;
kopie    = 30;  // weist der Kopie den Wert 30 zu. Das Original bleibt unverändert&lt;br /&gt;
referenz = 20;  // weist der Referenz – und somit auch dem Original – den Wert 20 zu&lt;br /&gt;
original = 10;  // ändert das Original, womit aber auch die Referenz ihren Wert ändert.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Referenzparameter|Parameterübergabe als Referenz]]:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void quadrieren(int&amp;amp; x) {&lt;br /&gt;
    x = x * x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int i = 5;&lt;br /&gt;
    quadrieren(i);  // Funktionsaufruf ändert den Wert von i auf 25&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objektreferenzen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Bank&amp;amp; nBank = Bankenverzeichnis::nachBLZ(&amp;quot;76543210&amp;quot;);  // eine Referenz auf ein Bankobjekt wird beschafft&lt;br /&gt;
Konto&amp;amp; nKonto1 = nBank.kontoZugriff(&amp;quot;1234567&amp;quot;);        // eine Referenz auf ein bestimmtes Kontoobjekt wird beschafft&lt;br /&gt;
Konto&amp;amp; nKonto2 = nBank.kontoZugriff(&amp;quot;1111111&amp;quot;);        // eine Referenz auf ein weiteres Kontoobjekt wird beschafft&lt;br /&gt;
nKonto1.einzahlung(100.00, &amp;quot;EUR&amp;quot;, nKonto2);            // eine Methode wird auf nKonto1 gerufen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Klassendesign:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class Kunde&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    explicit Kunde(const std::string&amp;amp; name);  // &amp;#039;name&amp;#039; wird aus Effizienzgründen nur als const-Referenz übergeben&lt;br /&gt;
    explicit Kunde(std::string&amp;amp;&amp;amp; name);       // Rvalue-Referenz, erlaubt ein &amp;quot;move&amp;quot; aus dem Namen (seit C++11)&lt;br /&gt;
&lt;br /&gt;
    Kunde(const Kunde&amp;amp; other);  // Copy-Konstruktor&lt;br /&gt;
    Kunde(Kunde&amp;amp;&amp;amp; other);       // Move-Konstruktor (seit C++11)&lt;br /&gt;
&lt;br /&gt;
    const std::string&amp;amp; getName() const;  // gibt const-Referenz auf Kundennamen zurück&lt;br /&gt;
    std::string&amp;amp;&amp;amp; getName() &amp;amp;&amp;amp;;  // gibt Rvalue-Referenz zurück, falls Objekt selbst ein RValue ist (ab C++11)&lt;br /&gt;
…&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel in Pascal ==&lt;br /&gt;
{{Hauptartikel|Pascal (Programmiersprache)}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Übergabe &amp;#039;&amp;#039;by reference&amp;#039;&amp;#039; (der Wert der übergebenen Variablen wird geändert)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure quadriere(var wert: integer);&lt;br /&gt;
begin&lt;br /&gt;
    wert := wert * wert;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieser Prozedur kann nur eine [[Variable (Programmierung)|Variable]] übergeben werden, kein Ausdruck. &amp;lt;code&amp;gt;wert&amp;lt;/code&amp;gt; ist der lokale Name der als &amp;#039;&amp;#039;Referenz&amp;#039;&amp;#039; übergebenen Variablen. Mit der [[Zuweisung]] eines Werts wird direkt der Inhalt der übergebenen Variablen geändert.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Übergabe &amp;#039;&amp;#039;by value&amp;#039;&amp;#039; (also nur des Werts, nicht der Variablen selbst; der Wert der übergebenen Variablen wird &amp;#039;&amp;#039;nicht&amp;#039;&amp;#039; geändert)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
function quadrat(wert: integer): integer;&lt;br /&gt;
begin&lt;br /&gt;
    quadrat := wert * wert;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Ergebnis wird als Rückgabewert der Funktion an das Hauptprogramm zurückgegeben.&lt;br /&gt;
Die Rückgabe erfolgt durch eine Zuweisung an den Namen der Funktion.&amp;lt;br /&amp;gt;&lt;br /&gt;
In anderen Programmiersprachen wird dagegen &amp;lt;code&amp;gt;return x * x;&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
Selbst wenn innerhalb der Funktion eine [[Zuweisung]] an &amp;lt;code&amp;gt;wert&amp;lt;/code&amp;gt; erfolgen würde, würde dies den Inhalt einer etwa übergebenen [[Variable (Programmierung)|Variablen]] nicht ändern: Übergeben wird nur ein &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039;. Der [[Bezeichner]] &amp;lt;code&amp;gt;wert&amp;lt;/code&amp;gt; steht für eine lokale Variable, die nur innerhalb der [[Funktion (Programmierung)|Funktion]] gültig ist.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Aka</name></author>
	</entry>
</feed>