3

私はC++言語が初めてで、ポインターの概念を理解しようとしています。

char ポインタに関する基本的な質問があります。

私が知っているのは、ポインターがアドレス値を格納する変数であることです。そのため、sth を次のように記述します。

char * ptr = "hello";

=私の基本的な知識から、ポインターに割り当てるアドレスがあるはずだと思いますが、ここでは文字のセットである「hello」を割り当てます。それで、それはどういう意味ですか?
ポインタはptr「hello」が格納されているアドレスを指していますか? それともハロー自体を保存しますか?
私はとても混乱しています。皆さんが私を助けてくれることを願っています..

前もって感謝します。

4

6 に答える 6

12

ptrリテラル"hello"が格納されているアドレスを保持します。この場合、文字列リテラルを指します。これは、静的 (最も一般的には読み取り専用) メモリにある不変の文字配列です。

ptr再割り当てすることで別のものを指摘できますが、そうする前に内容を変更することは違法です。(その型は実際const char*には です。C との互換性のために、への変換char*は非推奨です (C++11 では違法です)。

この保証により、コンパイラは自由にスペースを最適化できます。

char * ptr = "hello";
char * ptr1 = "hello";

2 つの等しいポインターが生成される場合があります。(つまりptr == ptr1)

于 2013-09-07T22:41:59.143 に答える
6

ポインターは、「hello」が格納されているアドレスを指しています。より正確には、「hello」の「h」を指しています。

于 2013-09-07T22:42:16.427 に答える
2

"hello"文字列リテラル: 文字の静的配列です。すべての配列と同様に、ポインターを必要とするコンテキストで使用される場合は、最初の要素へのポインターに変換できます。

ただし、配列は定数であるため、char*(ではなくconst char*) に割り当てることは非常に悪い考えです。そのポインターを使用して文字列を変更しようとすると、未定義の動作 (通常はアクセス違反) が発生します。

于 2013-09-07T22:44:30.157 に答える
1

コンパイラは、文字列を配置できる「どこかを見つけ」"hello"ptrその「どこか」のアドレスを取得します。

于 2013-09-07T22:42:42.873 に答える
0

文字列リテラルを割り当てて新しい char* を作成すると、char* にリテラルのアドレスが割り当てられます。したがって、char* の実際の値は 0x87F2F1A6 (何らかの 16 進アドレス値) になる可能性があります。char* は、文字列の先頭 (この場合は最初の文字) を指します。C および C++ では、すべての文字列は /0 で終了します。これにより、システムは文字列の末尾に到達したことを認識します。

于 2013-09-07T22:45:39.790 に答える
0

char* text = "Hello!"次のように考えられます。

プログラムの開始時に、長さ 7 の char の配列を作成します {'H','e','l','l','o','!','\0'}。最後の 1 つはヌル文字で、その後にそれ以上文字がないことを示しています。[文字列に関連付けられたカウントを保持するよりも効率的です...カウントは、32 ビット整数の場合、おそらく 4 バイトを使用しますが、null 文字は 1 バイト、または Unicode 文字列を使用している場合は 2 バイトです。 . さらに、文字の配列とカウント変数を同時に管理しなければならないよりも、ヌル文字で終わる単一の配列を使用するほうが混乱しません。]

配列の作成と文字列定数の作成の違いは、配列は編集可能で、文字列定数 (または「文字列リテラル」) は編集できないことです。文字列リテラルに値を設定しようとすると問題が発生します: それらは読み取り専用です。

次に、ステートメントを呼び出すたびにchar* text = "Hello!"、その初期配列のアドレスを取得し、それを変数に貼り付けますtext。このようなものがある場合は注意してください...

char* text1 = "Hello!";
char* text2 = "Hello!";
char* text3 = "Hello!";

...その後、 の 3 つの個別の配列を作成している可能性が非常{'H','e','l','l','o','!','\0'}に高いため、これを行う方が効率的です...

char* _text = "Hello!";
char* text1 = _text;
char* text2 = _text;
char* text3 = _text;

ほとんどのコンパイラは、1 つの文字列定数のみを自動的に初期化するほどスマートですが、特定の最適化機能を手動で有効にした場合にのみ初期化するコンパイラもあります。

別の注意: 私の経験delete []から、文字列リテラルへのポインターを使用しても問題は発生しませんが、実際には削除されないことがわかっているため不要です。

于 2013-09-07T23:09:34.580 に答える