dereference e puntatore anticipo una dichiarazione?
-
11-09-2019 - |
Domanda
che sto leggendo da un array di byte come segue:
int* i = (int*)p;
id = *i;
i++;
correggetemi se sbaglio, ma ++ ha la precedenza su *, così è possibile combinare il * ie i ++ nella stessa istruzione? (Ad esempio * i ++)
(questo è tecnicamente pericoloso C #, C ++ non, p è un byte *)
Soluzione
Credo che
id = *i;
i++;
e
id = *i++;
sono equivalenti.
L'operatore ++
, quando usato come suffisso (ad esempio i++
), restituisce il valore della variabile prima dell'incremento.
Sono un po 'confuso dal uscita riflettore per
unsafe class Test
{
static public void Test1(int p, out int id)
{
int* i = (int*)(p);
id = *i;
i++;
}
static public void Test2(int p, out int id)
{
int* i = (int*)(p);
id = *i++;
}
}
, che esce come
public static unsafe void Test1(int p, out int id)
{
int* i = (int*) p;
id = i[0];
i++;
}
e
public static unsafe void Test2(int p, out int id)
{
int* i = (int*) p;
i++;
id = i[0];
}
che chiaramente non sono equivalenti.
Altri suggerimenti
id = *i++
farà quello che vuoi.
++ modifica il puntatore dopo la dereferenzia.
EDIT: Come Eric fa notare, per la specifica, ++ non accade dopo dereference. i ++ incrementi i e restituisce il suo valore iniziale, in modo che il comportamento spec definito quello incremento avvenga prima dereference. Il comportamento visibile di id = * i ++ è lo stesso se si visualizza l'incremento accade prima o dopo dereference.