본문 바로가기
* Language/C

초등학생도 쉽게 이해하는, 포인터 *p++와 (*p)++의 차이점

by codinguser 2025. 6. 18.

 

 

c언어에서 포인터를 공부하다 보면, 다음 아래의 개념이 엄청 햇갈린다. 바로 *p++와 (*p)++의 개념이다. 이 둘은, 겉으로 보기에는 비슷해보이지만, 우선순위 때문에 작동 방식이 다르다.

 

 

*p++와 (*p)++는 C/C++에서 자주 혼동되는 문법이니, 우선 1개씩 뜯어서 간단하게 코드 예제와 함께 차이점을 살펴보자.

 

 

1. *p++ 의 의미

 

 

현재 p는 arr[0]을 가리키고 있습니다.

#include<stdio.h>

int main()
{
    int arr[] = {10, 20, 30};
    int *p = arr;
    printf("%d\n", *p++); // 출력: 10
    printf("%d", *p); // 출력 : 20
}

 

해석

  • p++ 가 먼저 실행됨 (후위 증가 연산자)
  • 하지만 *가 붙었으므로, 증가하기 전의 포인터 p가 가리키는 값을 출력
  • 즉, *p++는 다음과 같음: *(p++)

실행 흐름

  1. *p → 현재 10
  2. p++ → 그 후 포인터가 다음 주소로 이동 (이제 p는 arr[1]을 가리킴 -> 20)

 

 

2. (*p)++ 의 의미

위의 코드에서 초기화 후 다시 코드를 살펴보면 다음아래와 같습니다

 

#include<stdio.h>

int main()
{
    int arr[] = {10, 20, 30};
    int *p = arr;

    printf("%d\n", (*p)++); // 출력: 10
    printf("%d", *p); // 출력 : 11
}

 

 

해석:

  • *p가 먼저 실행됨
  • 그 값을 ++ (즉, 값 자체를 증가시킴)
  • (*p)++는 괄호 때문에, *p가 가리키는 값을 1 증가시키고 이전 값을 반환

실행 흐름:

  1. *p → 현재 10
  2. (*p)++ → 10 출력, 이후 *p의 값은 11이 됨
  3. 포인터 p는 그대로 arr[0]을 가리킴

 

전체 코드로 이해했나 살펴보기

 

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30};
    int *p = arr;

    printf("(*p)++ = %d\n", (*p)++); // 출력: 10, arr[0]은 11이 됨
    p = arr;                        // 포인터 초기화
    printf("*p++ = %d\n", *p++);    // 출력: 10, p는 arr[1]을 가리킴
    printf("현재 *p = %d\n", *p);   // 출력: 20
    return 0;
}

 

 

핵심 포인트

  • *p++ : 포인터가 다음 위치로 이동하면서 현재 값을 읽음
  • (*p)++ : 현재 포인터가 가리키는 값 자체를 증가

 

 

이 둘은 괄호 위치 하나 차이인데, 동작이 완전히 달라지므로 꼭 차이점을 이해하고 있어야 한다.

 

댓글