私は何度も声明に出くわしましたchar* ch = "hello";
。
私はそれがへのポインタであることを示していることを理解しchar* ch
ていch
ます char
。しかし、 helloをchに割り当てるとはどういう意味ですか?
私はこれを理解することはできませんか?助けてください。
これはch
、文字へのポインタであることを意味します。あなたがそうするときchar* ch = "hello"
ch
、最初の文字、すなわち文字を指しているでしょうh
。2番目の文字を指すには、ch + 1
またはを実行できますch[1]
。ポイントされたメモリ位置に書き込むことができないため、理想的にはのタイプであるch
必要があることに注意してください。const char*
文字列リテラルは、プログラムバイナリ内のどこかに静的に格納されます。ほとんどの場合、メモリ内の読み取り専用の「データ」セクションにロードされますが、これは未定義の動作です。
文字列リテラルを割り当てると、最初のバイトのアドレスが渡されるだけです。この場合、char* ch
「hello」の「h」を指します。
注:静的文字列の変更は未定義の動作です!ポインタを取得することはできますが、割り当ては危険です。
ここで起こっていることがいくつかあります。
"hello"
に等しい{ 'h', 'e', 'l', 'l', 'o', '\0' }
。つまり、文字の配列です。配列は、対応するポインタ型に暗黙的に変換できます。したがって、ここでのステートメントは実際に文字の(静的)配列を作成し、最初の要素へのポインターを変数に割り当てますch
(ちなみに、名前は正しくありません)。
ステートメントは次のようにコンパイルされます。
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......;