는 다음의 코드를 고려 그것은 먼저 인쇄 q
를 증가하는 제포인터 산술 C에서
에 큰으나 제 2 인쇄 는 날 놀라게 않는다는 것을 의미하는 "12, 0
"이라고 날 놀라게하지 않는다. 1을 인쇄합니다!
왜 12 대신 1을 인쇄합니까? 그것은 단지 나를 괴롭힌다.
는 다음의 코드를 고려 그것은 먼저 인쇄 q
를 증가하는 제포인터 산술 C에서
에 큰으나 제 2 인쇄 는 날 놀라게 않는다는 것을 의미하는 "12, 0
"이라고 날 놀라게하지 않는다. 1을 인쇄합니다!
왜 12 대신 1을 인쇄합니까? 그것은 단지 나를 괴롭힌다.
증가 연산자와 마찬가지로 포인터가있는 -
빼기 연산자도 가리키는 개체의 크기를 고려합니다. 특히 반환 된 결과는 포인터 값의 바이트 수를 포인팅 대상 객체 (예 : 12)의 크기로 나눈 값입니다. 차이는 12 바이트를 크기 12 또는 1로 나눈 값입니다.
차이점을 실제로 알고 싶다면 (숯불 *)과 뺄셈 (뺄셈)의 각 포인터를 캐스팅하십시오. 그게 당신에게 대답을 줄 것입니다.
이 코드는 당신에게 절대 값을 제공합니다
printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));
하는 math.h.를 포함하는 기억을
편집 : 코멘트에서 지적한대로 우리는 이중 캐스트가 필요하지 않습니다. 각 포인터 포인터를 int로 캐스팅 한 다음 빼서 위의 (필요없는) 이중 캐스팅과 동일한 대답을 제공합니다.
printf("%d\n", abs((int)(q) - (int)(p)));
왜 더블 캐스트입니까? –
sizeof (int)
그래서 두 개의 포인터를 가져 와서 그 차이를 바이트로 가져올 방법이 없습니까? –
(char *)에 포인터를 전송하면 바이트가 달라집니다. –
@Leif : 또는 sizeof (your_type)만큼 차이를 곱하면됩니다. –