質問: Function_Name(ID, &item_type); Input int ID : item Output item_type : IDを元にアイテムのタイプを返す 3Function_Name(int id, char ** item_type) item : インプット item_type : アウトプット パーケージの開発を行っている方に聞いたところ、Outputとして ポインタとして宣言したitem_typeが関数に渡されることで二次元配列に変わるそうです。 そこで、for文を用いて、tc_strcmp(item_type[i], type)としたところ、エラーが発生し、正しくは、 for文を使わないでtc_strcmp(item_type, type)と出力しないといけないそうです。 その理由として、2の段階で、ポインタの1次元のアドレスを渡しているから、生成される2次元配列は、一つの一次元の配列を要素とする2次元配列だからそうです。そのためitem_type[i]と行った場合、一次元配列の1つの要素を指すので、コンパイルエラーが起きるそうです。 質問なのですが、 1tc_strcmp(item_type, type)のように、二次元配列の要素である一元配列をitem_typeと直接指定することは可能なのでしょうか。 また二次元配列のアドレスはどのように参照するのでしょうか。 2item_type[i][i]のような形を取ると思うのですが、item_type[i]とした場合、一つの要素のアドレスが取得できるので、コンパイルエラーが域内と思いますが、なぜコンパイルエラーが起きるのでしょうか。 3関数の仕様なのでわかりませんが、2次元配列にする理由がわかりません。またそのようなことは可能なのでしょうか。 長文で申し訳ないですが、簡単に説明して頂けると助かります。 宜しくお願い致します。
回答: 二重のポインタは二次元配列を表すこともありますが、この関数のシグネチャを見ると二次元配列を返すというものには見えません。 「二次元配列」というキーワードを出した人の間違いかと思います。 では char** とはどういうことか。 この関数は文字列を返そうとしています。それも、文字列を格納するメモリ領域はライブラリのどこかで確保していて、そのアドレスだけを返そうとしてます。 そしたら戻り値を char* 型にすればいいのではないか? 一般的にはそうなのですが、ここでは成功失敗コードを戻り値として返し、成功した場合にはその文字列も戻したいとしています。戻り値以外でデータを返すには? ポインタ渡しを使いますよね。 int型をポインタ渡しで返したければ int* 型の引数をとり、呼び出す側は ``` int r; func(&r); ``` のように呼んで渡してもらいます。 では文字列をポインタ渡しで返す場合は? char*型をポインタ渡しするのだから、char** 型の引数を取って呼び出す側が ``` char* s; func(&s); ``` とやるということになります。 当然、この呼び出しのあとsは文字列を指していますから、普通に文字列として tc_strcmp(item_type, type) などと使うことになります。