강의

멘토링

로드맵

Inflearn brand logo image

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

김도영님의 프로필 이미지
김도영

작성한 질문수

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

C언어 기출문제의 변형

24분 13초 배열과 포인터 증가 문제

해결된 질문

작성

·

108

·

수정됨

0

안녕하세요 선생님 강의 잘 듣고 있습니다.

 

24분 13초의 배열과 포인터 증가 문제에 대해 질문 드리고자 합니다.

 

포인터의 증감 연산자가 배열의 각 인덱스 요소의 값 변화에 반영된다는 것은 이해했습니다만,

 

5번 *arr + 1 의 출력에

ptr 배열의 증감연산자로 인한 변화가 반영되는 것이 이해가 되지 않습니다.

 

코드의 초반에 ptr = arr;으로 ptr에 arr 배열의 주소값이 반영되고 ptr에 arr 배열의 값이 그대로 들어가 ptr이라는 배열을 새로이 구성하는 것은 이해했습니다.

 

하지만 저는 arr 배열은 ptr 배열과는 별개의 배열이기에 ptr 배열의 값 변화는 arr에 반영되지 않는다고 생각했습니다.

 

arr 배열 따로, ptr 배열 따로이기에 *arr + 1은 21인게 맞지 않나요?

 

제가 어디서 잘못 생각한건지 여쭙고자 합니다.

 

저는 ptr이 arr의 주소값을 가리키기에 일종의 종속적인 관계라고 생각해서 arr에는 ptr의 변화가 반영되지 않는다고 판단했습니다.

 

늘 좋은 강의에 감사드립니다.

 


+) 방금 AI 답변으로

 

  1. 포인터의 증감 연산자의 효과: ptr 에 증감 연산자(예: ++*ptr 또는 *ptr++)를 사용하면 ptr 이 가리키고 있는 해당 위치의 메모리 값이 변경됩니다. 하지만, *arr + 1 같은 표현은 메모리 상의 값을 변경하지 않고 단순히 계산하는 것에 그칩니다.

라는 내용이 달렸는데 해당 답변이 맞는 내용인지도 질문드리고 싶습니다.

답변 2

0

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

안녕하세요,

배열이 2개라고 생각하시는 것이 틀렸습니다.

 

지금은 배열이 단 1개입니다. arr 하나입니다.

ptr은 해당 배열을 가리키는 포인터 변수입니다.

 

포인터는 별도의 공간에 복제하는 것이 아니라 "단순히 메모리의 주소를 값으로 가지는" 변수입니다.

 

arr[0]이 20이 아니라 21인 것도, 1번에서 가지고 온 *ptr이 지금 20으로 가지고 온 것이고 (배열의 첫번째 요소를 가리키고 있었는데, 해당 값을 가져오라고 했으니 20을 가지고 온 것)

거기에서 ++가 앞에 붙어있으니 20 + 1해서 21이 된 것입니다.

 

여기서 "가지고 온 것"의 의미를 잘 파악하셔야 하는데요,

실제로 거기까지 가서 가지고 다시 어딘가 제자리로 가지고 오는게 아니라,

정말 그 원본 그 자체의 메모리의 값을 뜻합니다.

 

그러니까 arr의 첫번째 요소의 값을 실제로 바꾼다는 뜻입니다.

 

그렇기 때문에 반영되는 것이 맞고, 그 이후에 접근할 때마다 바뀐 이후의 값을 잘 기억하고 있었다가 참조하셔야 합니다.

 


 

두번째 질문인 *arr + 1 은 맞는 표현입니다.

++는 해당 변수에 덧셈을 직접 반영합니다. 향후에도 참조하면 그대로 덧셈이 되어있어야 합니다.

 

*arr+1은 단순하죠. 가지고 있는 값에 +1를 해서 보여주거나 어딘가에 할당하거나 여튼 붕 떠 있는 값입니다. 실제로 어딘가에 반영한 것이 아니라 단순히 +1을 한 것입니다.

 

2가지의 차이는 이것입니다.

++는 실제로 1을 더해서 반영합니다.

++a는 a = a + 1입니다.

단순히 +1의 경우에는 그냥 해당 값에 +1을 한 겁니다.

그것을 printf로 출력할지 어딘가에 할당할지는 종속되어있는 문장을 봐야합니다.

지금은 printf에 들어가있으니까 단순히 +1 한 값을 출력해주고 넘어가면 됩니다. 절대로 해당 값에 영원히 반영하면 안되고요.

0

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

배열과 포인터의 관계는 C언어에서 중요한 부분인데, 이해하기 어려운 부분이기도 합니다. 질문하신 내용에 대해 상세히 설명드리겠습니다.

  1. 포인터와 배열의 관계: ptr = arr; 이 코드는 ptr 포인터가 arr 배열의 첫 번째 요소를 가리키도록 설정합니다. 즉, ptrarr 배열을 직접적으로 참조하고 있는 상태이며, ptr 을 통해 배열의 각 요소에 접근할 수 있게 됩니다.

  2. *arr + 1 의 의미: *arrarr[0], 즉 배열의 첫 번째 요소의 값을 가리킵니다. 따라서 *arr + 1 은 이 값을 1 증가시키는 것을 의미합니다. 여기서 주의할 점은 *arr + 1 은 새로운 값을 계산하는 것이지 배열의 실제 값을 변경하는 것이 아닙니다.

  3. 포인터의 증감 연산자의 효과: ptr 에 증감 연산자(예: ++*ptr 또는 *ptr++)를 사용하면 ptr 이 가리키고 있는 해당 위치의 메모리 값이 변경됩니다. 하지만, *arr + 1 같은 표현은 메모리 상의 값을 변경하지 않고 단순히 계산하는 것에 그칩니다.

도영님이 혼동하신 부분은 ptrarr 이 서로 독립적이라고 생각하셨지만, 사실 ptrarr 의 메모리 주소를 가리키고 있으므로 ptr 을 통해 값을 변경하면 이는 실제 배열 arr 의 값도 변하게 됩니다. 따라서 ptrarr 간의 이러한 관계를 이해하시는 것이 중요합니다.

관련된 내용을 자세히 이해하시려면 다음 링크의 질문들을 참고해 보시면 도움이 될 것입니다:

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

김도영님의 프로필 이미지
김도영

작성한 질문수

질문하기