작성
·
199
0
안녕하세요!
간단한것 같지만 참 아리송한 문제로 긴 삽질 끝에 질문 드립니다 선생님..!
StatInfo& monster_2 = *(monsters + 2);
위의 코드중 '*' 참조 하는 부분이 이해가 잘 되지 않습니다.!
위의 코드는 배열의 3번째 요소를 monster_2 로
사용하고 싶은 목적이라고 생각이 듭니다.!
그러면 StatInfo& monster_2 = (배열의 3번째 요소의 주소)
일텐데. 그러면 참조를 할 필요 없이
배열명은 배열의 시작 주소이기 때문에
monsters + 2는 이미 배열의 3번째 요소의 시작 주소이고
따라서 참조를 하지 않아야 맞는게 아닌가 라는 생각이 절 괴
롭고 미치게 합니다...ㅜ
오히려 참조를 하면 주소 monsters + 2 안에 들어있는 값으
로 이동을 하려 할테고 그러면 세그먼트 오류가 나야 맞다고
생각이 드는데.. 살려주세요 선생님
답변 2
3
ㅎㅎㅎ
그 부분은 누구나 처음 C++ 공부할 때 뇌정지가 오는 부분입니다.
저도 고민 많이 했던 기억이 새록 떠오르네요.
StatInfo& monster_2 = *(monsters + 2);
말씀주신대로 위에서 참조값은 내부적으로는 주소값으로 동작하고,
그렇다면 (monsters + 2)가 해당 주소이니
StatInfo& monster_2 = (monsters + 2);
이게 맞지 않을까! 싶긴 한데요.
물론 참조의 내부 작동 원리는 그렇긴 하지만,
C++ 관점에서 그런 부분은 숨겨져 있고
겉으로 보기엔 '별칭'을 붙이는 쪽에 가깝습니다.
따라서
[StatInfo& 에 뭔가를 저장할 때는
StatInfo 에 뭔가를 복사할 때와 100% 똑같은 문법으로 작성한다!
단 내부적으로 포인터처럼 주소값으로 작동한다!]
라고 기억을 하면 헷갈리지 않습니다.
StatInfo*와 같은 포인터 변수였다면 (monsters + 2) 로 저장하는게 맞지만,
StatInfo&와 같은 참조(&) 변수는 사실상
StatInfo 변수에 복사하는 것마냥 문법을 만들어주면 되니
StatInfo temp = *(monsters + 2); 에 가서 데이터를 복사하듯 끄집어 오는 것이죠.
0