仮引数(int* value)に対する実引数の渡し方による値の変化の認識確認


以下のような関数Hoge(int* value)があるとします。

[code]

    void Hoge(int* value)
    {
        value = (適当なポインタ変数);
    }
    
[/code]

そこに対して、

[code]

    int* hogeValue;
    Hoge(hogeValue);
    
[/code]

と記述した場合、「あくまで渡された「参照するアドレス」を書き換えているだけで、実引数hogeValueのアドレスそのものが書き換わるわけではない」という認識であってますでしょうか。  
一応自分でも動作を確認してはいるのですが、ポインタの挙動を完全に理解しているかといわれればまだまだな部分も多いので、認識があっているかどうかの確認として質問させていただきました。

よろしくお願いいたします。




>
> 「あくまで渡された「参照するアドレス」を書き換えているだけで、実引数hogeValueのアドレスそのものが書き換わるわけではない」という認識であってますでしょうか。

正しい認識です。ただ、C++言語には「参照(reference)型」という言語機能が別に存在するため、質問文中の用法では誤解を招く恐れがあります。

より正確に表現するなら「仮引数`value`に渡されたアドレス値を書き換えているだけで、関数呼出し元での実引数`hogeValue`が保持するアドレス値が書き換わるわけではない」でしょうか。

* * *

`int*`などの "ポインタ型" を考える場合、そのポインタ型を別名`PTR`などに置き換えて理解するとわかり易くなるかもしれません。（人によるかも）

[code]

    // int型の場合
    void func_int(int value) {
      value = 0;
    }
    
    int v = 42;
    func_int( v );
    // 変数v の値は 42 のまま
    
[/code]

上記`int`版と、下記の`int*`→`PTR`置換版を比較してみてください。

[code]

    // PTR = int*型の場合
    void func_ptr(PTR value) {  // void func_ptr(int* value)
      value = NULL;
    }
    
    int var = 100;
    PTR ptr = &var;  // int* ptr = &var;
    func_ptr( ptr );
    // 変数ptr の値は &var のまま
    
[/code]




>
> 「あくまで渡された「参照するアドレス」を書き換えているだけで、実引数hogeValueのアドレスそのものが書き換わるわけではない」という認識であってますでしょうか。

正しい認識です。ただ、C++言語には「参照(reference)型」という言語機能が別に存在するため、質問文中の用法では誤解を招く恐れがあります。

より正確に表現するなら「仮引数`value`に渡されたアドレス値を書き換えているだけで、関数呼出し元での実引数`hogeValue`が保持するアドレス値が書き換わるわけではない」でしょうか。

* * *

`int*`などの "ポインタ型" を考える場合、そのポインタ型を別名`PTR`などに置き換えて理解するとわかり易くなるかもしれません。（人によるかも）

[code]

    // int型の場合
    void func_int(int value) {
      value = 0;
    }
    
    int v = 42;
    func_int( v );
    // 変数v の値は 42 のまま
    
[/code]

上記`int`版と、下記の`int*`→`PTR`置換版を比較してみてください。

[code]

    // PTR = int*型の場合
    void func_ptr(PTR value) {  // void func_ptr(int* value)
      value = NULL;
    }
    
    int var = 100;
    PTR ptr = &var;  // int* ptr = &var;
    func_ptr( ptr );
    // 変数ptr の値は &var のまま
    
[/code]

