Was ist der Unterschied zwischen primitiven variablen und Referenzvariablen?

guterfrager5  09.12.2022, 14:49

Meinst du mit "Referenzvariablen" einfach nur komplexe Typen, also Instanzen von Klassen, oder die Parameter also so wie wenn sie an eine Funktion/Methode übergeben wurden?

Django785 
Fragesteller
 09.12.2022, 15:04

Instanzen von Klassen

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo,

Ein primitiver Wert ist ein einzelnes Datenelement, das für sich genommen eine bestimmte Bedeutung hat und nicht weiter zerlegt werden kann, ohne dass diese Bedeutung verloren geht. 

Die acht primitive Datentypen haben folgende Namen: byte , short , int (integer), long , float , double , char (character) und boolean . Jeder dieser Typen besitzt eine festgelegte Anzahl an Bit.

Primitive Variablen enthalten Werte, während Referenzvariablen Referenzen auf Objekte oder Null speichern. Diese Variablen verkörpern keinen Wert wie ein Primitive sondern eine Speicheradresse (auch Zeiger genannt) auf ein Objekt oder auf NULL, damit ist ein leerer Zeiger (ohne gültige Referenz) gemeint

Referenzvariablen ermöglichen es zur Laufzeit Speicher für ein Objekt zu allozieren und deren Inhalt zu verändern. und zu verarbeiten. Dieser beim Programmstart ungenutzte Speicher wird auch Heap(Haufen) genannt.

Ich hoffe, das ist verständlich ausgedrückt.

LG

Harry

Primitive Variablen sind Variablen, die Werte des grundlegendsten Datentyps enthalten. Diese Datentypen umfassen ganze Zahlen (z.B. int), Gleitkommazahlen (z.B. float), Zeichenketten (z.B. string) und Boolean-Werte (true oder false). Primitive Variablen enthalten den Wert direkt und können nicht auf andere Variablen oder Objekte verweisen.

Eine normale Variable hat einen Wert.

eine Referenzvariable bezieht sich auf den Wert einer anderen Variablen. Wenn du diese Variable änderst, ändert sich quasi auch der Wert der Referenzvariable.

Beispiel:
a = 1
b = 2

Ausgabe:
a: 1 ; b: 2

Veränderung
a = 5

Ausgabe
a: 5; b: 2

Beispiel Referenzvariable
a = 1
b = a

Ausgabe:
a: 1; b: 1

Veränderung
a = 5

Ausgabe
a: 5; b: 5

Das ist alles recht theoretisch. Sinnvoll ist es in der OOP. Wenn du ein Objekt in eine Methode oder funktion übergibst, dann willst du fast immer das original Objekt dahin übergeben. Dort wird dann irgendwas gemacht z.B. fügst du einen Wert hinzu. Somit wird das Objekt immer als Referenz übergeben und nur sehr sehr selten als copy.

guterfrager5  09.12.2022, 14:52

mit was programmierst du denn, dass du immer Referenzen übergibst? :D

0
ThomasWeuster  09.12.2022, 15:02
@guterfrager5

In PHP werden immer Objekte als Referenz übergeben.
Ich glaube aber, dass war zu Schulzeiten (20 Jahre her) in C++ auch so.

0
guterfrager5  09.12.2022, 15:15
@ThomasWeuster

In C/C++ wird alles als Wert übergeben (bzw. in C halt als Pointer) :3

void foo (int wert) {
  wert = 3;
}

void bar (int& referenz) {
  referenz = 3;
}

int x = 1;
foo(x) // x == 1
bar(x) // x == 3

Ich habe nochmal nachgeguckt (ich benutze nicht wirklich PHP) aber da gibt es doch auch den Referenz-Operator wie in C++. Bist du sicher, dass das immer als Referenz übergeben wird, bzw. hast eine Quelle dafür?

In den paar mal wo ich es brauche, ist es vielleicht nicht so mega wichtig, es würde mich aber doch interessieren, weil ich bisher der Meinung war, dass es pass-by-value wäre.

1
J0T4T4  09.12.2022, 15:26
@guterfrager5

In Java hantiert man doch standardmäßig nur mit Referenzen von Objekten, oder?

1
ThomasWeuster  09.12.2022, 15:41
@guterfrager5

In PHP und Javascript:

Objekte werden immer als Referenz übrgeben.
Variablen als Wert uns somit nicht als Referenz.

Ich programmiere es täglich ;).

1
guterfrager5  09.12.2022, 15:42
@J0T4T4

Java ist da so ein Problemkind wie JS (aber nicht ganz so schlimm 😅).

Normal werden Variablen als Wert übergeben. Von einem Objekt wird aber die Adresse im Heap gespeichert, und wenn die als Wert übergeben wird, ist es praktisch so als ob es eine Referenz wäre, weil die Adresse einfach kopiert wird und so kein neuer Speicher reserviert wird 🙈

0
guterfrager5  09.12.2022, 15:43
@ThomasWeuster

nichts gegen dich aber du tust mir Leid, dass du die schwere Bürde tragen musst, mit JS täglich auszukommen :'D

0