1. ホーム
  2. c

[解決済み】配列名はポインタですか?

2022-04-04 05:32:12

質問

C言語では配列の名前はポインタになるのですか? そうでない場合、配列の名前とポインタ変数の違いは何ですか?

どのように解決するのですか?

配列は配列、ポインタはポインタですが、多くの場合、配列名は 変換される をポインタに変換します。よく使われる言葉として、それらは 崩壊 をポインタに変換します。

ここに配列があります。

int a[7];

a は7つの整数を入れるスペースがあり、このように代入でそのうちの1つに値を入れることができます。

a[3] = 9;

以下はポインタです。

int *p;

p は整数のためのスペースを含まないが、整数のためのスペースを指すことは可能である。たとえば、配列のいずれかの場所を指すように設定することができます。 a といった具合に。

p = &a[0];

紛らわしいのは、こうも書けることです。

p = a;

これは ない 配列の内容をコピーします。 a をポインタ p (それが何を意味するかはともかく)。その代わり、配列名 a はその最初の要素へのポインタに変換されます。つまり、その代入は前のものと同じことをするのです。

これで p を配列と同じような方法で使用することができます。

p[3] = 17;

これがうまくいくのは、C言語の配列再参照演算子が [ ] は、ポインタで定義されています。 x[y] の意味は、ポインタ x ステップ y 要素をポインタの指す先に進め、そこにあるものを取得します。ポインターの演算構文を使って x[y] は次のように書くこともできます。 *(x+y) .

これを通常の配列で動作させるには、たとえば a という名前の aa[3] の最初の要素への)ポインタに変換する必要があります。 a ). そして、3要素進んで、そこにあるものをすべて取ります。つまり、配列の3の位置にある要素を取り出します。(最初の要素は0番なので、配列の4番目の要素です)。

つまり、C言語のプログラムにおける配列名は、(ほとんどの場合)ポインタに変換されるのです。例外は sizeof 演算子を使用します。もし a はこのコンテキストでポインタに変換されました。 sizeof a は実際の配列のサイズではなくポインタのサイズを与えることになり、これはかなり無駄なことです。したがって、その場合は a は配列そのものを意味します。