3

char 配列について 2 つの質問があります。

  1. 次のコードから、arrisconstを書き換えているのに、なぜコンパイラがエラーを出さないのでしょうか?

    char arr[5]; // arr is a const pointer to (*)[5] array
    cin>>arr; //   
    
  2. 次のようにchar配列を初期化したとき:

    char arr[5]={'h','i'};
    

    私がこれをした場合:

    cout << arr << "something here \n"; 
    

    印刷されますhisomething here。私はそれが印刷されるべきだと思った

    hi   something here
    

    3つのワイトスペース付き。

    しかし、私がこれをした場合:

    for(int i = 0; i < 5; i++){
      cout << arr[i];
    }
    

    3 つの空白出力されます。

2 番目のケースは、コンパイラが null 文字を追加しないことを証明しているようです。では、コンパイラはどのようにして 3 つの空白を無視できるのでしょうか?

4

4 に答える 4

8
  1. 修飾子constがないため、この配列は ではありません。const
  2. 初期化子リストで残りの値を指定しない場合、それらは に初期化され0ます。0空白としてではなく、C 文字列を終了するために使用されます。

あなたの主張に関しては、それfor(int i=0;i<5;i++){ cout << arr[i]; }は空白を印刷しました-どのようにそれをチェックしましたか?

私のため:

#include <iostream>

int main(){
    char arr[5]={'h','i'};
    for(int i=0;i<5;i++){ std::cout << arr[i]; }
    std::cout << "X" << std::endl;
}

プリント:

hiX

そして16進ダンプ:

$ ./t | hexdump -Cv
00000000  68 69 00 00 00 58 0a                              |hi...X.|
00000007

'\0'文字が印刷されています。それらの表示は、オペレーティング システムに依存しているようです。しかし、それらは空白ではありません。

于 2012-04-21T08:19:35.863 に答える
3
  1. arr 自体は「const char (*)[5]」ではなく「char[5]」です。また、cin >> arr と記述すると、暗黙的に "char *" 右辺値にキャストされます。左辺値でさえないため、constではありません。

また、「const char *」または「char const *」は、指す左辺値を変更できないことを意味し、「char * const」は、ポインターの左辺値自体を変更できないことを意味します。しかし、これはあなたの質問とは何の関係もありません。

  1. まず、空白がありませんでした。そして、ヌル文字が追加されます。

配列は単なる配列です。

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」であるとは限りません。

  1. もちろん、const変数に代入することはできません。
  2. 変数(または別名左辺値)にのみ割り当てることができるため、何かを右辺値(または別名値)に割り当てることはできません。したがって、1 は変数ではなく右辺値であるため、1 = 2 と書くことはできません。1 は「const」だからではありません。
  3. そのタイプに一致する変数に何かを割り当てる必要があります。したがって、const char *p と char *q がある場合、q = p と書くことはできません。タイプが一致しません。繰り返しますが、q が const であるという意味ではありません。明らかにそうではないからです。ただし、char * は const char * に暗黙的にキャストできるため、p = q と書くことができます。ただし、const char * は明示的に char * にキャストする必要があります。
于 2012-04-21T08:26:54.570 に答える
0
  1. 最初は const ではありません。次に、このコードは安全ではありません。
  2. 最後に終了記号 '\0' を設定する必要があります。

char 型を使用しないでください。char 配列の代わりに文字列を使用してみてください。

于 2012-04-21T09:33:22.937 に答える
0

arr は const ポインターとして機能します。つまり、ポインターを別のアドレスに設定することはできません。これは const へのポインターではないため、ポインターが指すアドレスのデータを変更できます。

例:

arr=&another_variable; //Illegal
*arr='A';              //Legal
于 2012-04-21T08:24:19.617 に答える