• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

이중 포인터를 이용한 값 변경 질문입니다.

23.03.21 19:26 작성 23.03.21 19:27 수정 조회수 357

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번 : 함수의 경우 msg는 역참조가 불가능

1. 역참조 시 const 타입 주소로 이동.

2. const 타입은 값을 변경할 수 없는 형태임

3. 그래서 1번 함수에서 msg를 역참조해서 값을 변경하는 것은 불가능.

2번 : 함수의 경우 msgPtr은 역참조가 가능

1. msgPtr은 "Hello"주소값을 가지고 있는, msg 포인터를 가리키고 있음.

2. 역참조시 msg 포인터로 이동.

3. *msgPtr = "Bye"; <= 이 부분에서 혼동이 와서 질문드립니다.

질문 : 2번의 연장선

  • 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

dkzndk1100님의 프로필

dkzndk1100

질문자

2023.03.23

감사합니다.