char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
答えて
amessage
は、です。それは配列です。配列の要素には文字列リテラルの16文字が含まれます。
pmessage
は、char*
です。それはポインタです。文字列リテラルからの16文字を含む(変更不可能な)配列を指しています。 (。。あなたはリテラル文字列を指すようにchar*
を使用しないでください。そうすることは悪である文字列リテラルを参照するときは、常にconst char*
可能な限りを使用する必要があります)
をジェームズMcNellisの答えに加えて、amessage
は一つのことです - - 文字列 "now is the time"(amessage
が作成されたときにそこにコピーされるため)を含むスタック上の16文字の配列。それに含まれる内容を変更することができます。
一方、pmessage
は、文字列リテラル(メモリの書き込み不可能な部分に格納される)とポインタの2つです。文字列リテラルの内容は変更できませんが、ポインタが指しているものを変更して別の文字列を指すようにすることができます。また、文字列リテラルを他のポインタのターゲットとして使用できます。
(ある意味では、これは完全に真実ではない - の内容は、それが作成されていますときからコピーされている場合、それはだとしてamessage
も、文字列リテラルを伴うしかし、あなたはその後他その文字列リテラルは何もできません。 。)
GCCを使用している場合は、-Wwrite-stringsをオンにします。固定文字列はconst char [length_of_string]型であり、char *への変換は警告[constでなければならない]を引き出す。
第割り当てがポインタベースの割り当てである(そして、結果の文字列が固定文字列として保持されている)、一方、最初の割り当ては、文字列の割り当てである
-であるように、第1の割り当てが、一方、許容可能です2番目にはconst修飾子が必要です。
最初の割り当てでは、ポイントを変更することは可能です(例:amessage [3] = 'q')。第二の割り当てに(文字列がconstのであるから)、ポイントを変更することは容認できない - あなたはバスエラーにCで
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配列&のポインタに関する章があります。
'amessage'は実際には配列なので、変更不可能な左辺値です。これは、事実上、指定された「メッセージ」が割り当て可能でないことを意味する。配列の要素が代入可能でない(代入可能である)わけではありません。 'pmessage'は実際には変更可能な左辺値です(これはポインタです)。つまり、別のオブジェクトを指すようにポインタを変更することができます。 'const char *'として宣言しても、変更不可能な左辺値にはならない: 'const char'を指す変更可能な左辺値にする。 –
はい。修正された例。ちょうど助けようとしています... :-) –
- 1. PUTとPOSTの技術的な違いは何ですか?
- 2. 技術的にs3n、s3aとs3の違いは何ですか?
- 3. これら2つの宣言の違いは何ですか?
- 4. 共有ライブラリと静的ライブラリの技術的な違いは?
- 5. cのこれらの2つの宣言の違いは何ですか?
- 6. JavaScriptのこれら2つの関数宣言の違いは何ですか?
- 7. これらの3つのデリゲート宣言の違いは何ですか?
- 8. Pythonのこれら2つの配列宣言の違いは何ですか?
- 9. これらの2つのポインタ宣言の違いは何ですか?
- 10. これら2つの配列宣言の違いは何ですか?
- 11. 機能的な変更と技術的な変更の違いは何ですか?
- 12. 関数宣言(文)も技術的にも関数式ですか?
- 13. iOSウェブビューとSafariモバイル用のアプリを開発する際の主な(技術的な)違いは何ですか?
- 14. Technoratiが構築した言語/技術/フレームワークは何ですか?
- 15. AJAXウェブアプリケーションのユーザビリティの技術的限界は何ですか?
- 16. セッションとトークンベースの認証の技術的な違い
- 17. /inで実装されたMicrosoft Navisonの技術と言語は何ですか?
- 18. PowerShellでは、技術的には「ヘルプ」コマンドとは何ですか?
- 19. AMDのAPP SDKと(AMD)ATIのストリーム技術の違いは何ですか?
- 20. スタンドアロンアプリとWebアプリの技術的な違い
- 21. Linq-to-SQLのSubmitChangesとEntity FrameworkのSaveChangesの技術的な違いは何ですか?
- 22. Javaミドルウェア技術とは何ですか?
- 23. クラスの前方宣言とクラスの宣言の違いは何ですか?
- 24. charのこれらの2つの宣言の違いは何ですか?どちらが正しいか?
- 25. 「初期WSDL」とは技術的には何ですか?
- 26. 技術的にはムーンライトとは何ですか?
- 27. SuperClassのfinal static宣言とextendedClass宣言の違いは何ですか?
- 28. httpとhttpsの技術の違い
- 29. GCC技術的な詳細
- 30. 技術的な合法性
「amessage = pmessage'を試してください。 'pmessage = amessage' – Peyman