작성
·
243
답변 3
1
저도 좀 헷갈리는 부분인데 강의를 여러 번 봐도 헷갈리네요.
풀이 할 때 주석 형식으로 배열 현재값과 포인터 위치까지 표기 해주시면 더 이해하기 쉬울것 같습니다.
1
안녕하세요, 제가 연산자의 우선순위를 따로 다루지 않아서 헷갈리실 수 있을 거라고 생각했습니다.
일단, *ptr++
은 2가지가 있겠죠. *가 먼저인지 ++인지에 따라서 완전히 다르게 해석이 될 것입니다.
(가정) *이 먼저 된다 -> 가리키고 있는 값을 먼저 가져오겠죠? 그리고 그 값을 증가시킬 겁니다. 값이 1이었다면 2가 되겠죠.
(가정) ++가 먼저 된다 -> 메모리를 증가시키겠죠? 메모리 주소값이 다음으로 넘어가고, 배열의 경우였다면 그 다음 인덱스의 값을 출력할 것입니다.
정답은 ++(후위)가 우선순위가 높습니다. 후위연산자는 거의 모든 연산자 중에서 가장 높은 우선순위라고 생각하시면 됩니다.
그래서 아래와 같이 해석이 됩니다.
ptr++
부분이 먼저 평가됩니다. 후위 증감 연산자(++
)는 현재 포인터 값(ptr
)을 사용한 후, ptr
을 증가시킵니다.
그 다음에 *
연산자가 적용됩니다. 이 때, 이미 증가되기 전의 ptr
값이 사용되므로, 증가 전의 포인터가 가리키는 값을 참조하게 됩니다.
예를 들어 만약 ptr이 배열을 가리키고 있다고 가정해봅시다.
int arr[] = {10, 20, 30};
int *ptr = arr;
int value = *ptr++;
이 경우, value
는 10
이 되고, ptr
은 arr[1]
을 가리키게 됩니다.
요약하자면, *ptr++
는 현재 포인터가 가리키는 값을 참조하고, 그 후에 포인터를 다음 위치로 이동시키는 연산입니다.
전위 연산자인 ++*ptr
은 어떨까요?
*ptr
부분이 먼저 평가됩니다. 이는 ptr
이 가리키는 메모리 위치의 값을 참조합니다.
그 다음으로 전위 증감 연산자(++
)가 적용되어 참조된 값이 증가합니다.
예를 들어, 만약 ptr
이 배열을 가리키고 있다고 가정해 봅시다:
int arr[] = {10, 20, 30};
int *ptr = arr;
++*ptr;
이 경우, ptr
이 가리키는 arr[0]
의 값은 10
에서 11
로 증가합니다. arr
배열은 다음과 같이 변경됩니다:
arr = {11, 20, 30};
요약하자면, ++*ptr
는 포인터가 가리키는 위치의 값을 1 증가시키는 연산입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
비트올려라님의 질문에 대해, C언어에서의 전치 연산자 ++*ptr
와 후치 연산자 *ptr++
작동 방식에 대해 설명드립니다. 전치 연산자 ++*ptr
는 포인터가 가리키고 있는 값에 대해 연산을 먼저 수행하고, 그 값을 반환합니다. 즉, 포인터가 가리키는 값 자체가 증가됩니다. 한편, 후치 연산자 *ptr++
는 포인터가 가리키고 있는 값에 대해 연산을 수행한 후 포인터 자체를 증가시킵니다. 여기서 주의해야 할 점은 후치 연산자의 경우 포인터의 값(주소)이 증가된다는 것이며, 가리키고 있는 값의 증가는 연산 대상이 아니라는 점입니다.
질문하신 내용과 관련하여, 강의 중 하나에서 이와 유사한 주제에 대해 설명하는 부분이 있습니다. 해당 내용은 포인터와 배열에서 포인터의 증감 연산자 작동 방식에 대한 이해를 돕습니다. 참고하실 만한 질문으로 C언어 배열 질문이 있습니다. 이 답변에서는 ++*ptr
과 *ptr++
의 차이점을 설명하고 있으며, 배열과 포인터를 이용할 때 각 연산자가 어떻게 작동하는지 구체적인 예제를 통해 이해를 돕고 있습니다.
해당 질문에 대한 답변을 통해, 전치 연산자와 후치 연산자가 포인터 및 그가 가리키는 값에 어떤 영향을 주는지 보다 명확히 이해하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네, 피드백 해주신 부분 반영해서 추후 영상 촬영하도록 하겠습니다.
정말 감사드립니다.