(C言語)文字配列と文字列の違い。

フォーマット演算子等についての違いが知りたい方は、以下の記事で書いてますので是非参考にしてみてください。

bluecat314.hatenablog.com

始めに

上の記事で int array [ ] int* arrayと説明し、 ニアリーイコールがついていますがこのことについて話します。

どちらともぱっと見キャストとして使うことが可能ですが、内部の構造が若干違います。

実は

  • char array[ ]="abcde"<=>char array[ ]={"a","b","c","d","e"}となっています。
  • char* array<=>const char* arrayはそのままです。

この大きな差は

  1. 領域なのか値なのかです。
  2. スコープ(範囲)が異なる

ここで問題になるのが値が代入できない点です。

詳しく見ていきましょう

代入できない

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つの変更なら可能)
  • [ ]で作った文字配列はスコープが自分自身のみ

参考

c++ - char *a と char b[] にはどのような違いがありますか - スタック・オーバーフロー

徹底図解!C言語のポインタと配列の違いを解説! | だえうホームページ