質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1583閲覧

int ** について <初心者>

saito.kaz

総合スコア76

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/03/31 08:03

編集2016/03/31 08:34

###前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

初心者マークもついてないのでざっくり書くと
関数に値を渡しても関数内で得た値を結果として引数から受け取ることができないからです。

関数内で処理した結果を引数からもらおうとしたら
受け取りたい変数のアドレスを関数に渡してあげる必要があります。

int function Name(tag_t folder_tag,
FL_sort_criteria_t sort_criteria,
int * num_of_references,
tag_t ** list_of_references
)

上記のような関数であるなら使うときは以下のようになります

C++

1tag_t folder_tag; 2FL_sort_criteria_t sort_criteria; 3int num_of_references; 4tag_t list_of_references[100]; 5 6int return = functionName( 7 folder_tag, 8 sort_criteria, 9 &references, 10 &list_of_references 11); 12

※補足
キーワード「値渡し 参照渡し ポインタ渡し」で検索してみると
いろいろ資料が出てくると思います

投稿2016/03/31 08:17

編集2016/03/31 08:21
kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito.kaz

2016/03/31 11:20

ありがとうございます。 検索し、自分が分からない点が明確になりました。
guest

0

ベストアンサー

>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 を参照すると相手先で格納してくれた値が受け取れる(参照できる)という理屈です

(ついでの補足)

c

1void test1(int a) {// 引数でaの値を受け取る 2 a = 100;// a の値を100に変更するけどその結果は呼び出し元には影響しない 3} 4void test2(int *a) {// 引数でaのアドレスを受け取る 5 *a = 200;// 引数で受け取ったアドレスが指しているaの中身を200に変更するので呼び出し元に影響する 6} 7void sample() { 8 int a = 10;// aの値は10 9 test1(a);// 10を渡す 10 printf("%d\n", a);// test1 の中でaが100に変更されているけど呼び出し元のここではaは10のまま変化ないので10と表示される 11 test2(&a);// 値が変化していない10が入ってるaのアドレスを渡す 12 printf("%d\n", a);// test2 の中でaの値が200に変更されたので呼び出し元のここではaは200になっているため200と表示される 13} 14

投稿2016/03/31 09:04

編集2016/03/31 09:18
HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroshiWatanabe

2016/03/31 09:20 編集

補足説明でサンプルコードをここに書いたんですが整形できなかったので削除して元コメントに編集で追記しなおしました
saito.kaz

2016/03/31 11:21

本当にありがとうございます。 助かります。
guest

0

先に回答をされている方がいたので削除しました。

投稿2016/03/31 08:18

編集2016/03/31 08:20
PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問