1. ホーム
  2. c

[解決済み] C: char pointerとarrayの違い [重複].

2022-04-27 12:50:29

質問

<余談

検討する。

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する必要がある)に対するポインタを返すのです。