2009-04-17 5 views
12

는 다음의 코드를 고려 그것은 먼저 인쇄 q를 증가하는 제포인터 산술 C에서

에 큰으나 제 2 인쇄 날 놀라게 않는다는 것을 의미하는 "12, 0"이라고 날 놀라게하지 않는다. 1을 인쇄합니다!
왜 12 대신 1을 인쇄합니까? 그것은 단지 나를 괴롭힌다.

답변

27

증가 연산자와 마찬가지로 포인터가있는 - 빼기 연산자도 가리키는 개체의 크기를 고려합니다. 특히 반환 된 결과는 포인터 값의 바이트 수를 포인팅 대상 객체 (예 : 12)의 크기로 나눈 값입니다. 차이는 12 바이트를 크기 12 또는 1로 나눈 값입니다.

+0

그래서 두 개의 포인터를 가져 와서 그 차이를 바이트로 가져올 방법이 없습니까? –

+8

(char *)에 포인터를 전송하면 바이트가 달라집니다. –

+4

@Leif : 또는 sizeof (your_type)만큼 차이를 곱하면됩니다. –

4

차이점을 실제로 알고 싶다면 (숯불 *)과 뺄셈 (뺄셈)의 각 포인터를 캐스팅하십시오. 그게 당신에게 대답을 줄 것입니다.

이 코드는 당신에게 절대 값을 제공합니다

printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

하는 math.h.를 포함하는 기억을

편집 : 코멘트에서 지적한대로 우리는 이중 캐스트가 필요하지 않습니다. 각 포인터 포인터를 int로 캐스팅 한 다음 빼서 위의 (필요없는) 이중 캐스팅과 동일한 대답을 제공합니다.

printf("%d\n", abs((int)(q) - (int)(p))); 
+0

왜 더블 캐스트입니까? –

+0

sizeof (int) Idelic