강의

멘토링

로드맵

Inflearn brand logo image

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

박시콩님의 프로필 이미지
박시콩

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

지역변수 vs 전역변수

포인터 질문입니다,

해결된 질문

작성

·

26

0

영상이랑 관련없는 개별 질문입니다.
계속 헷갈리는게 *p++과 ++*p입니다.

우선순위에 따라서 *(p++), ++(*p) 이렇게 연산을 하는데, ++(*p)여기서, p의 값을 읽고(예를들어서 A라고 한다면) ++A가 될것이고, 전위연산을 해서 A다음의 문자인 B가 되는 것 까진 이해가 되는데, 값이 A -> B로 대체 되는게 이해가 잘 안됩니다. 대체가 되려면 어디선가 *(&A)(A의 메모리주소) = B 이런식으로 할당이 되어야 하는거 아닌가요?

답변 2

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요, 천천히 순서를 설명드려보겠습니다.

 

실제 동작 과정

++(*p)에서 일어나는 일을 단계별로 설명해보겠습니다:

int value = 65;  // 'A'
int *p = &value;

++(*p);  // 이때 무슨 일이 일어나는가?
  1. *p는 "p가 가리키는 위치의 값"을 의미합니다.

  2. ++(*p)는 "p가 가리키는 위치의 값을 1 증가시켜라"는 의미입니다.

 

메모리 관점에서 보면 이렇습니다.

메모리 주소 1000번지에 값 65('A')가 저장되어 있음
p는 1000을 가리키고 있음

++(*p) 실행 시:
- *p로 1000번지의 값(65)에 접근
- 그 값을 66으로 변경
- 1000번지에 직접 66을 저장

 

별도의 할당이 아니라 증감연산자로 직접 연산을 수행

++(*p);
// 는 내부적으로 다음과 같이 동작:
*p = *p + 1;

*p가 이미 메모리 위치를 나타내므로, C언어를 동작시키는 중간의 "컴파일러"라는 프로그램이 자동으로 해당 메모리에 직접 쓰기 작업을 수행합니다.

여기서 질문하신 것처럼, 할당이 되는 것이 아니라 해당 부분에서 직접 쓰기가 일어납니다.

 

아래 예시코드 제공해드립니다.

#include <stdio.h>

int main() {
    int value = 65;
    int *p = &value;
    
    printf("연산 전: value = %d, *p = %d\n", value, *p);
    printf("value의 주소: %p\n", &value);
    printf("p가 가리키는 주소: %p\n", p);
    
    ++(*p);  // p가 가리키는 위치의 값을 직접 증가
    
    printf("연산 후: value = %d, *p = %d\n", value, *p);
    
    return 0;
}

 

이 이상으로 이해가 안되시는 경우에는 지금 시간이 너무 모자라기 때문에

값을 읽어와서 증가시키면 직접 반영된다고 암기하고 가시는 것을 추천드립니다.

0

안녕하세요, 인프런 AI 인턴입니다. 박시콩님.

포인터와 관련된 연산에서 *p++와 ++*p는 자주 헷갈리는 부분입니다. 이를 명확히 하기 위해 각 연산의 개념을 설명드리겠습니다.

  1. *p++:

    • 이 연산에서 p가 가리키는 위치의 값을 참조하고, 그 후에 p의 주소가 증가합니다.
    • 즉, 현재 p가 어떤 값을 가리키고 있다면 그 값을 사용한 후, p 자체가 다음 메모리 주소를 가리키게 되는 형태입니다.
    • 포인터가 이동하지만 값 자체는 변화하지 않고, 출력할 때 표시된 값은 현재 위치에서 확인된 값이 됩니다.
  2. ++*p:

    • 이 연산은 p가 가리키는 메모리 위치의 값을 먼저 증가시키고, 그 증가된 값을 사용합니다.
    • 포인터 p가 어떤 메모리 주소를 가리키고 있고, 그 주소의 값이 A라면, 전위 증가 연산 ++AB로 먼저 증가시킨 다음 그 값을 참조하거나 출력합니다.
    • 여기서 포인터가 가리키는 값 자체가 변경되는 것은, 내부적으로 해당 메모리 위치의 값을 가져와서 증가시킨 후 그 값이 다시 그 위치에 덮어씌워진다고 생각하시면 됩니다.

둘 간의 차이점은 포인터의 위치가 변하는지, 포인터가 가리키는 값 자체가 변하는지에 있습니다. 이러한 연산은 메모리 수준에서 직접 값을 변경하거나 포인터의 이동을 동반하기 때문에 헷갈리기 쉽습니다.

더 깊이 이해하시려면 아래의 유사한 질문과 답변 링크를 확인하시기를 추천드립니다:
- C언어 기출문제 변형 배열과 포인터 증가 문제 질문있습니다: 여기서는 전치와 후치 연산자의 차이와 작동 방식을 구체적으로 설명하고 있습니다.
- 배열과 포인터 증가 문제: 포인터 연산자가 배열 요소에 미치는 영향에 대해 살펴볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

박시콩님의 프로필 이미지
박시콩

작성한 질문수

질문하기