
こまかな話しかもしれないのですが、2次元配列の文字列代入で、
char *array2 = {"Jan", "Feb", "March"}; //NG
はNGで
char *array2[3] = {"jan,", ...}; //OK
なのはどうしてなのでしょうか?
1: "[3]"は明示しなくとも代入される値から分かるという理由で省略してはいけないのでしょうか?
また、
2: 一次元の場合
char *array = "aaaaa";
とできるのにどうして2次元ではNGなのか、がピンと来ません。
すみませんが、宜しくお願い致します。
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]
のようになります。
いつもすみません。
char *p = "AAAA"; と
char *bufp[] = { "AAAA" , "BBBB" , "CCCC" };
を比較したら自然に疑問が解消されました!
どうもありがとうございました。
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次元の配列というより、ポインタの配列ですね。
> ポインタを復元(?)した時にそのデータがなにを表しているかを考えるとわかりやすい
なるほど!腑におちましたよ、この説明で!
助かります、有難うございます。
No.2
- 回答日時:
べつに
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次元の行方向を示しているのでしょうか?
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) プログラムが書けません。 6 2023/01/22 22:58
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
C++17で、unsigned char * 配列...
-
DWORDとcharの変換
-
文字列内の数字削除
-
new charとnew char[N]の違いは?
-
文字型配列に格納した空白の切捨て
-
C++Builder 2009 テキスト...
-
csvファイルをfscanfで読み込む...
-
文字列の途中から途中までを抽出
-
[C] 構造体メンバーのカンマ区...
-
エクセルのMID関数は、C言語では?
-
小数点入りの文字列をfloat型に...
-
wsprintf( ポインタ , "%d" , "...
おすすめ情報