2016-06-23 8 views
1

カラムサイズが指定されていないとコンパイラはサイズ情報を知らないと言う人がいます。しかし、どのようにコンパイラが行のサイズを知っていますか?列のサイズを解釈できない理由2d配列を関数に渡すときにカラムサイズを指定する理由

+3

あなたが話している言語は何ですか? –

+1

[2D配列をパラメータとして渡すときに列のサイズを指定する必要があるのはなぜですか?](http://stackoverflow.com/questions/12813494/why-do-we-need-to-specify-the -column-size-passing-a-2d-array-as-a-parameter) – melpomene

+0

私はCについて話しています。 – nathan

答えて

2

関数の引数として配列を渡している間、コンパイラは暗黙的に配列参照をポインタに変換します。これは明らかに

int method(int *a) 
    int method(int a[]) 

ように、一次元アレイの場合に見られるこれらの両方の行が(ポインタと配列の参照は異なるが)配列式に現れるたびので、コンパイラは暗黙的に生成ここに同等ですプログラマが& a [0]と書いたかのように、配列の最初の要素へのポインタ。しかし、このルールは再帰的ではありません。すなわち、2次元配列を渡すことは、ポインタへのポインタではなく、配列へのポインタとして扱われます。

int method(int b[3][5]); 

int method(int (*b)[5]); 

に変換され、行のサイズは重要ではないので、呼び出された関数は、配列のためのスペースを割り当てないので、カラムのしかしサイズがサイズを提供することが重要ですアレイ。詳細はhereをご覧ください。

+0

こんにちは、Rajeev。あなたに良い投稿と参照をありがとう。それは本当に私にとって新しいものでした。しかし、私はまだ一つの文が不明です: "呼び出される関数は配列にスペースを割り当てないので、全体のサイズを知る必要はないので、行数NROWSを省略することができます。それでもなお重要です " – nathan

+0

2次元配列は暗黙的にポインタの配列であることを覚えておいてください。配列サイズごとに分かるはずですが、ここではサイズは列サイズです@ user3529352 –

関連する問題