4-9. 멀티 포인터

Crat3 ㅣ 2023. 5. 23. 14:57

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