한 문장에서 피해와 사전 포인터?
-
11-09-2019 - |
문제
다음과 같이 바이트 배열에서 읽고 있습니다.
int* i = (int*)p;
id = *i;
i++;
내가 틀렸다면 나를 바로 잡으십시오. 그러나 ++는 *보다 우선합니다. 그래서 같은 진술에서 *i와 i ++를 결합 할 수 있습니까? (예 : *i ++)
(이것은 C ++가 아닌 기술적으로 안전하지 않은 C#입니다. P는 바이트*)
해결책
나는 그것을 믿는다
id = *i;
i++;
그리고
id = *i++;
동등합니다.
그만큼 ++
접미사로 사용될 때 연산자 (예 : i++
), 증분 전에 변수의 값을 반환합니다.
나는 반사기 출력에 대해 다소 혼란스러워합니다
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++;
}
}
그것은 나온다
public static unsafe void Test1(int p, out int id)
{
int* i = (int*) p;
id = i[0];
i++;
}
그리고
public static unsafe void Test2(int p, out int id)
{
int* i = (int*) p;
i++;
id = i[0];
}
분명히 동일하지 않습니다.
다른 팁
id = *i++
당신이 원하는 것을 할 것입니다.
++는 불균형 후 포인터를 수정합니다.
편집 : Eric이 지적했듯이 사양에 따라 ++는 DeReeference 이후에는 발생하지 않습니다. I ++는 I ++를 증가시키고 초기 값을 반환하므로 사양 정의 된 동작은 DeReeference 이전에 발생합니다. ID = *i ++의 가시 동작은 피로 전후에 발생하는 증분을 보더라도 동일합니다.
제휴하지 않습니다 StackOverflow