Ist ein dereferenzierter Zeiger ein gültiger Lvalue?

Lesezeit: 3 Minuten

Annahme der Definition:

int i  = 10;
int *p = &i;

Warum ist hier *pa gültiger Lvalue:

*p+=10; 

Sollte *p nicht den Wert von int ergeben, der bei &i gespeichert ist, dh. 10, und daher einen “Not an lvalue”-Fehler generieren?

  • Ich weiß nicht, warum du heruntergestimmt wurdest. Ich denke, das ist eine gute Frage

    – SiegeX

    24. Januar 2011 um 19:51 Uhr

  • Ich dachte immer an *p als Synonym für iund geriet nie in Verwirrung.

    – Kevin

    24. Januar 2011 um 20:24 Uhr

  • *p “wertet den Wert von int aus, der unter gespeichert ist &i“, wenn es als R-Wert verwendet wird. Aber als L-Wert ist es dasselbe wie der L-Wert i.

    – Aschepler

    24. Januar 2011 um 20:34 Uhr

  • *p bedeutet immer “den Inhalt der Stelle, auf die von verwiesen wird p“. Der Unterschied zwischen der Interpretation von *p als lvalue vs. ein rvalue ist das wann *p als lvalue erscheint, versteht es sich von selbst, dass dies die Absicht ist einlagern der Ort, auf den gezeigt wird pwährend wenn *p als rvalue verwendet wird, versteht es sich, dass dies beabsichtigt ist den Inhalt abrufen der Speicherstelle, auf die von gezeigt wird p.

    – Bob Jarvis – Слава Україні

    25. Dezember 2017 um 19:18 Uhr

  • @Kevin – mein internes mentales Lesen von *p ist “das Objekt des Zeigers p”. Ein bisschen wortreich vielleicht, aber mental übersetzt das *p += 10 in “das Objekt des Zeigers p wird um 10 erhöht”.

    – Bob Jarvis – Слава Україні

    25. Dezember 2017 um 19:22 Uhr


Benutzer-Avatar
BelagerungX

Ein Wert ist ein Ausdruck, der sich auf einen Speicherbereich bezieht, der manipuliert werden kann.

*p ist ein solcher Ausdruck, der sich auf einen Speicherbereich bezieht. Das ist anders als sagen 10+=10; Weil 10 bezieht sich nicht wie eine Variable auf einen Speicherbereich.

  • 10 ist ein Ausdruck. Es ist einfach kein lvalue.

    – Antti Haapala – Слава Україні

    25. Dezember 2017 um 19:11 Uhr

Ich glaube, Sie sind mit der Definition von verwirrt p. p ist in der Tat eine Variable vom Typ Zeiger auf intund sein Wert wird mit der Adresse von initialisiert i.

Dennoch, *p ist auch ein gültiger lvalue – ein gültiger Ausdruck für einen Speicherort.

In sehr einfachen Worten zeigen Zeiger auf ein Objekt (im allgemeinen, nicht OOP-Sinn), nicht auf den Inhalt dieses Objekts. Also ja, ein dereferenzierter Zeiger ist ein gültiger Lvalue.

Auf sehr niedrigem Niveau. Ein Zeiger ist nichts anderes als eine Speicheradresse, ein dereferenzierter Zeiger ist der Speicher an dieser Adresse.

Sollte nicht *p werten Sie den Wert von int aus, der unter gespeichert ist &i, dh. 10, und daher einen “Not an lvalue”-Fehler generieren?

In einfachen Worten,

* bedeutet “Wert an Adresse”.

*p bedeutet “Wert an Adresse gegeben durch den Wert von p“.

*p = 10; bedeutet “setze 10 als den Wert an der Adresse, die durch den Wert von gegeben ist p“.

lvalue ist ein Ausdruck, der sich auf ein Objekt bezieht, das irgendwo im Speicher gespeichert ist. *p ist auch ein Ausdruck, der sich auf ein am Standort gespeichertes Objekt bezieht p.

Benutzer-Avatar
Antti Haapala – Слава Україні

C11 6.5.3.2p4:

Semantik

  1. Das Unäre * Operator bezeichnet Indirektion. Wenn der Operand auf eine Funktion zeigt, ist das Ergebnis ein Funktionsbezeichner; wenn es darauf hindeutet ein -Objekt ist das Ergebnis ein Lvalue, der bezeichnet das Objekt. Wenn der Operand vom Typ „Zeiger auf Typ“ ist, hat das Ergebnis den Typ „Typ“. Wenn dem Zeiger ein ungültiger Wert zugewiesen wurde, ist das Verhalten des unären * Operator ist undefiniert

Dh mit

int i  = 10;
int *p = &i;

das Ergebnis von *p ist ein lvalue, der das Objekt bezeichnet i.

Deswegen *p += 10 funktioniert, da es sich um einen lvalue handelt.

Wenn nun ein lvalue in einem Kontext verwendet würde, in dem das Objekt selbst benötigt wird, wäre dies der Fall in den Wert umgewandelt, der im bezeichneten Objekt gespeichert ist. Das nennt man die lvalue-Konvertierungund der resultierende Wert ist natürlich kein lvalue mehr (C11 6.3.2.1p2).

1334340cookie-checkIst ein dereferenzierter Zeiger ein gültiger Lvalue?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy