해결된 질문
작성
·
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); // 이때 무슨 일이 일어나는가?
*p
는 "p가 가리키는 위치의 값"을 의미합니다.
++(*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는 자주 헷갈리는 부분입니다. 이를 명확히 하기 위해 각 연산의 개념을 설명드리겠습니다.
*p++
:
p
가 가리키는 위치의 값을 참조하고, 그 후에 p
의 주소가 증가합니다.p
가 어떤 값을 가리키고 있다면 그 값을 사용한 후, p
자체가 다음 메모리 주소를 가리키게 되는 형태입니다.++*p
:
p
가 가리키는 메모리 위치의 값을 먼저 증가시키고, 그 증가된 값을 사용합니다.p
가 어떤 메모리 주소를 가리키고 있고, 그 주소의 값이 A
라면, 전위 증가 연산 ++
는 A
를 B
로 먼저 증가시킨 다음 그 값을 참조하거나 출력합니다.둘 간의 차이점은 포인터의 위치가 변하는지, 포인터가 가리키는 값 자체가 변하는지에 있습니다. 이러한 연산은 메모리 수준에서 직접 값을 변경하거나 포인터의 이동을 동반하기 때문에 헷갈리기 쉽습니다.
더 깊이 이해하시려면 아래의 유사한 질문과 답변 링크를 확인하시기를 추천드립니다:
- C언어 기출문제 변형 배열과 포인터 증가 문제 질문있습니다: 여기서는 전치와 후치 연산자의 차이와 작동 방식을 구체적으로 설명하고 있습니다.
- 배열과 포인터 증가 문제: 포인터 연산자가 배열 요소에 미치는 영향에 대해 살펴볼 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.