[C++]複数のポインタ(const char*)...


const char*
  • const char* ch_ptr = "Hello"がある場合、ch_ptrは、読み取り専用データ領域(.rdata、静的領域)に格納された"Hello"という文字列アドレスを指す「ポインタ」である.

  • したがって、const char*のサイズは32ビットオペレーティングシステムでは4バイトに固定され、64ビットオペレーティングシステムでは8バイトに固定される.
  • constによって定量化されるのはch ptrの「値」であり、すなわち"Hello"の静的領域が格納される.

  • したがって、*ch_ptr = "Bye"のように「値」を変更することはできません.

  • ただしch ptrが指す「文字列アドレス」は変更できます.(ex. ch_ptr = "Bye")
  • 複数のポインタ
  • int num = 1 ==> num = 2 int型変数については、numのアドレス値を以下のように関数のパラメータとしてnumの値を変更することができる.
  •     void SetNumber(int* num) 
        { 
           *num = 2; 
        }
    
        int main()
        {
            int num = 1;
            SetNumber(&num);
        }
  • 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