私は何度もステートメントchar* ch = "hello";
に出くわしました。ステートメントの意味
char* ch
は、ch
がchar
に向かっていることを示しています。しかし、helloをchに割り当てるのはどういう意味ですか?
私はこれを突き止めることはできませんか?助けてください。
私は何度もステートメントchar* ch = "hello";
に出くわしました。ステートメントの意味
char* ch
は、ch
がchar
に向かっていることを示しています。しかし、helloをchに割り当てるのはどういう意味ですか?
私はこれを突き止めることはできませんか?助けてください。
つまり、ch
は文字へのポインタです。あなたがするときchar* ch = "hello"
ch
は、最初の文字、つまり文字h
を指しています。 2番目の文字を指すには、ch + 1
またはch[1]
を入力します。理想的には、ch
のタイプは、尖ったメモリの場所に書き込めないので、const char*
であったはずです。
文字列リテラルは、プログラムバイナリのどこかに静的に格納されます。それらはメモリの読み込み専用の 'data'セクションにロードされる可能性が最も高いですが、これは未定義の動作です。
文字列リテラルを割り当てると、最初のバイトのアドレスが渡されます。この場合、char* ch
は "hello"の 'h'を指します。
注:静的な文字列の変更は未定義の動作です!ポインタを取得することはできますが、割り当ては危険です。
...だから、それはconst char * chでなければなりません – cdarke
文はにコンパイル:0x8048494での文字列がXXDからここに見られるように、 "ハロー\ 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
:
0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b ....hello......;
ここで起こっていくつかのものがあります。
"hello"
は{ 'h', 'e', 'l', 'l', 'o', '\0' }
と等しい。つまり、それは文字の配列です。配列は、暗黙的に対応するポインタ型に変換できます。したがって、ここでのステートメントは実際には文字の(静的な)配列を作成し、最初の要素へのポインタを変数ch
(悪い命名法)に割り当てます。
このコントリ除去特殊変換は、C++ 98/C++ 03では廃止され、C++ 0xでは削除されています(つまり、コンパイルされないC++ 0xコンパイラを使用)。 –
downvoteの具体的な理由は何ですか?答えに何か問題はありますか? – Naveen
+1匿名downvoteに対抗する。 –