
こまかな話しかもしれないのですが、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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
文字列内の数字削除
-
構造体が戻り値の関数について...
-
char AA[]{"全角文字"};から"全...
-
new charとnew char[N]の違いは?
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
DWORDとcharの変換
-
VC++ char[10]へのCString値の代入
-
文字列の途中から途中までを抽出
-
Run-Timeエラーの原因に関して...
-
文字列の演算
-
C++17で、unsigned char * 配列...
-
char型にint型の数値を代入する。
-
文字列のswap
-
文字列str内の全ての数字を...
-
C# Listを使わずに2次元配列の...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
C++17で、unsigned char * 配列...
-
new charとnew char[N]の違いは?
-
入力された文字列の中の数字を...
-
char 文字列型 の表現範囲が-12...
-
文字列str内の全ての数字を...
-
C言語のプログラムについてです
-
ポインタ配列
-
fstream型オブジェクトを関数の...
-
strcat関数を自作したいです
-
動的メモリの初期化方法について。
-
ポインタで詰まりました;
-
c言語でポインタ変数を用いた配...
-
C++Builder 2009 テキスト...
-
C言語 strstrの実装
-
fgetc( )の戻り値はなぜ整数??
おすすめ情報