2012-04-08 6 views
0

이 의심이들 때 포인터를 다시 방문했습니다.포인터 증가 (ptr ++) 및 (* ptr ++)

int *ptr; 
int arr[5] = {10,20,30,40,50}; 
ptr = &arr[0]; 

이제 printf("Value: %d",*ptr); 내가 할 경우 10

를 인쇄 할 것이다 :

ptr++; 
printf("Value: %d",*ptr); 

이 결과는 다음과 같습니다 20

을 내가 할 마찬가지로 경우 :

*ptr++; 
printf("Value: %d",*ptr); 

결과는 다음과 같습니다 30

그러나

printf("Value: %d",++*ptr); 

내가 ptr 유형 int이기 때문에 나는 그것을 증가 할 때, 그것은 다음의 메모리 위치에 4 ​​바이트를 뛰어 줄 알았는데 나에게 31

을 제공합니다. 그런데 *ptr++ptr++에 대해 동일한 동작을 보이며, ++*ptr에 대한 동작이 아닌 이유는 무엇입니까?

+0

[ptr ++가 * (ptr ++)처럼 작동하고 (* ptr) ++가 아닌 이유는 무엇입니까?] (http://stackoverflow.com/questions/6271028/why-does-ptr-act-like- ptr-and-not-ptr) –

답변

2

제 니펫 명백 e 다음 요소, 즉 20을 반환합니다.

세 번째 코드 단은 첫 번째 코드가 포인터를 증가시키고 참조 해제 된 값을 반환하기 때문에 이전 코드와 동일하지만 그 결과는 무시됩니다. printf에서 역 참조되는 것은 증가 된 포인터이며 이제는 30을 가리 킵니다.

마지막 스 니펫은 다릅니다 : ++*ptr++(*ptr)입니다. *ptr 역 참조 ptr (이미 30을 가리킴), 30을 산출하고 ++은 31이됩니다.

4

우선 순위가입니다.

  • *ptr++ 포인터가 증가되지만, 그 이전값은 역 참조, *(ptr++) 동일하다.
  • ptr++은, 물론, ptr++과 동일하다.
  • ++*ptr++(*ptr)과 동일합니다. 즉, 포인터가 아닌 포인터가 증가합니다. 당신이 * ptr++을 수행 할 때 포인터가 증가 얻을 수 있도록
+0

'* (ptr ++)'을 할 때'ptr'의 값을 역 참조해서 포인터를 다음 메모리 위치로 증가시키는 것이 아니라 증가시켜야하지 않습니까? 그게'++ (* ptr)'에서 일어나는 것이 아닌가? – noMAD

+1

@noMAD : 아니요.'* (ptr ++)'에서 괄호는'++'가'ptr'에 적용되지 않고'* ptr'에 적용되지 않기 때문입니다. –

2

, 당신은 실제로 * (ptr++)을하고 아닌 변수는

는 포인터

에 의해 반환 된 값을 증가 있도록 ++ *ptr, 그것은 실제로 ++(* ptr)의를 가리키는 그것은 예 10

, ptr 점에 두번째 무엇을 인쇄 한 다음 토륨 가리키는 한 소자의 순방향 포인터 이동 :

1

높은 우선 순위에서 C의 우선 순위 : 포인터위한

()
++
* &
*/
+ -

그래서

*ptr++ equivlant to *(ptr++) 
++*ptr equivlant to ++(*ptr) 

및이 줄의 경우 * ptr ++; ptr 포인터 만 증가시킵니다.

0

이 트릭은 둘 다 단항 연산자 일 때 연관성이 오른쪽에서 왼쪽입니다.

* ptr ++ -> 먼저 다음 위치로 포인터를 증가시킨 다음 그 위치에서 값을 역 참조하십시오.

마찬가지로 * ++ ptr -> 먼저 포인터를 증분 한 다음 역 참조하십시오.

++ * ptr -> ptr에서 첫 번째 참조 해제 값을 입력 한 다음 값을 증가시킵니다.

관련 문제