宣言に割り当てられたリテラル差列はポインタの配列を定義します

宣言に割り当てられている文字列リテラルは、ポインタと配列との間の差を定義します

量に物事が変更することはできません、文字列、鉄理由です!そこで質問がありますか?何故

するchar * p = "ABC";

* P = 'D'; //(間違っています!)

チャーP2 [] = "ABC"。

P2 [0] = 'D'; //(右!)

これは、髪のためにありますか?ヘアああのため?それは一定の良いを変更することはできませんと言うことではありませんか?するchar * p = "ABC" は一定でありますか?何のconstああありません![0] = 'D' なぜp2が正しく、* P =間違った 'D'?

私は上に行く可能性が聞く、あなたは最初に少し、「ABC」を知っている文字列リテラルを所属する必要があります(文字列定数)、「文字列リテラルを変更することはできません、」一定の記憶領域に格納され、変更することはできません。

即ちアドレスに①char* Pの最初の文字、すなわち、文字列「ABC」を指すように=「ABC」ポインタ変数p、pは* pを=「D」、「ABC」の文字列「」のアドレスに等しく、元「」「d」を修正し、その「リテラル文字列を変更することはできません」ので、「ABC」は、「DBC」となりますので、コンパイラが決定* P =「Dから保存されたp値「間違っています。

 

②チャーP2 [] =「ABC」の文字列変数宣言を、その長さは、コンパイラが自動的に長さを計算し、その場合、省略することができるので、コンパイラは、「格納するのに十分である、4つの文字P2空間を割り当てますABC「の文字とヌル文字。見て!コンパイラは、4文字のP2のためのスペースが割り当てられます!この時間は、コンパイラがP2である他方が割り当てられ、(Ciは、それらが作られた話す)、ブロックアドレスが(一定の記憶領域に)文字列リテラル「ABC」連続したアドレスに格納されている2つのアドレスブロックを生成しました4文字のスペース(スタック領域)。次に、図で示されます。

示されるように、チャーP2は[] =「ABC」は4つの文字がスタック領域にコンパイラに渡される「A」、「B」、「C」と同様のプロセスを用いて、渡された値、「\ 0」でありますこうして読み書きデータによりスタック領域に、P2の連続するアドレス空間に割り当てられた4つの文字が、すなわち、P2 [0] =「D」、改変することができる、すなわち、コンパイラがスタック領域「」修飾「D」でき。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_29250265/article/details/94546172