2010-12-14 6 views
2
int a[2][3]; 
cout << a+1 << " " << a << " " << (a+1) - a << endl; 

출력 :출력을 이해하는 방법?

0029FAC0 0029FAB4 1 

(a+1)-a0029FAC0-0029FAB4=12을해야하지?

+0

'* (a + 1) - * a'는'3'을 산출하고'int (a + 1) - int (a)'는'12'를 산출합니다. –

+1

'a + 1-a'가 '1'이라고 생각하지 않습니까? 그것은 'a'가 1을 떠나서 서로 취소한다는 점을 감안할 때 논리적 인 대답처럼 보입니다. –

답변

9

아니요, 포인터 계산은 이며 사용자가 가리키는 대상에 따라으로 조정됩니다. 이 경우 정수가 3 바이트 인 정수 배열을 가리키며 총 4 바이트는 총 12 바이트입니다. 하지만 그것은 산술의 "요소"로 축소되었습니다.

이 (가 축소 하지0029FAB4 + 1) a+1을 인쇄 할 때 0029FAC0보다는 0029FAB5를 얻을 같은 이유입니다.

당신이 당신의 출력 라인을 변경하는 경우 :

cout << a+1     << " " 
    << a     << " " 
    << (a+1) - a   << " " 
    << (int)(a+1)-(int)(a) << endl; 

당신은 더 이상 포인터의 뺄셈 때문에 스케일링은 마지막 학기에 사라지지 볼 수 있습니다 :

0xbfaa0ad4 0xbfaa0ac8 1 12 

명심 a+1 in (int)(a+1)a이 여전히 포인터이기 때문에 여전히 크기가 조정 된입니다. 이 시점에서 두 값이 정수로 변환 되었기 때문에 (즉, 포인터와 정수 사이의 변환에 적용되는 보통의 경고는 내 특정 구현에서는 안전하지만 C99에서는이를 위임하지 않기 때문에) 크기가 조정되지 않은 뺄셈 일뿐입니다.

+0

그래,'(a + 1) - a'가 '12'가 아닌 이유는 무엇입니까? – lex

+2

@lex, 미안, 내가 그걸 명확하게 만들 거라고 생각 했어. 비록 12 야드이긴하지만, 그건 1 _element_으로 축소되었다. – paxdiablo

+1

우수 설명. 잘 했어. +1 (축소) – wilhelmtell

-3

왜 12일까요?

x+1-x=y 

y는이 포인터의 산술 또는 정수가 될 수 없습니다.

+5

질문은 완전한 의미를 갖습니다 : 0029FAC0 - 0029FAB4는 12와 같습니다. 질문자는 포인터 계산이 어떻게 작동하는지에 대한 오해와 함께 정확한 계산을 분명히했습니다. 그들을 파멸시키는 것은 전혀 도움이되지 않습니다. – Smashery

+0

당신 말이 맞아, 그 소리. – Falmarri

0

저는 컴파일러가이를 상수로 변경한다고 생각합니다.

b = a + 1을 시도하고

+0

나는 또한 컴마 << b 또는 무언가를 cout << b- a << endl; 전에 넣어서 컴파일러가 대체하는 것을 막습니다. – Kizaru

+0

'b '의 타입을 어떻게 선언하겠습니까? – lex

1

cout << b << b - a << endl; 그냥 (pointerA - pointerB)과 다른 길을가는 포인터 인수 후 N 번째 데이터 요소에 (pointer + N) 점으로 당신에게 포인터 betweeen 데이터 요소의 수를 제공합니다. 이 경우, 데이터 요소는 int[3]입니다 (12를 예상하기 때문에 분명히 이미 알고 있습니다 ...).

원시 주소 값 (일반적으로 어쨌든 컴퓨터에 따라 다름)의 차이는 기대하지 않아야합니다. C/C++이 변환 중입니다.

0

포인터 산술 연산; - 유효

이고 유효한 연산에서와 같이, 그것을 (x+1)-x = x - x + 1 = 1 주장한다.

그래서 케이스에 (a+1) 배열의 두번째 요소하지 포인터하지만 배열의 끝 후에 바이트 포인터를 의미한다.

0

포인터를 인쇄하면 기본적으로 암시 적으로 바이트 주소를 사용하여 표시 할 정수로 변환됩니다.

포인터를 빼면 결과는 ptrdiff_t이며 이미 정수형입니다. 같은 유형의 포인터 만 빼기 만하면 sizeof 유형이 계산에 포함됩니다. 결과는 바이트 수가 아닌 두 포인터 사이의 요소 수입니다. (두 포인터가 같은 배열을 가리키고 있지 않다면 감산은 정의되지 않은 동작입니다.)

위의 경우 포인터 유형은 "3 ints의 배열에 대한 포인터"이며 두 포인터는 다음과 같습니다. 그 2 개 (3 int 치의 배열)의 배열 내의 2 개의 인접한 요소. 그것들은 1 엘리먼트 간격이지만 12 바이트 떨어져 있습니다.

관련 문제