1

次の2つの方法で混乱しています。

char var[3][15] = {"Hello_world!", "good", "bad"}; // as known this is for an 2D array.  
char *var[3] = {"Hello_world!", "good", "bad"}; // and this I think also 2D array, but how.
  1. それらの違いは何ですか?
  2. それまたはそれを使用するケースは何ですか?
4

4 に答える 4

1

1 つ目は 2 次元配列です。

2 番目は、ポインターの 1 次元配列です。これらのポインターが配列を指している場合、それも 2 次元配列になりますが、それは型を見るだけでは保証されません。

たとえば、5 つのNULLポインターの配列を持つことができます。

char *var[5] = {0, 0, 0, 0, 0};

この場合、それは確かに 2 次元配列ではなく、アクセスしようとするvar[i][j]と未定義の動作が発生します (ほとんどの場合、メモリ アクセス エラー、または "segfault")。

于 2013-07-31T19:35:45.670 に答える
1

2 次元配列には 2 つのタイプがあり、両方のタイプがあります。

最初のものは、5 つのオブジェクトの配列でありchar[15]、メモリ内に順番に配置されています。各「行」の末尾にある未使用のバイトは、(特定のケースではありますが常にではありません) ゼロで埋められます。「2次元配列」と言うとこれを思い浮かべる人が多いのですが、他の型と区別するために「正方」配列と呼ぶ人もいます。初期化すると、文字列リテラルが配列に直接コピーされます。

[0][ 0] = 'H'
[0][ 1] = 'e'
...
[0][14] = '\0' (end of each row is filled with zeros)
[1][ 0] = 'G'
[1][ 1] = 'o'
...
[3][13] = '\0' (end of each row is filled with zeros)
[3][14] = '\0' (end of each row is filled with zeros)

2 つ目は 5 char*(ポインター)の配列で、通常char、同じサイズである必要のないオブジェクトの配列を参照します。それらが char オブジェクトの配列を指している場合、これは 2 次元配列としてアクセスできます。各配列の長さが異なる場合があるため、これは「ジャグ配列」と呼ばれます。コードには 3 つの「行」があり、最初の行は 13 文字、2 番目は 5 文字、3 番目は 4 文字です。配列の最初のインデックスはメモリ内でシーケンシャルですが、「内部」インデックスを形成する配列はメモリ内のどこにでも配置できます。これを初期化すると、実際の文字列リテラルを指す 1 次元配列が形成されます。一緒に、それらは 2 次元配列を形成します。

[0] -> "Hello_world!"
[1] --------------------------------->"good"
[2] ---------------------->"bad"
于 2013-07-31T19:38:55.187 に答える
1

1 つ目は、実際にはメモリ内に 45 (3*15) バイトのブロックを作成し、ベースは と呼ばれるメモリ位置にありますvar。C では、これらを 2 次元配列としてアドレス指定できるためvar[a][b]*(var + a*15 + b). コンパイラは、2D 配列の感覚を維持するために、これらの 45 バイトの適切な場所に文字列を事前に入力します。

2 番目の方法は、3 つのポインターを使用して 1 つのメモリ ブロックを割り当てることです。ポインタがそれぞれ 8 バイトの場合、var24 (3*8) バイトの 1D 配列になります。さらに、C は、データ文字列を使用してメモリ内の別の場所に他の配列をいくつか作成します。次に、前者を後者に向けます。つまり、次の方法は 2 番目の方法とほぼ同じです。

char s1[] = "Hello_world!";
char s2[] = "good";
char s3[] = "bad";
char *var[3] = { &(s1[0]), &(s2[0]), &(s3[0]) };

ただし、最初のメソッドとの同等性var[a][b] == *(var + a*15 + b)は維持されないことに注意してください。たとえば、var[0]will は を指しますがs1、これは技術的にはメモリ内のどこにでもある可能性があります (そして、wheres2またはs3are とは関係ありません)。次に、その場所var[0][b]からのオフセットです。

于 2013-07-31T20:48:06.340 に答える
0

1 つ目は、文字の 2D 配列です。2 番目は char * (ポインター) の 1D 配列です。

于 2013-07-31T19:36:10.413 に答える