해결된 질문
작성
·
449
·
수정됨
0
const char* msg = "Hello";
1 번 함수
void SetMessage(const char* msg)
{
msg = "Bye" // 값이 변경되어지지 않음.
// *msg = "Bye" <= 불가능, 식이 수정할수 없는 lvalue
}
2 번 함수
void SetMessage(const char** msgPtr)
{
*msgPtr = "Bye" // 값이 변경됨.
}
1. 역참조 시 const 타입 주소로 이동.
2. const 타입은 값을 변경할 수 없는 형태임
3. 그래서 1번 함수에서 msg를 역참조해서 값을 변경하는 것은 불가능.
1. msgPtr은 "Hello"주소값을 가지고 있는, msg 포인터를 가리키고 있음.
2. 역참조시 msg 포인터로 이동.
3. *msgPtr = "Bye"; <= 이 부분에서 혼동이 와서 질문드립니다.
Hello의 시작 주소값은 편의상 HAddr
이라고 칭하겠습니다.
1. msg는 8바이트 형태의 포인터이다.
2. msg는 "Hello"의 시작 주소값 HAddr
을 가지고 있다.
3. 해당 시작 주소값은 'H'라는 값을 가지고 있다.
4. *msgPtr = "Bye"
5. 수행시 - 메모리에 'B', 'y', 'e'라는 값을 가지는 const char* 타입 변수 생성.
6. *msgPtr을 통해 msg 포인터를 역참조. - msg포인터가 가지고 있는 값 HAddr
을 'Bye'의 시작 주소 값 B의 주소값
으로 변경?
답변 1
1
3. 해당 시작 주소값은 'H'라는 값을 가지고 있다.
-> 해당 시작 주소값을 타고 가면 'H'로 시작되는 데이터가 있습니다.
5. 수행시 - 메모리에 'B', 'y', 'e'라는 값을 가지는 const char* 타입 변수 생성.
-> 수행시가 아니라 컴파일 타임에 결정되며, 데이터 영역에 'Bye'라는 문자를 박은 결과물이 만들어지고 이 주소를 이용하게 됩니다.
그 외에는 다 맞네요! :D
감사합니다.