『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]
本の内容からの派生でchar*とchar[]のメモリアドレスと値、および代入・一部書き換えの可否を調べました。結果は以下の通りです。
char* : 代入可、一部書き換え不可
char[] : 代入不可、一部書き換え可
char*では静的領域にある定数のアドレスがスタック領域に格納され、char[]では定数がそのままスタック領域にコピーされます。
#include <stdio.h>
int main() {
char *p1 = "abc";
char p2[] = "xyz";
printf("p1 : %s\n", p1);
printf("*p1 %c\n", *p1);
// p1[0] = 'd'; 定数領域の書き換えになるため"Bus error: 10"になる
printf("p2 : %s\n", p2);
printf("*p2 %c\n", *p2);
return 0;
}
p1 : abc
*p1 a
p2 : xyz
*p2 x