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

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

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

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

C++

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

Q&A

2回答

4069閲覧

ダブルポインタについて

saito.kaz

総合スコア76

C

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

C++

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

0グッド

1クリップ

投稿2016/04/06 04:29

先ほど質問した内容と重複する部分もありますが、お許しください。初心者なので分かりやすく説明して頂けると助かります。

この関数を利用するために、下記①のように宣言しました。
const char * id = 111 ;
int n = 0;
int * items = 0; // これは一次元配列と捕らえることは可能ですか?

②の関数を用いることで、関数の後半2つの仮引数が手に入るそうです。
ここで質問なのですが、なぜポインタで宣言した値が二次元は入れるになれるのですか?
構造上どのようになっていますか。

function_name(
const char* id, //input
int* n, //output
int** items //output
);

また先輩いわく、char *, int * は1次元配列、char ** int **は、2次元配列と捕らえることが可能といっていましたが、本当ですか。

最初の質問ですが、要素数1の二次元配列があり、その要素1のやつがitemsの一次元配列が入っているのですか?

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

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

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

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

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

tnd-.-b

2016/04/06 05:18

「char int は、2次元配列」は「char**とint**」ですか?
saito.kaz

2016/04/06 15:22

そうです。 申し訳ありません。
退会済みユーザー

退会済みユーザー

2016/04/07 04:29

こんにちは 直接の回答じゃなくて申し訳ないですけど,2件回答いただいている中で,自分の中で腑に落ちないところはどの辺にありますか??
yumetodo

2016/04/08 14:58

>こんにちは 直接の回答じゃなくて申し訳ないですけど,2件回答いただいている中で,自分の中で腑に落ちないところはどの辺にありますか?? それは私も聞きたいな
guest

回答2

0

なんか配列を誤解している気がする。

配列とは複数要素分メモリーを確保するものに過ぎません。

で、ここで大事なことを。

配列は3つの例外を除き常にポインタに読み替えられます
配列は3つの例外を除き常にポインタに読み替えられます

大事なことなので二度言いました。

つまり

c

1int arr[15];//int[15]型 2int* arr_p = arr;//単なるポインタのコピー 3 4arr[1] = 3;//arrはint*型として扱われている。 5arr_p[1] = 3;//arrはint*型として扱われている。 6*(arr + 1) = 3; 7*(arr_p+ 1) = 3;//この4つは同じ 8 9size_t s = sizeof(arr);//3つの例外の一つ。arrはint[15]型として扱われる

ということです。

なお3つの例外とは、

  1. 配列がsizeofの引数となるとき
  2. アドレス演算子&の引数となるとき
  3. char型の配列を文字列リテラルで初期値するとき)。

です。

2次元配列になっても同じです。

c

1int m_arr[12][3];//int[12][3]型 2int(*)[3] m_arr_p = m_arr;//単なるポインタのコピー 3

ところでこの時m_arrは配列なので常にポインタに読み替えられるのですがこの時の型はint**ではなくint(*)[3]型です。int[3]型の要素へのポインタになるんですね。

こういった事情から2次元配列は扱いづらく、一般に配列へのポインタ配列にしたり、1次元配列を多次元配列のように使ったりします。

このへんは図を書くといいです。

ついでに
https://yumetodo.github.io/2015_C_Textbook/c/12array.html

をどうぞ。

投稿2016/04/06 13:15

編集2016/04/06 14:06
yumetodo

総合スコア5850

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

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

yumetodo

2016/04/06 14:00

しっかしC言語のポインタ回りの文法は汚ねぇ。
guest

0

こんにちは。

また先輩いわく、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次元ジャグ配列へのポインタ

前回の質問では、②の形式で使われていました。

投稿2016/04/06 04:52

編集2016/04/06 06:17
Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問