[C++] 다중 포인터(const char*를 첨가한...)

WestCoast·2021년 9월 12일
0

C, C++

목록 보기
1/12
post-thumbnail

const char*


  1. 만약 const char* ch_ptr = "Hello" 가 있을 때 ch_ptr은 read only data 영역(.rdata, 정적영역)에 저장되어 있는 "Hello" 라는 문자열의 주소를 가리키고 있는 '포인터'임.

  2. 따라서 const char* 의 크기는 32비트 운영체제에서 4바이트, 64비트 운영체제에서 8바이트로 고정되어 있음.

  3. const를 통해 상수화 되는 것은 ch_ptr의 '값', 즉 "Hello"가 저장되어 있는 정적영역임.

  4. 따라서 *ch_ptr = "Bye" 처럼 '값'을 바꿀 수는 없음.

  5. 하지만 ch_ptr이 가리키는 '문자열 주소'는 변경이 가능함. (ex. ch_ptr = "Bye")

다중 포인터


  1. int num = 1 ==> num = 2
    int 형 변수의 경우 아래와 같이 num의 주소값을 함수의 매개변수로 넣어주므로써 num의 값을 변경해줄 수가 있다.
    void SetNumber(int* num) 
    { 
       *num = 2; 
    }

    int main()
    {
        int num = 1;
        SetNumber(&num);
    }
  1. const char* ch = "Hello" ==> ch = "Bye"
    간단히 생각해보자. const char* 을 마치 int형과 같은 단순한 자료형으로 치환해서 생각하고 int형과 같이 다뤄주는 것이다. 그럼 바로 답이 나온다.
    const char** 즉, const char* 의 주소값을 매개변수로하여 다루는 것이다.
    void SetString(const char** ch) 
    { 
       *ch = "Bye";
    }

    int main()
    {
        const char* ch = "Hello";
        SetString(&ch);
    }

테스트 코드


#include <iostream>
using namespace std;

// 다중 포인터

// const char* ch1 의 값을 가져온다
// ex) void SetNumber1(int a) 와 같은 문법이라고 볼 수 있음
void SetString1(const char* a)
{
    a = "After: SetString1";
}

// const char* ch1 의 주소를 가져온다
// 다중 포인터
// ex) void SetNumber1(int* a) 와 같은 문법이라고 볼 수 있음
void SetString2(const char** a)
{
    *a = "After: SetString2";
}

// const char* ch1 의 주소를 가져온다
// 포인터의 레퍼런스(참조)
// ex) void SetNumber1(int& a) 와 같은 문법이라고 볼 수 있음
void SetString3(const char*& a)
{
    a = "After: SetString3";
}

int main()
{
    // ch1[ Before의 주소 ] << 8바이트(64비트에서)
    // .rdata Before의 주소[B][e][f][o][r][e][\0]
    const char* ch1 = "Before";
    SetString1(ch1);
    cout << ch1 << endl;

    ch1 = "Before";
    SetString2(&ch1);
    cout << ch1 << endl;
    
    ch1 = "Before";
    SetString3(ch1);
    cout << ch1 << endl;

    // pp[ &ch1 ] << 8바이트
    // ch1[ Before의 주소 ] << 8바이트(64비트에서)
    // .rdata Before의 주소[B][e][f][o][r][e][\0]
    const char** pp = &ch1;
    *pp = "After: pp";
    cout << ch1 << endl;

    const char*& pr = ch1;
    pr = "After: pr";
    cout << ch1 << endl;


    return 0;
}

출력

Before
After: SetString2
After: SetString3
After: pp
After: pr
profile
게임... 만들지 않겠는가..

0개의 댓글