dereference e ponteiro avanço em uma indicação?
-
11-09-2019 - |
Pergunta
Estou lendo a partir de um array de bytes da seguinte forma:
int* i = (int*)p;
id = *i;
i++;
me corrija se eu estiver errado, mas ++ tem precedência sobre *, assim é possível combinar o * i e i ++ na mesma declaração? (Por exemplo * i ++)
(isto é tecnicamente inseguro C #, não C ++, p é um byte *)
Solução
Eu acredito que
id = *i;
i++;
e
id = *i++;
são equivalentes.
O operador ++
, quando utilizado como um sufixo (por exemplo i++
), devolve o valor da variável antes do incremento.
Estou um pouco confuso com a saída refletor para
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++;
}
}
que sai como
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];
}
que não são claramente equivalente.
Outras dicas
id = *i++
vai fazer o que quiser.
++ modifica o ponteiro após o dereference.
EDIT: Como Eric aponta, por especificação, ++ não acontece após dereference. incrementos i ++ i e retornar o seu valor inicial, de modo que o comportamento definido especificações é o incremento acontece antes de eliminar referência. O comportamento visível de id = * i ++ é o mesmo se você visualizar o incremento acontecer antes ou depois de excluir a referência.