文字列代入?

文字の代入 - Programming22
おとなり日記で見つけたのでコメントする。

char str1[5];
char str2[] = "tekitou";
char *str3 = "tekitou2";

str1 = str2; /*error*/
str1 = str3; /*error*/
str3 = str2; /*OK*/
静的配列で確保したstr1は

str1 = str2; /*アドレス = アドレス*/
str1 = str3; /*アドレスにアドレスは代入できない*/

と書いたとき&str1[0]となり配列の先頭アドレスを指すため代入できない
  • str1が静的かどうかは無関係。
  • 説明部分の文章は、意味をなさない。配列名を評価すると「代入できない左辺値」となるため、代入できない。
  • さしあたりポインタはポインタであり、アドレスとは別の概念ということを復習の必要あり
str3 = str2;

は左辺がポインタなのでアドレスを代入することができる.
アドレスの代入であって文字列tekitou2はコピーされていない.
  • 左辺、右辺とも型が同じであり、str3は代入可能な左辺値であるため、問題なく代入できる。
  • 代入は浅いコピーであるので、実体はコピーされない。
・メモ・

""は囲んだ文字列をメモリ上に確保したあと,確保したメモリの先頭アドレスを返す.

この文章はどこから持ってきたかわからないが、全く誤り。

  • C言語ではダブルクオートで囲まれたトークンは文字列リテラル(文字列定数)である。
  • 文字列リテラルの型はconst char [サイズ]である。
  • 式の中で配列を評価すると、配列の先頭要素を指すポインタとなる。*1

*1:例外はsizeof,&のオペランドになった場合と、char配列の初期化子となった場合