1

私は何度も声明に出くわしましたchar* ch = "hello";

私はそれがへのポインタであることを示していることを理解しchar* chていchます charしかし、 helloをchに割り当てるとはどういう意味ですか?

私はこれを理解することはできませんか?助けてください。

4

4 に答える 4

4

これはch、文字へのポインタであることを意味します。あなたがそうするときchar* ch = "hello" ch、最初の文字、すなわち文字を指しているでしょうh。2番目の文字を指すには、ch + 1またはを実行できますch[1]。ポイントされたメモリ位置に書き込むことができないため、理想的にはのタイプであるch必要があることに注意してください。const char*

于 2011-06-30T06:28:02.730 に答える
3

文字列リテラルは、プログラムバイナリ内のどこかに静的に格納されます。ほとんどの場合、メモリ内の読み取り専用の「データ」セクションにロードされますが、これは未定義の動作です。

文字列リテラルを割り当てると、最初のバイトのアドレスが渡されるだけです。この場合、char* ch「hello」の「h」を指します。

注:静的文字列の変更は未定義の動作です!ポインタを取得することはできますが、割り当ては危険です。

于 2011-06-30T06:31:49.460 に答える
1

ここで起こっていることがいくつかあります。

"hello"に等しい{ 'h', 'e', 'l', 'l', 'o', '\0' }。つまり、文字の配列です。配列は、対応するポインタ型に暗黙的に変換できます。したがって、ここでのステ​​ートメントは実際に文字の(静的)配列を作成し、最初の要素へのポインターを変数に割り当てますch(ちなみに、名前は正しくありません)。

于 2011-06-30T06:34:58.840 に答える
0

ステートメントは次のようにコンパイルされます。

080483b4 <main>:
 80483b4:   55                      push   %ebp
 80483b5:   89 e5                   mov    %esp,%ebp
 80483b7:   83 ec 10                sub    $0x10,%esp
 80483ba:   c7 45 fc 94 84 04 08    movl   $0x8048494,-0x4(%ebp)
 80483c1:   c9                      leave  
 80483c2:   c3                      ret

xxdから見たように、0x8048494の文字列は「hello\0」です。

0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b  ....hello......;
于 2011-06-30T06:34:43.813 に答える