Looking for c Answers? Try Ask4KnowledgeBase
Looking for c Keywords? Try Ask4Keywords

C Language配列


前書き

配列は、別の型の順序付けられた値(「要素」)を表す派生データ型です。 Cの大部分の配列は、いずれかの型の固定数の要素を持ち、その表現は、要素をギャップまたはパディングなしでメモリに連続して格納します。 Cは、要素が他の配列である多次元配列、およびポインタの配列を許します。

Cは、実行時にサイズが決定される動的に割り当てられた配列をサポートします。 C99以降では、可変長配列またはVLAがサポートされています。

構文

  • タイプ名[長さ]; / *名前 'name'と長さ 'length'の 'type'の配列を定義します。 * /
  • int arr [10] = {0}; / *配列を定義し、すべての要素を0に初期化する* /
  • int arr [10] = {42}; / *配列を定義し、最初の要素を42に初期化し、残りを0に初期化します。* /
  • int arr [] = {4,2,3,1}; / *長さ4の配列を定義して初期化する* /
  • arr [n] = value; / *インデックスnの値を設定します。 * /
  • 値= arr [n]; / *インデックスnの値を取得します。 * /

備考

なぜ配列が必要なのでしょうか?

配列は、独自の意義を持ってオブジェクトを集合体に編成する方法を提供します。たとえば、C文字列は文字の配列( char s)で、 "Hello、World!"などの文字列です。キャラクターに個々に固有のものではない集合体としての意味を持ちます。同様に、配列は数学的なベクトルや行列、そして多くの種類のリストを表すためによく使われます。さらに、要素をグループ化する何らかの方法がなくても、別々の変数を介してなど、個々に個別に対処する必要があります。それは扱いにくいだけでなく、さまざまな長さのコレクションを容易に受け入れることができません。

配列は、ほとんどのコンテキストで暗黙的にポインタに変換されます

sizeof演算子、 _Alignof演算子(C2011)、単項演算子( & _Alignof of)、または(他の)配列の初期化に使用される文字列リテラルのオペランドとして表示される場合を除いて、配列は暗黙的に(最初の要素へのポインタ。この暗黙の変換は、配列添字演算子( [] )の定義に密接に関連しています。式arr[idx]*(arr + idx)と等価であると定義されています。さらに、ポインタ演算は可換性であるため、 *(arr + idx)*(idx + arr)と等価であり、 idx[arr]と等価です。 idxまたはarrいずれかがポインタ(またはポインタに崩壊する配列)であり、もう一方が整数であり、整数が配列への有効なインデックスである場合、それらの式はすべて有効であり、同じ値に評価されますこれにポインタが指す。

特殊なケースとして、 &(arr[0])&*(arr + 0)と等価であることにarr 。これはarr簡単になります。これらの表現はすべて、最後のポインタが消えたところであればどこでも交換可能です。これは、配列が最初の要素へのポインタに崩壊することを単純に再現します。

対照的に、アドレス演算子がT[N]型( すなわち &arr )の配列に適用された場合、結果の型はT (*)[N]あり、配列全体を指します。これは少なくともポインター型のサイズに関して定義されたポインター算術に関して、最初の配列要素へのポインターとは異なります。

関数のパラメータは配列ではありません

void foo(int a[], int n);
void foo(int *a, int n);

fooの最初の宣言では、パラメータaに対して配列のような構文が使用されますが、このような構文は、関数パラメータがそのパラメータを配列の要素型へのポインタとして宣言するために使用されます。したがって、 foo() 2番目の署名は、最初の署名と意味的に同じです。これは、変数と関数のパラメータは同じ配列型で宣言されている場合は、その変数の値として関数呼び出しでの使用に適しているような、彼らは関数呼び出しの引数として現れるポインタへの配列値の減衰に対応します引数に関連付けられた引数。

配列 関連する例