PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu Zeigern, Adressen und Operatoren (*, &, ->)



sineP
28.12.2016, 15:03
Hallo, ich habe eine Frage zu Zeigern:
und zwar geht es darum, Werte von Zeigern zu übergeben und Adressen zu übergeben. Ich bin mir bei der Sache nicht 100% im klaren. Es wäre also sehr nett von euch, wenn jemand mitteilen kann, ob mein Wissen so korrekt ist, oder ob ich da ein Fehler mache bzw. was falsch verstehe.

Beispiel 1:

zeiger1 = zeiger2;
Da kein Dereferenzierungsoperator angegeben ist, wird die Adresse von zeiger2 an zeiger1 übergeben. Das heißt: Ändere ich etwas an Zeiger 1, wird dies auch beim original (zeiger2) geschehen, da ja beide die gleiche Adresse haben.
So weit richtig?

Beispiel 2:
(*zeiger1).wert = 20;
Durch den Dereferenzierungsoperator, wird der Wert "wert" von zeiger1 verändert bzw. auf 20 geändert.
Alternativ geht auch:
zeiger1->wert = 20;
richtig?

Beispiel3:

zeiger1 = &variable;
Der &-Operator vor der variable, gibt an, das mit der Adresse gearbeitet werden soll statt mit dem Wert der Variablen. Dem zeiger1 wird also die Adresse der Variablen "variable" übergeben. Man kann jetzt z.B. werte ausgeben oder verändern:
(*zeiger1) = 20
Gibt es hier eigentlich auch eine alternative wie z.B. weiter oben unter Beispiel 2 mit dem -> Operator? so funktionierts nämlich nicht:
zeiger1-> = 20;

Soweit alles richtig? Gibt es noch andere Möglichkeiten?

vielen Dank!

Peter(TOO)
28.12.2016, 19:45
Hallo,

Da hast da etwas grundlegend noch nicht verstanden, aber aller Anfang ist schwer!

Damit man irgendetwas im Speicher ablegen kann, braucht man dazu einen Speicherplatz.
Technisch wird dieser über seine Speicheradresse angesprochen.
Programmiersprachen sind nun aber für Menschen gemacht und da ist es einfacher eine Variable mit einem Namen anzusprechen. Wo diese Variable versteckt wird, ist dir als Programmierer meistens egal.
In manchen Fällen ist es aber besser mit der Speicheradresse zu arbeiten.

Hier hat es auch eine hübsche Graphik, welche zeigt wie das im Speicher aussieht:
http://www.peacesoftware.de/ckurs12.html

MfG Peter(TOO)

Unregistriert
29.12.2016, 09:54
zunächst fehlen in allen deinen Beispielen sämtliche Variablen-Definitionen (nicht nur für die Pointer), und außerdem sehe ich nirgends, ob du von ANSI C oder C++ in ggf. welcher Version du sprichst (ANSI C99? C++11? C++14?) - von daher führen deine Beispiele zunächst sowieso komplett ins Leere.
Andererseits habe ich zumindest in ANSI C so etwas wie dies
(*zeiger1).wert = 20;
noch nie gesehen.

sineP
02.01.2017, 17:17
Hallo und danke für die Antworten.
Ich arbeite mit C++11

Muss ich, um etwas in einen Speicher abzulegen zuerst mit new einen Speicher reservieren? Beispiel anhand einer Struktur und einem Pointer:

struct typ
{
int t1;
int t2;
} structvar;

1. Jetzt könnte ich t1 einen Wert zu weisen ohne mit "new" Speicher zu reservieren:
structvar->t1 = 10;

2. Ich könnte es aber auch anders machen und mit new vorher Speicher reservieren:
structvar = new(typ);
structvar->t1 = 10;

Wer kann mir genau erklären was genau in den Anweisungen passiert?
Wird unter 1 automatisch Speicher reserviert, und bei 2. geschieht dies manuell? Warum muss man denn mit new vorher Speicher reservieren, wenn es automatissch geschieht?

Danke!!

- - - Aktualisiert - - -

sorry, ich habe das Sternchen bei "} structvar;" vergessen. So meinte ich das:
...
} *structvar;

(also ein Zeiger)

Sisor
02.01.2017, 19:17
Gegeben:

struct typ
{
int t1;
int t2;
} *structvar;

Gleichwertig mit:

struct typ
{
int t1;
int t2;
}; // Typdefinition
typ *structvar; // Reservierung Speicher für Zeiger


Weiter mit Variante 1:
Es wird eine Operation auf structvar ausgeführt. Da der Kompiler merkt, dass die Variable benutzt werden soll, wird sie im Stack angelegt.

structvar->t1 = 10; // Operation auf structvar
Variante 2:
Durch das Schlüsselwort 'new' wird Speicher im Heap reserviert. In diesem wird dann die Zuweisungsoperation ausgeführt.

structvar = new(typ);
structvar->t1 = 10;

Counterfeiter
03.01.2017, 22:08
Hallo Sisor,

zu deinem ersten Beitrag:
1. richtig
2. richtig
3. richtig, wenn du kein * benutzen willst könntest du auch zeiger[0] = 20 schreiben. Das ist aber eher unsauber und verwirrt nur den Quellcodeleser

Dein anderer Beitrag ist etwas wirr... google mal reservierter Speicher, heap und stack...

VG

Basti