가능한 중복 :
Pointer Arithmetic차이
주어진 코드
int arr[12];
int * cur = arr;
cur++;
cout<<"cur-arr = "<<cur-arr<<endl;
출력 1
,하지만 난 sizeof(int)
을 예상했다. 누군가이 행동의 본질을 설명해 주시겠습니까? (cur++
)를 증가, - (여기서 무관 배열 간 포인터 변환의 의미 arr
)과 이전 값과 비교
가능한 중복 :
Pointer Arithmetic차이
주어진 코드
int arr[12];
int * cur = arr;
cur++;
cout<<"cur-arr = "<<cur-arr<<endl;
출력 1
,하지만 난 sizeof(int)
을 예상했다. 누군가이 행동의 본질을 설명해 주시겠습니까? (cur++
)를 증가, - (여기서 무관 배열 간 포인터 변환의 의미 arr
)과 이전 값과 비교
cur
어떤 값으로 초기화 int
포인터이다. 당연히, 그것은 증가 작업을 통해 하나씩 증가했습니다.
주어진 유형의 포인터 연산은 일반 산술처럼 작동합니다. 이 예제에서는 포인터가 sizeof(int)
바이트 씩 진행되는 동안 포인터 간의 차이도 sizeof(int)
단위로 계산되므로 일반 간단한 산술을 볼 수 있습니다.
그건 아니에요. * 증분 *, 포인터 자체가 하나 증가하지 않습니다. 'sizeof (int)'에 의해 증가했지만 포인터 빼기 연산자는 바이트가 아닌 ** 요소 **의 차이를 반환합니다. – ulidtko
@ulidtko :별로 중요하지 않습니다. 추상화를 고려할 때 기본 값이'(int) 1 '이상으로 증가하더라도 확실히 증가합니다. –
여기에서 요소 수 (int
s)는과 cur
사이입니다 (뺄셈시 arr+1
). 컴파일러는 cur
이 정수에 대한 포인터이고 arr
이 정수 배열임을 참고합니다. 총 바이트 수를 얻으려면 다음을 시도하십시오.
(cur - arr) * sizeof(arr[0]);
이것은 C 포인터 연산의 정의 된 동작입니다. 그것은 뾰족한 유형의 크기를 단위로 사용합니다. 마지막 줄의 빼기를
(char *)cur - (char *)arr
으로 변경하면 출력이 4가됩니다.
'char *'이 될 것입니다. 'void * '에 산술 연산을 할 수 없습니다. –
일부 컴파일러는'void *'연산을 허용합니다. 'char *'는 확실히 좋네요. – ugoren
포인터의 더하기 및 빼기는 포인터 유형에 따라 작동합니다.
그 점에 대해 어떻게 이해하지 못합니까? 너는 무엇을 기대 했는가? – Mat
'cur ++'는 무엇이라고 생각하십니까? –
이것은 [포인터 연산] (http://stackoverflow.com/questions/394767/pointer-arithmetic)입니다. – ulidtko