2011-06-30 14 views
1

私は何度もステートメントchar* ch = "hello";に出くわしました。ステートメントの意味

char* chは、chcharに向かっていることを示しています。しかし、helloをchに割り当てるのはどういう意味ですか?

私はこれを突き止めることはできませんか?助けてください。

答えて

4

つまり、chは文字へのポインタです。あなたがするときchar* ch = "hello"chは、最初の文字、つまり文字hを指しています。 2番目の文字を指すには、ch + 1またはch[1]を入力します。理想的には、chのタイプは、尖ったメモリの場所に書き込めないので、const char*であったはずです。

+1

このコントリ除去特殊変換は、C++ 98/C++ 03では廃止され、C++ 0xでは削除されています(つまり、コンパイルされないC++ 0xコンパイラを使用)。 –

+0

downvoteの具体的な理由は何ですか?答えに何か問題はありますか? – Naveen

+0

+1匿名downvoteに対抗する。 –

3

文字列リテラルは、プログラムバイナリのどこかに静的に格納されます。それらはメモリの読み込み専用の 'data'セクションにロードされる可能性が最も高いですが、これは未定義の動作です。

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

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

+0

...だから、それはconst char * chでなければなりません – cdarke

0

文はにコンパイル: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......; 
1

ここで起こっていくつかのものがあります。

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