ポインタの文字列定数を初期化します

今日では、小さなテキストのトークアドレス文字列と文字列定数を記述します。

C IN /文字列定数内のC ++だけポインタ文字の名前のように、文字列名が文字列として最初の要素のアドレスを示し、文字列の最初の要素のアドレスを表します。

シンプルcoutの<<アドレスで、アドレスを印刷したい。あなたが文を取得することができます。

ただし、次の2つのステートメントは、文字列全体を印刷すること

チャー [ 20 ] = " 1234 " 
coutの << << てendl; 

char * p = 
coutの << P <<てendl;

これはまた、文字配列やその他のさまざまな場所の配列で、文字列のアドレスはどのようにそれを取得しますか?

ここで参照するには、2つの方法があります

coutの<<(int型 *)<< てendl; 
coutの <<&<<てendl;

どちらの方法「には、文字列のアドレス」正しくプリントアウトすることができますが、微妙な違いの場所があります

文字列は、文字の最初のアドレスを表し、A + 1番目の文字のアドレスを表します。

印刷アドレスの最初のステートメントでは、(int型*)のキャストとしてのみ行為は、他の言葉では、最初の文字のアドレスを表すが、COUTは<<、出力は文字列全体ですアドレスは、char *型であるため、これはある、それは「\ 0」文字列の内容を検出するまでのchar *アドレスがポイントのアドレス空間の先頭から自動的に印刷されます入力する認識COUTので、ここで我々は唯一の必要、キャスト(ここでは、例えば、キャストint型のため*、指標の他のタイプに変換することができ、文字でない場合は*、ダブル*でも、正しいアドレスを印刷することができます)。だから、あなたはそれの2番目の文字、coutの<<(int型*)(対処したい場合は 、A + 1); 友達になれます

二print文アドレス、直接使用&;ことを強調しなければならないアドレスは、配列の最初の要素が関係なく、任意の配列名の表示され、&配列の配列名のアドレスは、しかし、示しています同じアドレスをプリントアウトし、それ以外の日にポインタ演算差場合の両方、および効果以下のコードを見て

INT [ 10 ]。
COUTは << " aがある:" << << " A + 1は次のとおりです。" << A + 1 << てendl; 
裁判所未満 << " &aがある:" <<&<< " &A + 1は次のとおりです。" <<&A + 1 <<てendl;

真理、+ 1後進のみ4バイトと地図、および&A + 1は、直接40バイト後退、アレイ全体のアドレスは、アレイ名&表現です。だから、同じトークン&文字列名によって、あなたはまた、文字列のアドレスをプリントアウトすることができます。

 以下トーク文字列定数は、第1、第2の静的記憶領域、列記憶を変更することはできません。

以下のため、いくつかの文章

チャー [ 20 ] = " 1234 " char * pを= " 1234 " ;
const  のchar * pを= " 1234 " ;

最初の文、言うまでもなく非常に一般的な、正しい、これは二十から三声明いると、それは間違っています。

最初に私は本当に貧しい知識が想像力を制限している、と思っプラスのconstは重要ではありませんせずに、とにかく、間違っている、そして、非常に微細な恐怖を考えます。

私は「1234」に割り当てられた* pをのように見える、見ていないので、2の背後にある理由が間違っていると思うし、できないから始め、これは要するに、奇妙で探しているもの、です。

だからここにそれが冒頭で述べたポイントの知識を必要とする; C / C ++で定数文字列内の文字列の最初の要素のアドレスを表し、名前だけではcharポインタのような、char配列の名前は、文字を表します文字列の最初の要素の同じアドレス

だから、今回は理解するだろう、それは「1234」は、実際には、基本的に最初の文字の「1234」のアドレスでたことが、その後、「1234」は問題がないもうよく対処するために対処するためのchar *ポインタpのポインティングを入力しました、しかし、そうconst修飾を追加して、「1234」は一定であることを理由に、間違いをコンパイルした後。

ここでは、constのは限ら理由について追加する必要がありますのみ正しい、そしてマッチの種類は、それが文句を言う理由は、ですので、再強調することが必要、ない場合は「1234」の文字列定数であり、定数を変更することはできません、のchar * pを場合= 「1234」、それは「1234」に変更することができることを意味するが、これは、それが従わなければならない許可されていないプラスのconst修飾子は、システムが楽に感じるようにものである、正常にコンパイル。

えっ?定数のconst修飾子を追加するように変更することができない、なぜ我々は最初の文正しく、それを欠場することが報告されていないとされていることができますか?

我々はそれについて話をする必要があり、この文の最初と3番目の文の違い、「1234」の文字列定数であり、静的記憶領域に格納されている定数、アドレス

3番目のステートメントはそうのconst修飾子を追加するために、それは神のアドレスに直接であるので、「1234」、スタティックメモリアドレスに直接一定のポインタを作ることです

そして、これが本当の「1234」には影響しません最初の文のコピーは、文字配列で複製するうち、静的な記憶領域「1234」を吸い込まので、この初期化は、「1234」の後にコピーを変更することができます;

COUTは知っている真の偽のアドレスアドレス

。1  CHAR [ 20は ] = " 1234 " ;
 2  のconst  char型 * P = " 1234 " ;
 3 COUT << ENDL <<&; // 文字列のアドレスを取得する
。4 COUT&<< " 1234 " << ENDL。// スタティックメモリのアドレスに「1234」を得る
 。5  
。6  // 文字列の最初の要素のアドレスを文字列定数をテストするために再び
。7 COUT * << 1234  << ENDL;
 8 COUT <<(* " 1234 "+ 1)<< ENDL。

 

 

また、たくさんの悪いことは確か最後尾の2行のメモリ領域間でアドレスビット、多くの結論が確認されていたかっOK、明らかに「1234」のコピー「1234」アドレスと異なる神ではなく、実際には本当に、完璧になります私は12ポイントまで滞在するまで住んでいます。

 

おすすめ

転載: www.cnblogs.com/GuoYuying/p/11391981.html