2015-01-01 5 views
1

나는 나는 다음과 같은 코드를 가지고 출력 그냥 혼란 스러워요 :인접 배열 요소의 주소 사이의 차이 ..?

int arr[] = {10,20,30}; 
cout<<&arr[1]<<"\t"<<&arr[0]<<"\t"<<&arr[1] - &arr[0]; 

나는 주소의 차이가 1을 준 이유를 알고 싶은

0046F7A0 0046F79C 1 

같았다있어 출력 (나는 4를 기대했다) ...? 포인터 뺄셈과 관련이 있습니까 ..?

+1

은 다음과 같이 중복 될 수 있습니다. http://stackoverflow.com/questions/8357151/when-i-subtract-memory-addresses-why-is-the-result-smaller-than-i-expected –

답변

4

예, 결과는 pointer arithmetic입니다. 이는 arr + 1arr[1]을 가리키는 동일한 이유입니다. 포인터 계산은 두 포인터가 동일한 배열의 요소를 가리킬 때만 잘 정의됩니다. 이러한 포인터가 두 개 (PQ) 인 경우 배열 위치 ij을 가리킨 다음 P-Q = i-j을 가리 킵니다.

인쇄 된 실제 주소의 차이를 보면 차이가 4입니다.

0

정확합니다. 이것은 포인터 연산과 관련이 있습니다. 두 개의 int 포인터를 뺀 것은 sizeof (int) 단위로 측정 된 차이를 나타냅니다. char의 크기의이 보장되는대로, char 포인터에 포인터를 캐스팅하여 일반 바이트의 차이를 얻을 수 있습니다 1.

uint arr[] = {10,20,30}; 
cout << &arr[1] << "\t" << &arr[0] << "\t" << (char*)&arr[1] - (char*)&arr[0]; 

출력 :

0x23fe44  0x23fe40  4 
-1

0046F7A0 - 0046F79C 실제로 4하지만 &arr[0]-&arr[1] = (0046F7A0 - 0046F79C)/sizeof(int= 4 bytes) 때문이다 두 포인터를 뺀 것은 그들 사이의 요소 수를 제공합니다.