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

SUDAM님의 프로필 이미지
SUDAM

작성한 질문수

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

C언어 기출문제의 변형

c언어 기출문제의 변형

해결된 질문

작성

·

95

·

수정됨

0

다른 분 질문에 올려주신 답글 해설을 보고도 이해가 안되어

다시 질문 남깁니다

강의 21:30을 보자면 print 3번은 ptr=arr인데

앞에서 바꿔진 print2에서 30으로 변경된 것을 사용하는게 아닌가요? 아니라면 print1에서 변경되었던 21에서 자신은 변경없이 다음 arr[1]을 지시하는 것으로 이해해도 되나요?

그런데 또 이상한게요  print 5번은 print4번이 31을 사용하는 것두 아니고 print2에서 바꿔놓은 30을 사용하는 것두 아니고 정말 정리가 안됩니다

답변 3

0

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

안녕하세요. 3가지를 분명하게 따로 생각하시는 것이 좋습니다.

 

첫 번째, 포인터를 하나 옮긴 것을 출력해라. (문자열 or 배열 or 구조체 배열 or 스택이나 큐와 같은 자료구조 등 메모리 주소로 접근 가능한 경우)

두 번째, 포인터를 하나 옮긴 것을 (혹은 값을 하나 올린 것을) 해당 포인터 (혹은 값에)에 "반영"해라.

세 번째, 값을 하나 올린 것을 출력해라. (그냥 단순히 변수에 값 들어가 있는 형태나 배열을 인덱스로 접근했을 때)


 

첫 번째는 포인터를 옮기는 경우입니다. 이 경우는 단순하게 그 다음 주소로 옮겨서 출력하거나 코드를 해석하면 됩니다. 그게 다입니다. 가리키는 포인터에 반영된 것은 아니므로 그대로 가리키던 곳을 가리킵니다.

 

두 번째가 문제입니다. 이건 포인터를 옮긴 것을 (혹은 값을 증가시킨 것을) 출력도 하고, 그 자체에 반영까지 해야합니다. 이게 바로 ++ 혹은 +=과 같은 연산자가 사용됐을 때입니다. 이 경우에는 실제로 증가도 시키고 추후의 값에도 반영된 상태로 계속 가져가야 합니다.

 

세 번째는 첫 번째와 같은 느낌인데 값 버전입니다. 그저 값을 하나 올려서 출력하거나 계산하고 끝내면 됩니다. 그 값을 담고 있는 변수는 가만히 있고 반영된 것이 없습니다.

 

헷갈릴 수 있는 부분입니다. 혹시 이해가 어려우시면 추가 질문 꼭 부탁드립니다.

이해 되실 때까지 설명드리겠습니다. 감사합니다.

0

SUDAM님의 프로필 이미지
SUDAM
질문자

이해가 아직안되어 질문 남깁니다.

24:07 print 2번 출력결과인 30은 왜 다음으로 이어지지 않나요?

print3도 print1값을 참조했고

print4는 print 3값을 참조했는데

갑자기 print5는 print3을 참조했고 그 다음으로이어지는데

print2의 값은 다음으로 적용되지않아서 궁금합니다

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

안녕하세요, 다음 값으로 적용되지 않는다는 것이

왜 arr+1을 했는데 다음 영역에서 arr로 다시 시작하는지 궁금하신 걸까요?

 

해당 이유는 +1을 출력만 한 것이지, 본인에게 반영한 것이 아니기 때문입니다.

여기서 핵심은 ++이냐, +1이냐의 차이입니다.

++는 엄밀하게 말하면 a = a+1 개념입니다. 다만 ++가 앞에 있으면 먼저 수행하고, ++가 뒤에 있으면 다음으로 넘어가면서 수행하는 것입니다.

 

+1을 출력하는 것은 그냥 +1을 출력하는 것입니다. 예제를 들어드리자면,

int a = 10, int b = 20이 있다고 해봅시다.

++a를 출력하면 11이 출력되고, 실제로 a의 값도 1이 증가한 상태로 반영됩니다.

b+1을 출력하면 어떨까요? 그냥 21이 출력되고 끝입니다. b는 가만히 있고 출력할 때만 1을 더해서 출력한 것이죠.

 

이것이 현재의 값에 반영되고, 반영되지 않는 것의 차이입니다.

이 차이가 과거에도 기출문제 비슷하게 나온 걸로 알고 있습니다.

 

출제자 입장에서는 낚시로 내기 딱 좋을 것 같아서 문제에 포함시켰습니다.

0

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

C 언어에서 포인터와 배열을 다루다 보면 혼돈스러울 수 있는 부분이 많습니다. 특히 포인터 연산에서의 증감 연산자는 어떤 것이 먼저 수행되는지가 중요한데요. 질문하신 내용에 대해 설명해드리겠습니다.

질문에서 언급하신 것처럼 printf("3번. %d\n", *ptr++); 에서 사용된 후치 연산자 *ptr++는 다음과 같이 동작합니다:

  1. *ptr 는 현재 포인터가 가리키고 있는 메모리 위치의 값을 참조합니다. 즉, 현재의 값을 출력합니다.
  2. ++ 연산자에 의해 ptr 자체가 증가하여 다음 메모리 위치를 가리킵니다. 따라서, 이후에 ptrarr[1]의 값을 가리키게 됩니다.

따라서 printf의 경우, 21이라는 값이 출력된 이후에 포인터가 증가하여 ptrarr[1]을 가리키는 형태가 되는 것이 맞습니다. 처음에 포인터가 가리키고 있던 값이 21로 변경되었고, 이 값이 출력되며, 이후에 포인터는 다음 위치를 가리키게 되는 것이죠.

이해에 도움이 되셨기를 바랍니다. 관련된 예제를 보고 싶으시다면, 다음 링크도 함께 참고해보세요:

위 링크에서 비슷한 주제의 포인터와 배열을 다루는 방법에 대한 내용을 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

SUDAM님의 프로필 이미지
SUDAM

작성한 질문수

질문하기