質問: ### 前提・実現したいこと C++でできたパッケージツールの中にすでに関数が定義されており、 その中に アウトプット変数に、二重ポインタが定義されておりました。パッケージツールなので、関数の中にどのようなコードがあるのか不明なのですが、アウトプットとして、int * と tag_t **が返されます。 この関数を使うためにどのように変数を定義すればよいのでしょうか。 変数宣言時は、 int num_of_references; tag_t ist_of_references[100]; と宣言する必要があるのですが、通常でしたら、下記のように宣言し関数に渡す必要があると思いますが、下記ではだめなようです。 int* num_of_references; tah_t ** list_of_references この理由が分かる方がおりましたら、回答を頂けないでしょうか。 ### ソースコード ``` int function Name(tag_t folder_tag, FL_sort_criteria_t sort_criteria, int * num_of_references, tag_t ** list_of_references ) // output : int * num_of_references // output : tag_t ** list_of_references ```
回答: >int num_of_references; >tag_t ist_of_references[100]; >と宣言する必要があるのですが、 関数が `int * num_of_references` で受け取りたいと要求していて 手元に `int num_of_references;` で宣言された変数がありそれを渡したいのなら 関数に渡す時の記載は`&num_of_references`でしょう 同様に `tag_t ** list_of_references` と要求していて `tag_t list_of_references[100];`があるなら 関数に渡す時の記載は `&list_of_references` でしょうかね 通常関数に渡すのは「値」なので呼びだされた側で受け取った引数を変更しても呼び出し側には何の影響もないため値が格納されているアドレスを渡す事で、そのアドレスの中身を書き換えたら呼び出し元でもその影響(結果)を受け取れるという事ができます つまり num_of_references のアドレス `&num_of_references` を渡す事で相手先ではそのアドレスの中に値を入れる事ができ戻ってきた後に呼び出し元で num_of_reference を参照すると相手先で格納してくれた値が受け取れる(参照できる)という理屈です (ついでの補足) ``` void test1(int a) {// 引数でaの値を受け取る a = 100;// a の値を100に変更するけどその結果は呼び出し元には影響しない } void test2(int *a) {// 引数でaのアドレスを受け取る *a = 200;// 引数で受け取ったアドレスが指しているaの中身を200に変更するので呼び出し元に影響する } void sample() { int a = 10;// aの値は10 test1(a);// 10を渡す printf("%d\n", a);// test1 の中でaが100に変更されているけど呼び出し元のここではaは10のまま変化ないので10と表示される test2(&a);// 値が変化していない10が入ってるaのアドレスを渡す printf("%d\n", a);// test2 の中でaの値が200に変更されたので呼び出し元のここではaは200になっているため200と表示される } ```