déréférencement et pointeur à l'avance dans une instruction?
-
11-09-2019 - |
Question
Je lis à partir d'un tableau d'octets comme suit:
int* i = (int*)p;
id = *i;
i++;
me corriger si je me trompe, mais ++ a priorité sur *, donc il est possible de combiner le * i et i ++ dans la même déclaration? (Par exemple, * i ++)
(ce qui est techniquement dangereux C #, C ++ non, p est un octet *)
La solution
Je crois que
id = *i;
i++;
et
id = *i++;
sont équivalentes.
L'opérateur ++
, lorsqu'il est utilisé en tant que suffixe (par exemple i++
), renvoie la valeur de la variable avant l'incrément.
Je suis un peu confus par la sortie du réflecteur pour
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++;
}
}
qui vient comme
public static unsafe void Test1(int p, out int id)
{
int* i = (int*) p;
id = i[0];
i++;
}
et
public static unsafe void Test2(int p, out int id)
{
int* i = (int*) p;
i++;
id = i[0];
}
qui ne sont manifestement pas équivalentes.
Autres conseils
id = *i++
va faire ce que vous voulez.
++ modifie le pointeur après la déréférencer.
EDIT: Comme Eric souligne, par la spécification, ++ ne se produit pas après déréférencement. i ++ incrémente i et retourne sa valeur initiale, de sorte que le comportement défini de spécification est l'incrément se produit avant le déréférencement. Le comportement visible id = * i ++ est le même que vous affichez l'incrément qui se passe avant ou après déréférencement.