Un puntatore dereferenziato è un lval valido?

Assumendo la definizione:

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

Perché * pa valido lvalue qui:

 *p+=10; 

Non dovrebbe * p valutare il valore dell’int memorizzato in & i, es. 10 e quindi genera un errore “Not an lvalue”?

Un lvalue è un’espressione che si riferisce a una regione di memoria che può essere manipolata.

*p è una tale espressione che si riferisce a una regione di archiviazione. Questo è diverso da say 10+=10; perché 10 non si riferisce a una regione di memorizzazione come farebbe una variabile.

Credo che tu sia confuso con la definizione di p . p è, di fatto, una variabile di tipo puntatore a int , e il suo valore è inizializzato all’indirizzo di i .

Nondimeno, *p è anche un valore valido – un’espressione valida per una posizione di archiviazione.

In parole molto semplici, i puntatori indicano un object (in senso generale, non OOP), non il contenuto di quell’object. Quindi sì, un puntatore senza referenza è un valore valido.

In termini molto bassi. Un puntatore non è altro che un indirizzo di memoria, un puntatore dereferenziato è la memoria a quell’indirizzo.

Non dovrebbe *p valutare il valore dell’int memorizzato in &i , es. 10 e quindi genera un errore “Not an lvalue”?

In parole semplici,

* significa “valore all’indirizzo”.

*p significa “valore all’indirizzo dato dal valore di p “.

*p = 10; significa “imposta 10 come valore all’indirizzo dato dal valore di p “.

lvalue è un’espressione che si riferisce ad un object memorizzato da qualche parte nella memoria. *p è anche un’espressione che si riferisce a un object memorizzato nella posizione p .

C11 6.5.3.2p4 :

Semantica

  1. L’operatore unario * indica indiretta. Se l’operando punta a una funzione, il risultato è un designatore di funzione; se punta a un object, il risultato è un lvalue che designa l’ object . Se l’operando ha tipo ” puntatore per digitare ”, il risultato ha tipo ” tipo ”. Se un valore non valido è stato assegnato al puntatore, il comportamento dell’operatore unario * non è definito

Ciao

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

il risultato di *p è un lvalue che designa l’object i .

Pertanto *p += 10 funziona, in quanto è un lvalue.

Ora, se un lvalue fosse usato in un contesto in cui è necessario l’object stesso, verrebbe convertito nel valore memorizzato nell’object designato . Questa è chiamata la conversione lvalue e il valore risultante naturalmente non è più un lvalue ( C11 6.3.2.1p2 ).