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++)
실행 흐름
- *p → 현재 10
- 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 증가시키고 이전 값을 반환
실행 흐름:
- *p → 현재 10
- (*p)++ → 10 출력, 이후 *p의 값은 11이 됨
- 포인터 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)++ : 현재 포인터가 가리키는 값 자체를 증가
이 둘은 괄호 위치 하나 차이인데, 동작이 완전히 달라지므로 꼭 차이점을 이해하고 있어야 한다.
'* Language > C' 카테고리의 다른 글
[C언어] 포인터 개념 아직도 햇갈리시나요? 코드로 봐야 100% 이해 할 수 있습니다. (0) | 2021.09.04 |
---|---|
[C언어] 사용자 입력 여러개 받기(반복문) (0) | 2021.08.30 |
[C언어] 헷갈리는 증감 연산자(++a, a++) 차이 한 번에 이해하기 (0) | 2021.08.17 |
[C언어] 확실히 알고가자 프로토타입(Prototype)이란?(개념잡기) (0) | 2021.01.06 |
[C언어] C언어를 배워야하는 이유(주관적인생각) (0) | 2020.10.17 |
댓글