[완료]performance counter 소스분석 중, c언어 포인터에 대해 질문.

superdma의 이미지

performance counter 소스코드에 대해 분석하고 있는 와중에,

res= *(int *)((char *)PtrToCntr + PerfCntr->CounterOffset);
이란 문장을 만났습니다. -_-;

형변환을 왜 두번에 걸쳐서 하는지 이해가 되지않습니다.

나름 해석한대 까지 표현 해보면, "PtrToCntr 포인터를 CounterOffset만큼 포인터 증가 연산 후,

그 주소를 (char *)으로 변환 한 후 다시 또 (int *)을 변환하여 int 형 변수에 접근한다" 입니다.

왜 (char *)을 형변환후 다시 (int *)으로 변환하는 지 모르겠네요.

감사합니다.

코드는 아래 링크의 pdf문석의 10쪽 중단에 위치해 있습니다.
http://lollab.com/mat/pdh/pdh1.pdf

cppig1995의 이미지

char *로 형변환한 이유는 PerfCntr->CounterOffset이 바이트 단위의 값이기 때문이고,
int *로 형변환한 이유는 int형의 값을 읽어오기 위해서입니다.

그러니까, "int 몇 개만큼 떨어진 곳에서 int를 읽어와라"가 아니라
"몇 바이트 떨어진 곳에서 int를 읽어와라"는 명령이기 때문입니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

feanor의 이미지

Quote:
PtrToCntr 포인터를 CounterOffset만큼 포인터 증가 연산 후 그 주소를 (char *)으로 변환 한 후 다시 또 (int *)을 변환하여 int 형 변수에 접근한다.

아닙니다. C에서 캐스트 연산자가 산술 연산자보다 우선순위가 높으니까 (char *)로 변환한 후 포인터 증가 연산 후 (int *)로 변환하는 것입니다. 형 변환을 두 번에 걸쳐서 하는 것이 아닙니다.