나는 나는 다음과 같은 코드를 가지고 출력 그냥 혼란 스러워요 :인접 배열 요소의 주소 사이의 차이 ..?
int arr[] = {10,20,30};
cout<<&arr[1]<<"\t"<<&arr[0]<<"\t"<<&arr[1] - &arr[0];
나는 주소의 차이가 1을 준 이유를 알고 싶은
0046F7A0 0046F79C 1
같았다있어 출력 (나는 4를 기대했다) ...? 포인터 뺄셈과 관련이 있습니까 ..?
나는 나는 다음과 같은 코드를 가지고 출력 그냥 혼란 스러워요 :인접 배열 요소의 주소 사이의 차이 ..?
int arr[] = {10,20,30};
cout<<&arr[1]<<"\t"<<&arr[0]<<"\t"<<&arr[1] - &arr[0];
나는 주소의 차이가 1을 준 이유를 알고 싶은
0046F7A0 0046F79C 1
같았다있어 출력 (나는 4를 기대했다) ...? 포인터 뺄셈과 관련이 있습니까 ..?
예, 결과는 pointer arithmetic입니다. 이는 arr + 1
이 arr[1]
을 가리키는 동일한 이유입니다. 포인터 계산은 두 포인터가 동일한 배열의 요소를 가리킬 때만 잘 정의됩니다. 이러한 포인터가 두 개 (P
및 Q
) 인 경우 배열 위치 i
및 j
을 가리킨 다음 P-Q = i-j
을 가리 킵니다.
인쇄 된 실제 주소의 차이를 보면 차이가 4
입니다.
정확합니다. 이것은 포인터 연산과 관련이 있습니다. 두 개의 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
0046F7A0 - 0046F79C
실제로 4
하지만 &arr[0]-&arr[1] = (0046F7A0 - 0046F79C)/sizeof(int= 4 bytes)
때문이다 두 포인터를 뺀 것은 그들 사이의 요소 수를 제공합니다.
은 다음과 같이 중복 될 수 있습니다. http://stackoverflow.com/questions/8357151/when-i-subtract-memory-addresses-why-is-the-result-smaller-than-i-expected –