2013-04-21 1 views
0

포인터에 대한 질문이 있습니다. 나는이 개념을 이해하기 시작했지만,이 특정 코드는 이해를 위협하고 있으며, 나는 그것을 정리하고 싶다.포인터 C - 추가 1

내가 *ptr 이후 &my_array[0]에 초기화 된, 인상 printf("ptr + %d = %d\n",i, *ptr++); /*<--- B*/

했다입니다 라인 "B"를,주의, 다음 *ptr++ (번역 것이다 "ptr에 저장되어있는 주소로 무엇이든, 추가 one to it ")은 23을 출력하며, 이는 my_array[1]에있는 값입니다.

그러나 my_array[0]의 값인 1을 출력합니다.

++이 주소 자체에 추가되는지 (1004는 1005가 되는가)에 혼란 스럽습니다. 정수는 약 4 바이트의 공간을 차지하므로 혼란 스럽습니다. 이는이 값이 my_array[0] 1, 주소 1001, 1002, 1003, 1004을 차지할 것이며, my_array[0] 1001에서 밖으로 시작 이후에만 1002까지 간다, 다음 *ptr++ 여전히) 1입니다 my_array[0], ...

또는 인쇄 할 것이다. ..

*ptr++my_array[0] (어느 쪽이 단지 *ptr)에서 my_array[1]*ptr++으로 변경되었습니다.

기본적으로이 프로그램에 대해 *ptr++이 무엇을하는지 설명하십시오. 제가 5 살 때처럼 저에게 설명해주십시오.

는 정말 감사하고, 여기에 코드는 다음과 같습니다

#include <stdio.h> 

int my_array[] = { 1, 23, 17, 4, -5, 100 }; 
int *ptr; 

int main(void) 
{ 
    int i; 
    ptr = &my_array[0];  /* point our pointer to the first 
            element of the array */ 
    printf("\n\n"); 
    for (i = 0; i < 6; i++) 
    { 
     printf("my_array[%d] = %d ", i, my_array[i]); /*<-- A */ 
     printf("ptr + %d = %d\n", i, *ptr++); /*<--- B*/ 
    } 
    return 0; 
} 

답변

3

변경이이에 printf("ptr + %d = %d\n",i, *ptr++); /*<--- B*/

: printf("ptr + %d = %d\n",i, *(++ptr)); /*<--- B*/

증가 연산자, 증가하기 전에 개체의 값이 표현식 값이 반환되는 경우 후위 버전을 사용 . 접두사 증가 연산자 (이 대답의 두 번째 코드 집합이 사용하는)는 증가 된 객체를 참조로 반환합니다.

+0

정확히 어떻게 postfix가 실제로 작동하는지 설명합니다. 얼마나 많은 사람들이 증분이 당신이 묘사 한 방식이 아닌 이전의 가치를 반환하는 * 문장 * 다음에 일어날 것이라고 생각하는 것은 놀랍습니다. C++과 같은 언어로 구현하는 것이 가장 비용이 많이 드는 이유 중 하나입니다. 왜냐하면 임시 복사본이 만들어 져야하기 때문입니다. – WhozCraig

+0

so * ptr ++는 printf 다음에 증가하고 * (++ ptr)는 수정 된 값을 인쇄하는 printf 전에 증가합니다. – user2044189

+0

그리고 * ++ ptr은 * (++ ptr)와 같습니다. 감사! – user2044189

0

* PTR ++의 printf 후 증가합니다. * (++ p)를 사용해야합니다.