• ベストアンサー

2次元配列の文字"列"の初期化方法

こまかな話しかもしれないのですが、2次元配列の文字列代入で、 char *array2 = {"Jan", "Feb", "March"}; //NG はNGで char *array2[3] = {"jan,", ...}; //OK なのはどうしてなのでしょうか? 1: "[3]"は明示しなくとも代入される値から分かるという理由で省略してはいけないのでしょうか? また、 2: 一次元の場合 char *array = "aaaaa"; とできるのにどうして2次元ではNGなのか、がピンと来ません。 すみませんが、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • rickky
  • ベストアンサー率66% (2/3)
回答No.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] のようになります。

tk_1980024
質問者

お礼

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>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次元の配列というより、ポインタの配列ですね。

tk_1980024
質問者

お礼

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

  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.2

べつに char *array2[] = {"Jan", "Feb", "March"}; でもいいですよ。 ただ、(char *)型への配列であるということくらいは知らせてあげないといけないみたいです。 図示すると [array2 + 0]-->"Jan" [array2 + 1]-->"Feb" [array2 + 2]-->"March" array2[0]は"Jan"へのポインタ array2[1]は"Feb"へのポインタとなります。 よけいわからなくなった場合、他の人の答えか、もうちょっと考えるか、ポインタについて勉強したほうがいいですね。

tk_1980024
質問者

補足

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

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

まさに一次元でなく二次元の配列だからです。 [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; }

tk_1980024
質問者

お礼

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

関連するQ&A

  • 多次元配列

    初歩的な質問ですみません。 PHPプログラミングでの質問です。 仮に、多次元配列Aに、 Array( [0] => Array ( [0] => 6 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 0 [1] => 5 [2] => 4 ) ) 多次元配列Bに、 Array( [0] => Array ( [0] => りんご ) [1] => Array ( [0] => ぶどう [1] => パイナップル ) [2] => Array ( [0] => みかん [1] => すいか [2] => メロン ) ) のように値が入っている場合、配列Aの値を参照して 値の大きいものから順に、それに対応する配列Bの値を取り出し、 あたらしい配列Cに代入する処理の書き方を教えて下さい。 上記の例ですと、配列Cが、 Array ( [0] => りんご [1] => すいか [2] => メロン [3] => ぶどう [4] => パイナップル [5] => みかん ) となるようにしたいです。 よろしくお願いします。 長文失礼しました。

    • ベストアンサー
    • PHP
  • php&html printで二次元配列が表示できない

    <html><body> <?php $array1[]= array(); //二次元配列作成 $array1[0][0] = 123; print "$array1[0][0]"; ?> </body></html> というプログラムを作成してみたのですが、printの中身がhtmlでは”一次元配列$array1[0]”と”文字列[0]”という風に読み取られているようで、 表示が Array[0] となってしまいます。 どうにか二次元配列の値を表示する方法はありませんか?

    • ベストアンサー
    • PHP
  • 2次元配列の宣言について

    文字列の配列の場合 Dim m As Variant Dim moji As String m=Array("aa","bb","cc","dd",・・・) moji=m(1) とすれば"bb"がmojiに代入されるのはわかるのですが これを二次元配列(3行4列)にする場合どのように 宣言(Dim~や、Array~)等はどのように記述すればよろしいですか? 基本的な質問でごめんなさい。 よろしくお願いします。

  • 二次元配列

    質問失礼します。 二次元配列の練習中で、 nijigen = new Array(); nijigen[0] = new Array(0,0,0,0); nijigen[1] = new Array(0,0,0,0); nijigen[2] = new Array(0,0,0,0); nijigen[3] = new Array(0,0,0,0); という配列を作りました。 そして、その配列と同じ配置にされたボタンを押すと、その位置の配列の数値に「1」が代入されるというものです。 そこでですが、「配列の内容が全て1になった時」を検知出来るようにしたいのですが、どのようにすればよいのでしょうか。 よろしくお願いします。 //↓こうなった時に検知したいのです nijigen = new Array(); nijigen[0] = new Array(1,1,1,1); nijigen[1] = new Array(1,1,1,1); nijigen[2] = new Array(1,1,1,1); nijigen[3] = new Array(1,1,1,1);

    • ベストアンサー
    • Flash
  • 2次元配列で2項目についてソートのやりかたについて

    こんにちは. VS2005 C++ MFC ダイアログベースでソフトを作成しています. CString型の配列 Array[100000][3] を定義し, CSVファイルから読み込んだ値を格納しています. 1列目 X座標 2列目 Y座標 3列目 結果 ファイルから読み込んだデータは以下のように y優先でxとyの値で昇順に並んでいます. _____[0] [1] [2] [0] 200 100 OK [1] 201 100 OK [2] 202 100 OK [3] 200 101 NG [4] 201 101 OK [5] 202 101 OK [6] 201 102 NG [7] 202 102 OK … これを以下のように x優先でxとyの値で昇順に並び変えたいのですが どのようにすればよいでしょうか? _____[0] [1] [2] [0] 200 100 OK [1] 200 101 NG [2] 201 100 OK [3] 201 101 OK [4] 201 102 NG [5] 202 100 OK [6] 202 101 OK [7] 202 102 OK かつ,100000行もあるのでスピードが速い方法だと助かります. 具体的なコードもお願いいたします.

  • 多次元配列のカウントのしかた

    すみません、質問させてください。 $array1:1次元配列 $array2:2次元配列 1次元配列のカウント(要素数)をしるには count($array1) とすれば取得することができますが、 2次元配列のカウントを取得するにはどのように すればいいのでしょうか?そんな関数はありますか? $array2のデータの中身 $array[0][0] = 'a'; $array[0][1] = 'b'; $array[1][0] = 'c'; $array[1][1] = 'd'; $array[2][0] = 'e'; $array[2][1] = 'f'; この場合、3という値が欲しいのですが・・・ 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 文字列になっている配列を‥

    以下の値がDBに文字列の項目に登録されています。 DB から値を取得したのはいいのですが文字列なので foreach でグルグルしようとすると怒られてしまいます。 配列の型に変換できればいいのですが(array)だとうまく行かないしどうすればいいかどなたかご教授願えないでしょうか。 よろしくお願いします。 ■値(文字列でDBに格納されてます‥) array( 1=>'a', 2=>'b', 3=>'c', 10=>array( 'A'=>1, 'B'=>'hoge1', ), 11=>array( 'A'=>2, 'B'=>'hoge2', ), 12=>array( 'A'=>3, 'B'=>'hoge3', ), )

    • 締切済み
    • PHP
  • VBで配列の初期化について

    VBやVBAで1次元・2次元配列を、プログラムの中の 値の(リテラル的)記述で初期化する方法はどうすれば良いのでしょうか。1次元配列にはx=Array()で代用してきましたが、さて、行と列がある表のような、値データを2次元配列にセットしようとして、ハテナと行き詰まりました。配列名(要素)=値を要素数だけ繰り返す方法以外に、例えば A[][]={(a、b、c)(d、e、f)(g,h,i)}のような、書き方は出来ないのでしょうか。 複数のArrayをArreyの()内に入れてみましたがも上手く行かないようですが。 有り無しについて教えていただけたらと思います。 市販の解説書数書には触れた記述は見つかりませんでした。

  • 多次元配列への格納

    よろしくお願いします。 多次元配列に値を格納したいのですが、これまでは、 $test = array ( 'father' => array ('hiroshi', 'toshi'), 'mother' => array ('hanako', 'yoshiko'), ); のように予め書かれてあるデータを使ってきましたが、この度やりたいのはある一つの通常の配列を20ずつ多次元配列に自動的に格納するスクリプトを作りたいと思っています。 $test = array ('hiroshi','toshi','masao',.....);と続く配列を、 $test = array ( 0 => array ('hiroshi',......(20個)), 1 => array (.......), ); と20ぐらいに区切って多次元配列にしたいです。 $test[0]に直接pushしたらWarning: array_push() [function.array-push]: First argument should be an array in..と叱られてしまいました。 どなたかわかる方がいましたらおしえてください。

    • ベストアンサー
    • PHP
  • 3次元配列

    初歩的な質問で申し訳ございません、非常に困っています 教えて下さい lotno(1~4,1~4,1~5) の3次元配列を宣言し、計算で求められた値を代入したいのですが どのように記述したらいいのでしょうか? また配列 lotno() はモジュール変数です