どのようにchar * name = "Duncan";ポインタがアドレスだけを保持できる場合に有効ですか?

ポインタは他の変数へのアドレスしか保持できないと思った。それで、私が出会った次の声明はどのように有効になりますか?それは文字列を保持しています。

char * name = "Duncan"

ありがとう。

0
この「定義」は非推奨です。なぜでしょうか?
追加された 著者 BatchyX,
@ user1071136:G ++はこれを廃止予定だと考えており、これをコンパイルできるようにするC ++ 11標準のものは何も見つかりません。
追加された 著者 BatchyX,
それは本当に非難されていません。 "Duncan" const char の配列なので、const-correctnessは const char * name = "Duncan" と書くべきです。
追加された 著者 user1071136,

6 答え

それは文字列へのポインタを保持しています。それは同じではありません。 name には文字列を含むメモリのアドレスだけが入っています。

4
追加された

"Duncan"はnullで終了する文字列であり、そのようなchar配列( {'D'、 'u'、 'n'、 'c'、 'a'、 'n'、 '\ 0'} )。 char * name = "Duncan"; はnameを配列のアドレスに設定します。

あなたのステートメントはCではOKですが、C ++では "Duncan"はconst char配列なので、 const char * name = "Duncan" を使用してください。

ところで、ポインタ変数名を変更する必要がない場合は、 const char name [] = "Duncan" を使用する方が良いでしょう。これは文字列にのみメモリを割り当てます。サンプルコードは、文字列とポインタ変数名のメモリを割り当てます。 (もちろん、コンパイラは名前を最適化するかもしれません。)

3
追加された
@fdama: name [1] ++ を実行するとどうなりますか?(Ok:静的定数がそこに居るので、ほとんどの場合、保護されたメモリに書き込みます。文字列リテラルの値を変更する:あなたが意図するものではない)
追加された 著者 sehe,
@fdama:C ++の文字列リテラルはconstなので、constを使う必要があります。とにかく、Cでも文字列リテラルを使いこなすのは良い考えではありません。すべての呼び出しで同じ文字列リテラルを使用する関数(たとえば、入力文字列と比較する)を想像してみてください。誰かが文字列リテラルを変更した場合、関数は予期せず動作を変更します。
追加された 著者 Werner Henze,
私はまだ const がここで使われるべきかどうかについてはまだ分かりません。
追加された 著者 fdama,

それでも文字列を指しています。文字列は最初にメモリに入れられ、 name はそれを指します。これはあなたのプログラムに組み込まれているので、明らかではないかもしれません。

1
追加された

ポインタは他の変数へのアドレスしか保持できません。

これは間違っています:参照は他の変数のアドレスを保持しています。ポインタは何かのアドレスを保持することができます(特に NULL )。

この場合、 D u n のASCIIコードを含む7バイトのメモリブロックのアドレスを/code>、 a n \ 0

1
追加された

この特定の場合、コンパイラはオブジェクトファイルのどこかに Duncan \ 0 というデータを持つ配列を格納します。

だから、ポインタはアドレスを保持しているだけです。データは別の場所にあります。

これは私にこのようなコードを書くことはあまり良くないと言ってきます。たとえば、ポインタを使用してその文字列を変更すると、未定義の動作が発生します。

0
追加された

これは、charポインタの定義です。定義の後、 "="の右側には、定義の定義があります。定数はメモリのどこかに格納され、そのアドレスは "name"の最初の値として使用されます。 後で "名前"に他の値を割り当てることができます。あなたは最初の値に縛られていません、実際には "名前"は変数です。

0
追加された