推測されているが明示的に述べられていない重要な点:
あなたの質問に基づいて、私はあなたが C でのプログラミングにかなり慣れていないと推測しているので、あなたの状況についてもう少し説明したいと思います。間違っていたらすみません; 基本的なメカニズムの微妙な誤解が原因で、C を学ぶのが難しい場合があるため、できるだけわかりやすくするのが好きです。
ご存知のように、C プログラムを書き出すと、コンパイラは構文に基づいてすべてを事前に作成します。コード内の任意の場所で変数を宣言すると、たとえば次のようになります。
int x = 0;
コンパイラはこのテキスト行を読み取り、自分自身に言います: OK、x整数を保持するために割り当てたメモリ領域への定数参照で、現在のコード スコープ内のすべてのオカレンスを置き換える必要があります。
プログラムが実行されると、この行が新しいアクションにつながります。 valueをx参照するメモリ領域を設定する必要があります。int0
ここでの微妙な違いに注意してください: 参照ポイントxが保持するメモリ位置は一定です (変更できません)。ただし、xポイントする値は変更できます。代入を通じてコードでそれを行いますx = 15;。また、1 行のコードが実際には、コンパイラに対する 2 つの別個のコマンドになることにも注意してください。
次のようなステートメントがある場合:
char *name = "Tom";
コンパイラのプロセスは次のようになります: OK、現在のコード スコープ内のすべてのオカレンスを、ポインター値nameを保持するために割り当てたメモリ領域への定数参照に置き換える必要があります。charそして、そうします。
しかし、これに相当する 2 番目のステップがあります。値「T」、「o」、「m」、および を保持する文字の定数配列を作成する必要がありますNULL。次に、コードの一部を、"Tom"その定数文字列のメモリ アドレスに置き換える必要があります。
プログラムが実行されると、最後のステップが発生します。 の値 (定数ではない) へのポインターを、自動的に作成されcharた文字列 (定数) のメモリ アドレスに設定します。
したがって、 achar *は読み取り専用ではありません。a のみconst char *読み取り専用です。しかし、この場合の問題は、char *s が読み取り専用であることではなく、ポインタがメモリの読み取り専用領域を参照していることです。
この問題を理解することは、ライブラリからその関数の定義を見て、自分で問題を理解することと、私たちに尋ねなければならないことの間の障壁であるため、これらすべてを取り上げます。また、問題をより理解しやすくするために、一部の詳細を簡略化しました。
これがお役に立てば幸いです。;)