char* 配列の配列を宣言するにはどうすればよいですか? (値が後で私のプログラムで埋められるとき..)これが私の目標です:
arr[0] = {"0a","0b","0c"};
arr[0][0] = "0a";
arr[0][1] = "0b";
..
arr[1] = {"1a","1b","1c"}
- ですか
char *arr[][]
?私はかなり混乱しています。 - このパラメーターを関数に渡すとどうなりますか?
閉じますが、次のように、集約の初期化をすべて一度に使用する必要があります。
char arr[][2][3] =
{
{"0a", "0b"},
{"1a", "1b"},
};
最も重要な (左端の) 配列以外はすべて、明示的にサイズを指定する必要があることに注意してください。または、各内部文字列を単なるポインターとして宣言することもできます。
const char * arr[][2] =
{
{"0a", "0b"},
{"1a", "1b"},
};
それは、データがどのように構造化されているか、およびどの程度静的であるかによって異なります。各配列の内容を動的に割り当てたい場合は、別の方法として stl std::vector を使用します。
char *arr[][] ですか?
ほぼ正しい音。ただし、宣言で配列のサイズを指定する必要があります。
これらのいずれか。これは、ほとんどの人が C で混乱することの 1 つであることに注意してください。
char ** a;
a
これは、1 つまたは複数の文字への 1 つまたは複数のポインターへのポインターです。メモリのどこかにたくさんのポインターがあり、それぞれが文字列を指しています (いわば)。a
これらのポインターの最初のものを参照します。(a+1)
2番目を指します。文字のブロックはそれぞれメモリ内のどこかに存在しますが、必ずしも互いに近くにあるとは限りません。あなたはこれを行うかもしれません:
for (int i = 0 ; i < 10 ; ++i) {
a++ = malloc(100);
}
またはこれを行うことができます:
char *b = malloc(1000);
for (int i = 0 ; i < 10 ; ++i) {
a++ = b;
b += 100;
}
そして、それぞれ 100 文字への 10 個のポインターで配列を埋めます。(まだ文字を入力していないので、実際には 100 文字分のスペースがあります。)
char* a[];
ここでも、a
一連の文字の最初の文字への一連のポインターがあります。とまったく同じchar ** a
ですが、それらをすべて再利用する場合はより理にかなっています。
for (int i = 0 ; i < 10 ; ++i) {
a[i] = malloc(100);
}
上記と同じことを行いますが、特定の文字ブロックに簡単に戻ることができます。たとえば、次のことができます。strcpy(a[4], "Bob was here");
char a[][];
これは、同じ長さのブロックに分割できる一連の文字へのポインターであるという点で少し異なります。大きすぎてスタックに割り当てられない限り、この場合は通常、サイズを指定します。char a[10][100]
メモリ内に 1000 個の文字スポットを割り当て、それぞれ 100 個ずつ 10 個のグループに分割します。
{"0a","0b","0c"};
あなたの例は、3 つのメモリ ブロックを割り当てる方法であることに注意してください。それぞれの長さは 3 バイトで、そこにある文字 (および終了の \0 文字) が事前に取り込まれています。
int main (int argc, char *argv[]){
char arr[10][2][3] = {0};
memcpy(&arr[0][0], "k", sizeof(arr[0][0]));
memcpy(&arr[0][1], "ki", sizeof(arr[0][0]));
memcpy(&arr[1][0], "s", sizeof(arr[0][0]));
memcpy(&arr[1][1], "si", sizeof(arr[0][0]));
printf("%s %s\n", arr[0][0], arr[1][1]);
}