char label[10] = "Me"
の値を変更するにはlabel
、次のようにする必要があります。
char * temp = "Not Me";
strcpy(label,temp);
私の質問は、なぜこれが無効なのですか?
char label[] = "Me";
label = "Not me";
char label[10] = "Me"
の値を変更するにはlabel
、次のようにする必要があります。
char * temp = "Not Me";
strcpy(label,temp);
私の質問は、なぜこれが無効なのですか?
char label[] = "Me";
label = "Not me";
ラベルlabel="Not Me"
のタイプがchar *
. 配列として定義しました。配列とポインターは意味的に同等です。ポインターはアドレスであるため、基本的にポインターのタイプを持つint
ものにようなものを割り当てることは意味がありません。"Not Me"
あなたがする必要があるのは、ポインターを逆参照し、ポイントされている場所に値を割り当てることです。タイプは であるため、char *
各場所を逆参照し、各場所に文字を割り当てる必要があります。
例えば
label[0] = 'N';
label[1] = 'o';
...
または、同等の for ループを使用します。
C では、配列ラベルは基本的にポインター ラベルと同じですが、配列が定義されたときにその背後に割り当てられたメモリが自動的に取得される点が異なります。
それ以外の場合、配列ラベルとポインター ラベルは同じものとして扱われます。したがってlabel
、配列として宣言したとしても、(その後に中括弧を付けずに) 直接操作するlabel
場合は、それをポインター (たまたま最初の配列要素を指す) として扱っています。同様に、label
ポインタとして宣言して を操作するlabel[x]
場合は、(別名: ) を指してx
いる場所を過ぎた th 番目のデータ項目を操作していることになります。label
*(label + x)
あなたの最初の本能は、狂ったように危険に見えるかもしれません。あなたは正しいでしょう。この言語が設計されたのは 60 年代後半から 70 年代前半にさかのぼり、当時の小さなマシンでコンパイラを簡単に実装できるようにすることが、言語がエラーを起こしやすいことよりもはるかに重要でした。