(C言語)文字配列と文字列の違い。
フォーマット演算子等についての違いが知りたい方は、以下の記事で書いてますので是非参考にしてみてください。
始めに
上の記事で int array [ ] ≒int* arrayと説明し、 ニアリーイコールがついていますがこのことについて話します。
どちらともぱっと見キャストとして使うことが可能ですが、内部の構造が若干違います。
実は
- char array[ ]="abcde"<=>char array[ ]={"a","b","c","d","e"}となっています。
- char* array<=>const char* arrayはそのままです。
この大きな差は
- 領域なのか値なのかです。
- スコープ(範囲)が異なる
ここで問題になるのが値が代入できない点です。
詳しく見ていきましょう
代入できない
char a[ ]="abcde"; char* b="ABCDE"; b=a; printf("%s\n",b);
結果
abcde
これはできる。じゃあ逆は??
char a[ ]="abcde"; char* b="ABCDE"; a=b; //ここが違う printf("%s\n",b);
結果
error: assignment to expression with array type 8 | a = b; | ^
出来ない。。
このように代入できないときが発生します。
これはaは[ ]で定義しており、[ ] は領域を指し、アドレスを格納するメモリが存在しないからです。
補足
a[0]=v等のことならできます。
スコープが異なる
パターン1
char* aa(){ char* array="abcde";//ここが* return array; } void main(){ puts(aa()); }
結果
abcde
パターン2
char* aa(){ char array[ ]="abcde";//ここが[ ] return array; } void main(){ puts(aa()); }
結果
warning: function returns address of local variable [-Wreturn-local-addr] 6 | return array; | ^~~~~
エラーが出てしまいました。
このエラーは返り値でローカル変数返すなよ。。と言っていてスコープが狭いことを意味します。
こういったところで注意が必要になります。
まとめ
- [ ]で作った文字配列はアドレスの変更ができない。(1つ1つの変更なら可能)
- [ ]で作った文字配列はスコープが自分自身のみ
参考