1

以下はコードです

void printLoop(type?? p){

for(int i  = 0; i<2;i++)
{
   for(int e = 0;e<3;e++)
        {
             cout<<p[i][e]<<" ";
         }
      cout<<"\n";
  }
}
void array()
{
int a[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = a;
printLoop(p);
}

基本的な考え方は、printLoop 関数で for ループを使用して配列を出力したいということです。ただし、2D 配列のアドレスを持つポインターの型を知る必要があります。ポインタの型は何ですか?ですかint (*)[]?よくわかりません。

また、" (*p)" とはどういう意味ですか (from int (*p)[3])? どうもありがとうございました!

4

3 に答える 3

4

"(*p)" とはどういう意味ですか (int (*p)[3] から) ?

p3タイプ のオブジェクトのサイズの配列へのポインタintです。

関数には複数の可能性がありますprintLoop(ただし、一般的な C の制限により、最大でも 1 つ、つまり最も外側の宣言子を空にすることができます)。

  • 寸法を明示的に指定できます。

    void printLoop(int p[ 2 ][ 3 ]);

この方法の唯一の利点は、渡される配列が必要なサイズ (つまり、s の 2x3 行列) であると実装が前提条件として見なすことができることです。int

  • [ 2 ] 部分を完全に省略できます。

    void printLoop(int p[][ 3 ]);

また、

void printLoop(int (*p)[ 3 ]);
  • のポインターへのポインターを使用できますint

また、範囲外のメモリにアクセスしないようにするために、ディメンションを渡す必要があります (スキップする場合)。したがって、関数の署名は次のようになります。

void printLoop(int (*p)[ 3 ], int dim);
于 2012-05-26T23:17:05.557 に答える
3

printLoop関数の場合int p[2][3]、引数として機能するはずです。

int (*p)[3] = a;

pintを指すように初期化された、3 の配列へのポインタaです。

于 2012-05-26T23:12:10.257 に答える
2

まず第一に、あなたのコードは最新の C++ ではありません。基本的には「c with iostreams」です。

第二に、printLoop(int p[2][3])あなたが探している署名です。繰り返しますが、これは最善の方法ではありません。

第三に、次のint (*p)[3]ように分析されます: ある名前pから始めて、中かっこを「ヒット」するまで (最初に右に、次に左に、ここでは関係ありません) 見て回ります。星が付いているだけなので、 p はポインターであると言えます。同じ分析を再帰的に行うと、 が表示されます。これは、 が 3 つの配列へのポインタで[3]あることを意味します。pint

ここで、次の点について言及したいと思います。

std::array静的サイズの配列に使用します。動的サイズの配列に
使用します。std::vector

ああ、また、私自身は 2D 配列を使用しません。それらは不格好で、単なる構文糖衣です (同様に構文糖衣である基本的な「配列」概念の周り)。

したがって、おそらく、次のようなもの、脳がコンパイルされたもの、できれば正しいもの、C++11 の悪用:

std::array<int, 3 * 2> p = {{1, 2, 3, 4, 5, 6}};
std::for_each(std::begin(p), std::end(p), [](int elem){ std::cout<<elem; });

ナイス&ダンディ。必要に応じて、いくつかの「2次元配列」のサイズをラムダでチェックし、改行を挿入することもできます。

于 2012-05-26T23:19:03.527 に答える