dereferenzieren und Fortschritt-Zeiger in einer Aussage?
-
11-09-2019 - |
Frage
Ich bin von einem Byte-Array wie folgt lautet:
int* i = (int*)p;
id = *i;
i++;
korrigiert mich wenn ich falsch liege, aber ++ Vorrang vor * hat, so kann die * i zu kombinieren und i ++ in der gleichen Aussage? (Z * i ++)
(dies ist technisch unsicher C #, C ++ nicht, p ist ein Byte *)
Lösung
Ich glaube, dass
id = *i;
i++;
und
id = *i++;
entspricht.
Der ++
Operator, wenn als Suffix verwendet (z.B. i++
), gibt den Wert der Variablen vor dem inkrementieren.
bin ich etwas von dem Reflektor Ausgang für
verwirrtunsafe 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++;
}
}
, die kommt als
public static unsafe void Test1(int p, out int id)
{
int* i = (int*) p;
id = i[0];
i++;
}
und
public static unsafe void Test2(int p, out int id)
{
int* i = (int*) p;
i++;
id = i[0];
}
, die eindeutig nicht gleichwertig sind.
Andere Tipps
id = *i++
wird tun, was Sie wollen.
++ ändert den Zeiger nach dem dereferenzieren.
EDIT: Wie Eric weist darauf hin, gemäß der Spezifikation, geschieht ++ nicht nach dereferenzieren. i ++ Schritten i und Rück seinen Anfangswert, so dass die spec definiertem Verhalten ist das Inkrement zu dereferenzieren vor passiert. Das sichtbare Verhalten von id = * i ++ ist das gleiche, ob Sie den Zuwachs sehen geschieht vor oder nach dereferenzieren.