int a[2][3];
cout << a+1 << " " << a << " " << (a+1) - a << endl;
출력 :출력을 이해하는 방법?
0029FAC0 0029FAB4 1
이 (a+1)-a
이 0029FAC0-0029FAB4=12
을해야하지?
int a[2][3];
cout << a+1 << " " << a << " " << (a+1) - a << endl;
출력 :출력을 이해하는 방법?
0029FAC0 0029FAB4 1
이 (a+1)-a
이 0029FAC0-0029FAB4=12
을해야하지?
아니요, 포인터 계산은 이며 사용자가 가리키는 대상에 따라으로 조정됩니다. 이 경우 정수가 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에서는이를 위임하지 않기 때문에) 크기가 조정되지 않은 뺄셈 일뿐입니다.
그래,'(a + 1) - a'가 '12'가 아닌 이유는 무엇입니까? – lex
@lex, 미안, 내가 그걸 명확하게 만들 거라고 생각 했어. 비록 12 야드이긴하지만, 그건 1 _element_으로 축소되었다. – paxdiablo
우수 설명. 잘 했어. +1 (축소) – wilhelmtell
cout << b << b - a << endl;
그냥 (pointerA - pointerB)
과 다른 길을가는 포인터 인수 후 N 번째 데이터 요소에 (pointer + N)
점으로 당신에게 포인터 betweeen 데이터 요소의 수를 제공합니다. 이 경우, 데이터 요소는 int[3]
입니다 (12를 예상하기 때문에 분명히 이미 알고 있습니다 ...).
원시 주소 값 (일반적으로 어쨌든 컴퓨터에 따라 다름)의 차이는 기대하지 않아야합니다. C/C++이 변환 중입니다.
포인터 산술 연산; - 유효
이고 유효한 연산에서와 같이, 그것을 (x+1)-x = x - x + 1 = 1
주장한다.
(a+1)
배열의 두번째 요소하지
포인터하지만 배열의 끝 후에 바이트
포인터를 의미한다.
포인터를 인쇄하면 기본적으로 암시 적으로 바이트 주소를 사용하여 표시 할 정수로 변환됩니다.
포인터를 빼면 결과는 ptrdiff_t
이며 이미 정수형입니다. 같은 유형의 포인터 만 빼기 만하면 sizeof
유형이 계산에 포함됩니다. 결과는 바이트 수가 아닌 두 포인터 사이의 요소 수입니다. (두 포인터가 같은 배열을 가리키고 있지 않다면 감산은 정의되지 않은 동작입니다.)
위의 경우 포인터 유형은 "3 ints의 배열에 대한 포인터"이며 두 포인터는 다음과 같습니다. 그 2 개 (3 int 치의 배열)의 배열 내의 2 개의 인접한 요소. 그것들은 1 엘리먼트 간격이지만 12 바이트 떨어져 있습니다.
'* (a + 1) - * a'는'3'을 산출하고'int (a + 1) - int (a)'는'12'를 산출합니다. –
'a + 1-a'가 '1'이라고 생각하지 않습니까? 그것은 'a'가 1을 떠나서 서로 취소한다는 점을 감안할 때 논리적 인 대답처럼 보입니다. –