こんにちは。
また先輩いわく、char *, int * は1次元配列、char int は、2次元配列と捕らえることが可能といっていましたが、本当ですか。
単純に誤りです。
さて、int* items = 0
と定義すると、int型へのポインタitemsが定義されます。これはint型の配列へのポインタとしても使われます。(int型へのポインタ、int型配列へのポインタのどちらにも使え混乱しやすいので要注意です。)
次に、「int型へのポインタitems
へのポインタ」を考えて下さい。仮に、items_pointerとします。
*items_pointerはitemsそのものになりますね。
ではitems_pointerの型はどうなるでしょう?
int
型へのポインタはint*です。同様にint*
型へのポインタはint**
型ですので、items_pointerの方はint**
です。
ということは、int** items //output
はitems_pointerと同じ型ですね。
つまり、function_name()関数内で*items
としてアクセスすることで、呼び出し側のitems
と同じものをアクセスできるのです。
ならば、function_name()関数内で*items=xxx;
とすれば、呼び出し側のitems
へxxxを返却できるということになるのです
【追記】
また先輩いわく、char *, int * は1次元配列、char int は、2次元配列と捕らえることが可能といっていましたが、本当ですか。
ああっ、これは下記の間違いなのですね。
また先輩いわく、char *
, int *
は1次元配列、char **
int **
は、2次元配列と捕らえることが可能といっていましたが、本当ですか。
その意味であれば可能です。なかなかややこしいです。
int*
をint型配列へのポインタと捉え、int**
をint*
型配列へのポインタと捉えるわけです。
まとめると、int**
型を「「int型の配列へのポインタ」型の配列」へのポインタと捉えることが可能です。
そして、配列の配列は2次元配列ですから、int**
は2次元配列へのポインタとして使うこととができます。
冒頭で説明したように、int*
型はint
型へのポインタでもあり、int
型配列へのポインタでもありますから、int**
型はint*
型へのポインタでもあり、int*
型配列へのポインタでもあります。
組み合わせると、下記4つの使い方が可能です。
①int
型へのポインタ × int*
型へのポインタ →int型へのポインタのポインタ
②int
型の配列へのポインタ × int*
型へのポインタ →1次元配列へのポインタのポインタ
③int
型へのポインタ × int*
型の配列へのポインタ
④int
型の配列へのポインタ × int*
型の配列へのポインタ→2次元ジャグ配列へのポインタ
前回の質問では、②の形式で使われていました。