[解決済み] C: char pointerとarrayの違い [重複].
2022-04-27 12:50:29
質問
<余談
この質問には、すでにここで回答があります
:
クローズド
6年前
.
検討する。
char amessage[] = "now is the time";
char *pmessage = "now is the time";
から読みました。 C言語 第2版では、上記の2つの文は同じことをするわけではないとのことです。
配列は、ポインターを操作して何らかのデータを格納するのに便利な方法だとばかり思っていましたが、明らかにそうではありませんね......。C言語における配列とポインタの自明でない違いは何でしょうか?
どうすれば解決するの?
その通りですが、微妙な違いです。 本来は、前者です。
char amessage[] = "now is the time";
現在のスコープのスタック空間にメンバが存在する配列を定義する、一方。
char *pmessage = "now is the time";
現在のスコープのスタック空間に住んでいるが、他の場所のメモリを参照しているポインタを定義します(この中で、"now is the time"はメモリの他の場所、一般的には文字列テーブルに格納されています)。
また、2番目の定義に属するデータ(明示的なポインタ)は、現在のスコープのスタック空間に格納されていないため、どこに格納されるかは正確には不定であり、変更してはいけないことに注意しましょう。
編集部:Markさん、GManさん、Pavelさんが指摘されているように、これらの変数のいずれかにaddress-of演算子を使用した場合にも違いがあります。 例えば、&pmessageはchar**型のポインタ、つまりcharsへのポインタを返しますが、&ameessageはchars(*)[16]型のポインタ、つまり16charsの配列(chars**と同様にlitbが指摘するように2回dereferencedする必要がある)に対するポインタを返すのです。
関連
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
関数 'malloc' の暗黙の宣言に対する解決策
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み】文字列リテラルで初期化された "char *s "に書き込むと、"char s[]"ではなく、セグメンテーションフォールトが発生するのはなぜですか?]