2011-02-11 15 views
2
char amessage[] = "now is the time"; /* an array */ 
    char *pmessage = "now is the time"; /* a pointer */ 
+0

「amessage = pmessage'を試してください。 'pmessage = amessage' – Peyman

答えて

4

amessageは、​​です。それは配列です。配列の要素には文字列リテラルの16文字が含まれます。

pmessageは、char*です。それはポインタです。文字列リテラルからの16文字を含む(変更不可能な)配列を指しています。 (。。あなたはリテラル文字列を指すようにchar*を使用しないでください。そうすることは悪である文字列リテラルを参照するときは、常にconst char*可能な限りを使用する必要があります)

+0

第2の文字列を明確にするために、文字列リテラル自体は不変ですが、' pmessage'の型があり、その変更可能な、恐ろしい特殊ケースの変換と言います。 – GManNickG

+0

@GMan:リテラルはC++のように 'char [N]'ではなく 'const char [N]'であるため、Cで特別に扱われるわけではありません。私は文字列リテラルを参照するのに 'char * 'を使うのは悪いことに同意します。 –

+0

ああ、もう一度私の無知を輝かせる。 – GManNickG

0

をジェームズMcNellisの答えに加えて、amessageは一つのことです - - 文字列 "now is the time"(amessageが作成されたときにそこにコピーされるため)を含むスタック上の16文字の配列。それに含まれる内容を変更することができます。

一方、pmessageは、文字列リテラル(メモリの書き込み不可能な部分に格納される)とポインタの2つです。文字列リテラルの内容は変更できませんが、ポインタが指しているものを変更して別の文字列を指すようにすることができます。また、文字列リテラルを他のポインタのターゲットとして使用できます。

(ある意味では、これは完全に真実ではない - の内容は、それが作成されていますときからコピーされている場合、それはだとしてamessageも、文字列リテラルを伴うしかし、あなたはその後その文字列リテラルは何もできません。 。)

0

GCCを使用している場合は、-Wwrite-stringsをオンにします。固定文字列はconst char [length_of_string]型であり、char *への変換は警告[constでなければならない]を引き出す。

第割り当てがポインタベースの割り当てである(そして、結果の文字列が固定文字列として保持されている)、一方、最初の割り当ては、文字列の割り当てである

-であるように、第1の割り当てが、一方、許容可能です2番目にはconst修飾子が必要です。

最初の割り当てでは、ポイントを変更することは可能です(例:amessage [3] = 'q')。第二の割り当てに(文字列がconstのであるから)、ポイントを変更することは容認できない - あなたはバスエラーにCで

0
char amessage[] = "now is the time"; /* an array */ 
char *pmessage = "now is the time"; /* a pointer */ 

を取得する必要があります「=」の左にあるものを「左辺値」と呼ばれます。型は 'lvalue'によってのみ定義されます。だから 'amessage'は文字配列です。 'pmessage'はcharへのポインタです。

Cでは、配列型&の 'char *'アクセスと等価なものとの関連があります。

「pmessage」は変更可能な「左辺」です。「amessage」は変更できません。したがって、「pmessage」をconstとして宣言するというアドバイスは、本当に変更可能ではないはずです。

など。

const char* const pmessage = "..."; 

メモリアクセスの点では、「amessage」は直接アクセスになりますが、「pmessage」は逆参照が必要です。

注:Cコンパイラでは、文字列リテラルを使用してコンパイル時に 'char *'の初期化のみが許可されます。

など。あなたは

1. { 
2.  int j = 1; 
3.  int *k = &j; 
4.  int *i = 1; 
5. } 

を持っていた場合は4行目は意味&は違法でないだろうことができます。

ピーター・ヴァン・リンデンの「Deep C Secrets」には、C配列&のポインタに関する章があります。

+0

'amessage'は実際には配列なので、変更不可能な左辺値です。これは、事実上、指定された「メッセージ」が割り当て可能でないことを意味する。配列の要素が代入可能でない(代入可能である)わけではありません。 'pmessage'は実際には変更可能な左辺値です(これはポインタです)。つまり、別のオブジェクトを指すようにポインタを変更することができます。 'const char *'として宣言しても、変更不可能な左辺値にはならない: 'const char'を指す変更可能な左辺値にする。 –

+0

はい。修正された例。ちょうど助けようとしています... :-) –

関連する問題