해결된 질문
작성
·
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 답변으로
포인터의 증감 연산자의 효과: 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언어에서 중요한 부분인데, 이해하기 어려운 부분이기도 합니다. 질문하신 내용에 대해 상세히 설명드리겠습니다.
포인터와 배열의 관계: ptr = arr;
이 코드는 ptr
포인터가 arr
배열의 첫 번째 요소를 가리키도록 설정합니다. 즉, ptr
은 arr
배열을 직접적으로 참조하고 있는 상태이며, ptr
을 통해 배열의 각 요소에 접근할 수 있게 됩니다.
*arr + 1
의 의미: *arr
는 arr[0]
, 즉 배열의 첫 번째 요소의 값을 가리킵니다. 따라서 *arr + 1
은 이 값을 1 증가시키는 것을 의미합니다. 여기서 주의할 점은 *arr + 1
은 새로운 값을 계산하는 것이지 배열의 실제 값을 변경하는 것이 아닙니다.
포인터의 증감 연산자의 효과: ptr
에 증감 연산자(예: ++*ptr
또는 *ptr++
)를 사용하면 ptr
이 가리키고 있는 해당 위치의 메모리 값이 변경됩니다. 하지만, *arr + 1
같은 표현은 메모리 상의 값을 변경하지 않고 단순히 계산하는 것에 그칩니다.
도영님이 혼동하신 부분은 ptr
과 arr
이 서로 독립적이라고 생각하셨지만, 사실 ptr
은 arr
의 메모리 주소를 가리키고 있으므로 ptr
을 통해 값을 변경하면 이는 실제 배열 arr
의 값도 변하게 됩니다. 따라서 ptr
과 arr
간의 이러한 관계를 이해하시는 것이 중요합니다.
관련된 내용을 자세히 이해하시려면 다음 링크의 질문들을 참고해 보시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.