34630


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

[code]

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

そこに対して、

[code]

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

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

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


CC BY-SA 3.0
2017-05-09T09:31:01.970
34583
2017-07-25T20:27:57.247
2017-05-09T09:36:52.190
20642
20642
question
c++ ポインタ
仮引数(int* value)に対する実引数の渡し方による値の変化の認識確認


その通りです。  
呼び出し側の`hogeValue`が保持する値は変化しません。

このような呼び出しはcall-by-value(値渡し)と呼ばれて、  
呼び出す関数には元の変数のコピーが渡されるので、  
呼び出された関数でパラメータ変数の値を変更しても  
呼び出し側の変数の保持する値は変化しません。

（呼び出し側の変数の内容を変更したい場合にはポインタ（つまりポインタへのポインタ）を使うか参照を使います。）

以下は[規格](http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2015/n4567.pdf)(Draft)からの引用  
**5.2.2 Function call**  
5

> [ Note: **a function can change the values of its non-const  
>  parameters, but these changes cannot affect the values of the  
>  arguments except** where a parameter is of a reference type (8.3.2);  
>  if the reference is to a const-qualified type, const_cast is required  
>  to be used to cast away the constness in order to modify the  
>  argument’s value. Where a parameter is of const reference type a  
>  temporary object is introduced if needed (7.1.6, 2.13, 2.13.5, 8.3.4,  
>  12.2). In addition, it is possible to modify the values of nonconstant
> objects through pointer parameters. —end note ]


CC BY-SA 3.0
2017-05-09T09:52:02.010
34585
2017-05-09T10:43:01.117
2017-05-09T10:43:01.117
5044
5044
34583
answer


>
> 「あくまで渡された「参照するアドレス」を書き換えているだけで、実引数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]


CC BY-SA 3.0
2017-05-11T07:15:12.533
34630
2017-05-11T07:15:12.533
49
34583
answer