차이

2012-01-04 7 views
-1

가능한 중복 :
Pointer Arithmetic차이

주어진 코드

int arr[12]; 
int * cur = arr; 
cur++; 
cout<<"cur-arr = "<<cur-arr<<endl; 

출력 1,하지만 난 sizeof(int)을 예상했다. 누군가이 행동의 본질을 설명해 주시겠습니까? (cur++)를 증가, - (여기서 무관 배열 간 포인터 변환의 의미 arr)과 이전 값과 비교

+1

그 점에 대해 어떻게 이해하지 못합니까? 너는 무엇을 기대 했는가? – Mat

+0

'cur ++'는 무엇이라고 생각하십니까? –

+0

이것은 [포인터 연산] (http://stackoverflow.com/questions/394767/pointer-arithmetic)입니다. – ulidtko

답변

2

cur 어떤 값으로 초기화 int 포인터이다. 당연히, 그것은 증가 작업을 통해 하나씩 증가했습니다.

주어진 유형의 포인터 연산은 일반 산술처럼 작동합니다. 이 예제에서는 포인터가 sizeof(int) 바이트 씩 진행되는 동안 포인터 간의 차이도 sizeof(int) 단위로 계산되므로 일반 간단한 산술을 볼 수 있습니다.

+0

그건 아니에요. * 증분 *, 포인터 자체가 하나 증가하지 않습니다. 'sizeof (int)'에 의해 증가했지만 포인터 빼기 연산자는 바이트가 아닌 ** 요소 **의 차이를 반환합니다. – ulidtko

+0

@ulidtko :별로 중요하지 않습니다. 추상화를 고려할 때 기본 값이'(int) 1 '이상으로 증가하더라도 확실히 증가합니다. –

3

여기에서 요소 수 (ints)는과 cur 사이입니다 (뺄셈시 arr+1). 컴파일러는 cur이 정수에 대한 포인터이고 arr이 정수 배열임을 참고합니다. 총 바이트 수를 얻으려면 다음을 시도하십시오.

(cur - arr) * sizeof(arr[0]); 
4

이것은 C 포인터 연산의 정의 된 동작입니다. 그것은 뾰족한 유형의 크기를 단위로 사용합니다. 마지막 줄의 빼기를

(char *)cur - (char *)arr 

으로 변경하면 출력이 4가됩니다.

+1

'char *'이 될 것입니다. 'void * '에 산술 연산을 할 수 없습니다. –

+0

일부 컴파일러는'void *'연산을 허용합니다. 'char *'는 확실히 좋네요. – ugoren

1

포인터의 더하기 및 빼기는 포인터 유형에 따라 작동합니다.