- arr 自体は「const char (*)[5]」ではなく「char[5]」です。また、cin >> arr と記述すると、暗黙的に "char *" 右辺値にキャストされます。左辺値でさえないため、constではありません。
また、「const char *」または「char const *」は、指す左辺値を変更できないことを意味し、「char * const」は、ポインターの左辺値自体を変更できないことを意味します。しかし、これはあなたの質問とは何の関係もありません。
- まず、空白がありませんでした。そして、ヌル文字が追加されます。
配列は単なる配列です。
char a[5]; //a's type is char[5];
しかし、配列がオペランドになることはほとんどありません。配列型を受け入れることを覚えている唯一の演算子は sizeof と &(address-of) です (一方、これは a が配列でなければならない場合があることを意味します。または、sizeof(a) と書くと、サイズが得られますポインターの。) 他の操作では、 a は char * rvalue に変換されます。はい、a[0]、a[1] などと記述した場合でも、a[0] は *(a + 0) と同等であり、配列ではなくポインターを操作します。
何かに割り当てることができない場合、それが常に「const」であるとは限りません。
- もちろん、const変数に代入することはできません。
- 変数(または別名左辺値)にのみ割り当てることができるため、何かを右辺値(または別名値)に割り当てることはできません。したがって、1 は変数ではなく右辺値であるため、1 = 2 と書くことはできません。1 は「const」だからではありません。
- そのタイプに一致する変数に何かを割り当てる必要があります。したがって、const char *p と char *q がある場合、q = p と書くことはできません。タイプが一致しません。繰り返しますが、q が const であるという意味ではありません。明らかにそうではないからです。ただし、char * は const char * に暗黙的にキャストできるため、p = q と書くことができます。ただし、const char * は明示的に char * にキャストする必要があります。