인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Jeongmin Kim님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.4 포인터와 배열

10.4 포인터와 배열 13:05 *ptr++

작성

·

44

1

for문에서 *ptr++을 하게 되면 역참조를 먼저해서

*ptr 실행 후 ptr++로 진행하는 방식이라고 했는데, 실행되는 형태로 보면 *ptr을 먼저 실행한다면 (*ptr)++의 방식이 되면서 처음의 값이 100부터 109까지 나와야 하는 것 아닌가요?

답변 2

2

Soobak님의 프로필 이미지

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

좋은 질문이시네요.

*ptr++ 는 먼저 포인터를 역참조하여 값을 가져온 후, 포인터를 증가시키는 '포인터 연산' 임을 생각해보시면 혼동되시는 부분을 명확히 하실 수 있을 것 같습니다.

*ptr++*ptr 을 통해 현재 포인터가 가리키는 값을 가져온 후, ptr++ 으로 '포인터' 를 한 칸 증가시킵니다.
(*ptr++ 표현식에서 * 역참조 연산자와 ++ 후위 증가 연산자의 우선순위로 인해 *ptr++*(ptr++) 으로 해석됩니다. 후위 증가 연산자의 특성으로 ; 을 만나기 이전까지의 연산 과정은 위와 같습니다.)

따라서, 포인터가 그 다음 배열 요소를 가리키도록 증가시키는 것으로, 배열 arr 의 각 요소들이 순차적으로 출력됩니다.

(*ptr)++; 은 말씀하신 내용과 같이 '포인터가 가리키는 값' 을 증가시키는 연산입니다.

 

요약해보면,
*ptr++ 는 먼저 포인터를 역참조하고, 그 후 포인터를 증가시킵니다.
(*ptr)++ 는 먼저 포인터가 가리키는 값을 증가시키고, 그 후 값을 사용합니다.

Jeongmin Kim님의 프로필 이미지
Jeongmin Kim
질문자

감사합니다 ㅎㅎ

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. Jeongmin Kim님.

질문하신 주제는 “포인터의 증가 및 역참조”입니다. *ptr++ 구문은 C언어에서 포인터의 이동과 관련하여 종종 혼동의 여지를 줄 수 있는 부분입니다.

*ptr++의 의미는 “현재 ptr이 가리키고 있는 값을 참조한 뒤에 ptr을 증가시킨다”라는 의미로, 이는 후위 증가 연산자를 사용한 것입니다. 즉, 포인터 ptr 자체가 증가하기 전에 ptr이 가리키는 값을 먼저 역참조(populating)를 하게 됩니다. 따라서 이 경우엔 ptr이 가리키고 있는 현재 위치의 값을 반환하고 나서 포인터 ptr이 이동합니다.

반면 (*ptr)++ 연산은 ptr이 가리키고 있는 값을 증가시키는 연산이며, ptr 자체는 증가하지 않습니다. 따라서 *ptr++(*ptr)++은 기본적으로 다르게 동작합니다.

아래와 같은 예시를 통해 더 쉽게 이해하실 수 있습니다.

int arr[] = {100, 101, 102};
int *ptr = arr;

printf("%d\n", *ptr++); // 출력: 100, 그리고 ptr은 arr[1]을 가리킴.
printf("%d\n", *ptr);   // 출력: 101

위 코드는 포인터가 가리키는 초기 값인 100을 출력한 후, 그 다음 위치의 값인 101을 출력하도록 합니다.

관련 질문과 답변을 통해 더 깊이 있는 이해를 원하신다면 아래의 링크를 참조하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 질문 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.