1. 문자열 수정
(1) 포인터
다수의 문자로 이루어진 const char 형식의 문자를 함수와 포인터를 이용하여 수정하는 방법이 있다.
void SetMessage(const char* a)
{
a = "Bye";
}
int main()
{
//.rodata 영역에 ( Hello의 주소, [H][e][l][l][o][\0] )
const char* msg = "Hello"; // msg[Hello 주소] << 8바이트
}
Hello의 문자열을 SetMessage 함수를 이용하여 Bye로 대체하려한다.
msg는 포인터로, Hello의 시작 주소를 가지고 있다.
이때 Hello 문자열은 .rodata 영역에 한 문자씩 저장되어있다.
또한 Bye 문자열도 .rodata 영역에 한 문자씩 저장되어있다.
이 상태에서는 main 함수에서 SetMessage 함수를 호출하여도 결과가 변하지 않는다.
-> 스택 프레임 내에서 포인터인 a의 주소만 Bye로 바꾸고<a에 Bye의 시작주소가 대입된 상태> 이어서 스택 프레임이 초기화 되기 때문에 내용이 변경되지 않음.
=> 즉 SetMessage의 스택 프레임의 매개변수가 전달되지 않은 채로 초기화되어버림.
(2) 멀티 포인터
const char** pp;
위의 문제를 해결하기 위해 스타를 두번 붙여주어 멀티 포인터를 사용한다.
pp의 주소를 따라가서 해당 주소가 가진 주소를 따라가는 식으로 데이터를 수정할 수 있다.
pp [ 주소 1 ] -> 주소 1 [ 주소 2 ] -> 주소 2 [ ]
const char** pp = &msg;
즉 pp [ msg의 주소] -> msg [ Hello의 주소] -> .rodata [H][e][l][l][o][\0] 의 경로를 거치게 된다.
void SetMessage(const char** a)
{
*a = "Bye";
}
int main()
{
//.rodata 영역에 ( Hello의 주소, [H][e][l][l][o][\0] )
const char* msg = "Hello";
const char** pp = &msg;
SetMessage(&msg);
cout << msg << endl;
return 0;
}
2. 참조 형식으로 만들기
void SetMessage2(const char*& a)
{
a = "Wow";
}
int main()
{
SetMessage2(msg);
cout << msg << endl;
return 0;
}
'기초 C++ 스터디' 카테고리의 다른 글
4-11. 포인터 최종 정리 (0) | 2023.05.23 |
---|---|
4-10. 다차원 배열 (0) | 2023.05.23 |
4-7. 포인터 vs 배열 (0) | 2023.05.22 |
4-6. 배열 (0) | 2023.05.22 |
4-5. 포인터 vs 참조 (0) | 2023.05.11 |