【初月無料キャンペーン中】gooドクター

char型の配列
char buff[20] = "abc "のように'や,で区切られていないchar型の配列とは違い
char buff[20] = { 'a', 'b', 'c', '\0' };①のような場合と
char型へのポインタ配列
char *parr[3] = { "abc", "de", "hello" };②
において
なぜ、①、②は初期値を中括弧で囲む必要があるのでしょうか?
また、逆に初期値に中括弧で囲む必要がないのはchar buff[20] = "abc "のようにまとまった文字列を扱う場合でしょうか?
最後にchar型のポインタ配列とは
1番目の文字列"abc"の先頭の文字aのアドレスがparr[0]に入り、2番目の文字列"de"の先頭の文字dのアドレスがparr[1]に入り."hello"の先頭の文字hのアドレスがparr[2]に入る解釈で正しいでしょうか?

ちなみに、仮に正しい場合は64bitのpcな
ら先頭の文字のアドレスは64bitであるため、アドレスの入るparr[0]、parr[1]、parr[2]のメモリはそれぞれ64bitなのでしょうか?
どうかわかりやすく教えて下さい。

gooドクター

A 回答 (3件)

配列を初期化するときには初期値を波かっこでくくる


のが原則で, 文字系の型の配列は特別に
文字列リテラルを使って初期化できる
と決まっている.

なお
char buf[20] = { "abc " };
のように書いてもいい.
    • good
    • 1

なぜって言語仕様をそう決めたからです。



>メモリはそれぞれ64bitなのでしょうか?
処理系(OS、コンパイラ)により違います。
    • good
    • 1

配列の初期化子は、


波括弧で囲まれた配列メンバのリストと、
文字列リテラルの両方が使えると仕様に定まってます。

参考) 配列の初期化
https://ja.cppreference.com/w/c/language/array_i …

文字列リテラルの実態は char 配列型なのですが、
一般的には暗黙の型変換により、
配列の最初の要素を指すポインタ char* に変換されます。

参考) 配列からポインタへの変換
https://ja.cppreference.com/w/c/language/array#A …

"abc" は char 型の文字列リテラル
→ char 配列型の初期化に使える

{'a', ... } は char 型のリスト
→ char 配列型の初期化に使える

{"abc", ... } は char 配列型のリスト
→ 暗黙の型変換により、char 配列型は char* 型に変換
→ char* 型のリストと見なされる
→ char* 配列型の初期化に使える

64ビットCPU向けのコンパイルを行ったのならば、
アドレスは64ビット幅なので、
ポインタはすべて 64 ビット = 8 バイトになります。
(とは思いますが、実装によるのであしからず)
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

人気Q&Aランキング