1

クラスメンバー関数によって返されるポインターのアドレスを取得しようとしています。

class Test{
    ...
    char* d;
    ...
    char* getData(){
        return d;
    }
    ...
}

ここで、dのアドレスを取得しようとします(* dに有効な値があると仮定します)。

Test t; 
char** pd = &t.getData();

これにより構文エラーが発生し、VC2010でコンパイルされません。メンバーポインタ変数のアドレスを取得するにはどうすればよいですか?

4

2 に答える 2

2

短いバージョン:右辺値のアドレスを取得しようとしていますが、これは違法です。

少し長いバージョン:を実行するt.getData()と、*dが値で返されます。ほとんどの場合、ポインターを操作しているときは、値渡しと参照渡しについて気にしないため、これは忘れがちです。小さいので、ポインタを返すだけです。

ここ、

char** pd = &t.getData();

t.getData の戻り値はポインターのコピーであり、これは rvalue ですつまり、一時的であり、式が終了すると存在しなくなります。そのため、右辺値のアドレスを取得することはできません。ステートメントが終了するとすぐに無効になります。ただし、そのアドレスを左辺値に入れると、問題なく機能します。

Test t;
char* temp = t.getData(); 
char** pd = &temp;

これは、 temp がlvalueになり、そのアドレスを取得できるためです。

ただし、あなたがやろうとしていることについては、をgetValue()返す方が良いかもしれませんchar**

于 2012-08-24T05:24:07.270 に答える
0

関数はポインターgetData()のコピーを返します。元のポインター メンバーのアドレスを取得する場合は、ポインターへの参照を返すように変更する必要があります。

char *&getData() { return d; }

(内部ポインターへの参照を返し、それらのアドレスを取得することが設計の観点から良い考えであるかどうかは別の問題です。)

于 2012-08-24T03:26:51.810 に答える