4
char a[][4] = {{'a','a','a'},
               {'a','a','a'},
               {'a','a','a'},
               {'a','a','a'}};

C++ では、配列の最後のインデックスを初期化する必要があります。

Java でこれを行うと、エラーが発生します。

誰かが私に理由を説明できますか??

また、Javaでこのように配列の長さを確認すると.

System.out.println(a[0].length);

結果は配列内の列の長さです

配列の最後に '\0' があり、このように C++ で配列の長さを確認すると、このようになります。

cout << strlen(a[0]) 

配列全体の長さを取得します。

JavaのようにC++で配列の行または列の長さを取得できますか?

これは、Javaの配列がオブジェクトであるためですか?

4

2 に答える 2

10

Java では、多次元配列は配列を含む配列です (多次元配列変数は必ずしも多次元配列を含むとは限りません。つまり、null の場合もあります)。C++ では、多次元配列変数はそれ自体が 1 つの巨大な配列であり、即座に作成されます。その多次元の性質は構文糖衣にすぎません。C++ では、配列の最初のインデックスを除くすべてを初期化して、多次元配列構文と実際に背後で使用している単一の巨大な配列との間の変換方法をコンパイラに指示する必要があります。

単に配列の配列としてではなく、配列へのポインターの配列へのポインターとして多次元配列を初期化することにより、C++ でより Java に似た動作を得ることができます (Java のオブジェクトは、C++ のオブジェクトへのポインターとほとんど同じです)。もちろん、Java が代わりに行うメモリ管理について心配する必要があります。

于 2012-05-14T22:44:59.327 に答える
2

コンパイラに配列のサイズを与えるために使用できる簡単なテンプレートがあります。

template <typename T, size_t N>
size_t array_size( T (&)[N] ) {
   return N;
}

そのテンプレートは、配列全体または含まれる配列で使用できます。

char a[][4] = {{'a','a','a'},
               {'a','a','a'},
               {'a','a','a'},
               {'a','a','a'}};
std::cout << array_size(a)    << std::endl;    // 4
std::cout << array_size(a[0]) << std::endl;    // 4

両方が同じ結果をもたらす理由を知りたい方のために説明すると、配列のサイズは最初に行、次に列になります。あなたの場合、3 つの要素で 4 つの行を初期化しています (4 番目の要素は初期化された値、つまりゼロになります)。4 行 3 列の場合、定義は次のようになりますchar a[][3]

于 2012-05-14T23:16:09.310 に答える