プロが教えるわが家の防犯対策術!

こまかな話しかもしれないのですが、2次元配列の文字列代入で、

char *array2 = {"Jan", "Feb", "March"}; //NG
はNGで
char *array2[3] = {"jan,", ...}; //OK
なのはどうしてなのでしょうか?

1: "[3]"は明示しなくとも代入される値から分かるという理由で省略してはいけないのでしょうか?

また、
2: 一次元の場合
char *array = "aaaaa";
とできるのにどうして2次元ではNGなのか、がピンと来ません。

すみませんが、宜しくお願い致します。

A 回答 (4件)

>こまかな話しかもしれないのですが、2次元配列の文字>列代入で、


>
>char *array2 = {"Jan", "Feb", "March"}; //NG
>はNGで
>char *array2[3] = {"jan,", ...}; //OK
>なのはどうしてなのでしょうか?

上記は、2次元配列ではなくて、『ポインタ配列』の初期化代入です。

2次元配列であれば、
char buf[][8] = {"BLACK","BLUE","RED"};
のように、します。


一般的に、
       "文字列"
という表現は、
      文字列+ヌル文字
が記憶された場所を表すchar *のポインタになりますが、例外があります。

配列要素を初期化するときに、char * と見なすか、単なる連続文字列と見なすか、です。

代入すべき値がポインタの場合に、char *となります。
  char *p = "AAAA";

char *bufp[] = { "AAAA" , "BBBB" , "CCCC" };
です。

連続文字列として考えるときは

char buf[] = "AAAAAAAAAA";



char buf[][8] = {"BLACK","BLUE","RED"};

のような場合です。
上記の場合、8文字に満たない場合はヌル文字が補われます。

[BLACK000] [BLUE0000] [RED00000]

のようになります。
    • good
    • 0
この回答へのお礼

いつもすみません。
char *p = "AAAA"; と
char *bufp[] = { "AAAA" , "BBBB" , "CCCC" };
を比較したら自然に疑問が解消されました!
どうもありがとうございました。

お礼日時:2006/04/25 03:32

>char *array2 = {"Jan", "Feb", "March"}; //NG


>はNGで
>char *array2[3] = {"jan,", ...}; //OK
>なのはどうしてなのでしょうか?
ポインタを復元(?)した時にそのデータがなにを表しているかを考えるとわかりやすいのではないかと思います。
char *array2;
の場合
*array2 が表しているのは、char (指しているアドレスの(先頭の)文字1個)です。
char *array2[] = {"Jan", "Feb", "March"};
の場合
*array[0] が表しているのは、文字列のアドレスの配列の最初の文字列の先頭の文字です。
あと、
char *array2[] = {"Jan", "Feb", "March"};
は、2次元の配列というより、ポインタの配列ですね。
    • good
    • 0
この回答へのお礼

> ポインタを復元(?)した時にそのデータがなにを表しているかを考えるとわかりやすい
なるほど!腑におちましたよ、この説明で!
助かります、有難うございます。

お礼日時:2006/04/25 03:31

べつに


char *array2[] = {"Jan", "Feb", "March"};
でもいいですよ。
ただ、(char *)型への配列であるということくらいは知らせてあげないといけないみたいです。

図示すると
[array2 + 0]-->"Jan"
[array2 + 1]-->"Feb"
[array2 + 2]-->"March"

array2[0]は"Jan"へのポインタ
array2[1]は"Feb"へのポインタとなります。

よけいわからなくなった場合、他の人の答えか、もうちょっと考えるか、ポインタについて勉強したほうがいいですね。

この回答への補足

> char *array2[] = {"Jan", "Feb", "March"};
でも良いのですが、この"[]"は2次元の行方向を示しているのでしょうか?

補足日時:2006/04/06 23:28
    • good
    • 0

まさに一次元でなく二次元の配列だからです。


[3]示しなくても、[]で大丈夫です。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>
int
main(void)
{
char *array[] ={"Jan", "Feb", "March"};
int i;

for (i = 0; i < 3; i++) {
printf("%d: %s\n", i, array[i]);
}
return 0;
}
    • good
    • 0
この回答へのお礼

有難うございます。
もし3次元だったら どのようにかけば良いのでしょうか?

お礼日時:2006/04/06 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!