質問
いかなる状況においがたい複数の間接指定するチェーンのポインタとして Foo **
)C++?
解決
最も一般的として使用@アク指摘をすることで変更のポインタのパラメータを可視化後の機能に戻ります。
#include <iostream>
using namespace std;
struct Foo {
int a;
};
void CreateFoo(Foo** p) {
*p = new Foo();
(*p)->a = 12;
}
int main(int argc, char* argv[])
{
Foo* p = NULL;
CreateFoo(&p);
cout << p->a << endl;
delete p;
return 0;
}
このまま印刷
12
がありその他の便利な使い方として以下の例に対して繰り返し処理を実行する文字列の配列およびレンダリンの標準出力に出力します。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
const char* words[] = { "first", "second", NULL };
for (const char** p = words; *p != NULL; ++p) {
cout << *p << endl;
}
return 0;
}
他のヒント
IMOでの使用にはパスへの参照ポインタ変数
void test(int ** var)
{
...
}
int *foo = ...
test(&foo);
を作成できます多次元のギザギザにな配列をダブルポインター:
int ** array = new *int[2];
array[0] = new int[2];
array[1] = new int[3];
シナリオを用い渡す必要がある nullの場合 ポインタ機能で初期化される機能以外の機能です。なmultplie間接に呼び出し機能しいアクセスに初期化されたオブジェクトです。
考え、以下の機能:
initialize(foo* my_foo)
{
my_foo = new Foo();
}
他の機能は"初期化(foo*)'はアクセスの初期化のインスタンス Foo,beacuseのポインタが渡されたこの機能はコピーです。(ポインタは整数値の後のすべての整数を抜いてしまうことが確認された値です。)
ただし、機能を定義するようになります:
initialize(foo** my_foo)
{
*my_foo = new Foo();
}
...といわれたしんでみてはいかがでしょうか。
Foo* my_foo;
initialize(&my_foo);
...次の呼び出し元がアクセスのインスタンス初期化され、'my_foo'-での 住所 のポインタを渡した'initialize"
もちろん、私の簡単な例を次に示し、"初期化"機能を返すだけですが、新しく作成されたインスタンスを返しのキーワードが必ずしもスーツも、機能のニーズに戻り、地下鉄からも近くて便利。
合格のポインタとして出力パラメータにするためにパスとして Foo**
設定値として *ppFoo = pSomeOtherFoo
.
からのアルゴリズムとデータ構造部を利用することができダブルの間接指定の更新ポインタは、より高速のためのインスタンスを入れ替え実際のオブジェクト。
例えばそれを使用 int** foo_mat
として、2次元に配列の整数です。はもご利用いただけポインタをポインタのエンコードでいいのポインタ void* foo
す2つの異なるオブジェクトは、参照がなくなってしばらくすると、以下のメンバー: void** foo_pointer1
や void** foo_pointer2
, ることにより、ポインタをポインタできるかどうか確認 *foo_pointer1 == NULL
こfooはNULLになります。なしチェックインすることはできるかどうかfooがNULLの場合foo_pointer1した通常のポインタです。私の説明な複雑になりすぎ:)
カール:おばき
*p = x;
(すいです。) :-)
Cによる音は絶対に必要です。考えて問題になりたい機能を追加する文字列(C、char*型)の配列へのポインタをchar*.の機能を試作するためにレベルの間接指定:
int AddStringToList(unsigned int *count_ptr, char ***list_ptr, const char *string_to_add);
と呼びます。
unsigned int the_count = 0;
char **the_list = NULL;
AddStringToList(&the_count, &the_list, "The string I'm adding");
C++また、オプションを参照の代わりに、利回り異なる署名を表します。しかし、私たちは、いまだに必要な二つのレベルの間接指定またはオリジナルの質問:
int AddStringToList(unsigned int &count_ptr, char **&list_ptr, const char *string_to_add);
通常時のパスを指すポインタ機能を有しているので、戻り値:
ErrorCode AllocateObject (void **object);
の機能を返します成功/失敗エラーコードを埋めるオブジェクトパラメータを指すポインタは、新しいオブジェクト:
*object = new Object;
これはよく使われCOMのプログラミングWin32.
これはCん、C++きく包みこの種のシステムのクラスのコードを超すことはないですね。