固定サイズの1次元配列をグローバル変数として定義する例 ========================================================== この例ではグローバル変数 data1, data2 として配列を2つ割り当てています。 少しずつソースを見ていきます。 .. literalinclude:: s001.cpp :language: c++ :linenos: :lineno-start: 1 :lines: 1-11 data1,data2はそれぞれ double の配列 になります。 ``data1[i]`` などと添え字をつけて普通は使いますが、C++では配列名の ``data1`` 単体で も意味(値)を持ちます。 ``data1`` とだけ書くと配列の先頭アドレスを示す定数にな ります。配列の先頭アドレスが欲しかったら、 ``data1`` と書けばいいわけです。 定数ですので ``data1`` 単体では、代入の左辺に来ることはできません。 この値は doubleのポインタ変数に代入できます。 .. literalinclude:: s001.cpp :language: c++ :linenos: :lineno-start: 12 :lines: 12-25 最初の関数 ``set_dummy_data`` は、配列にダミーのデータを格納する関数です。 引数dの型は、doubleのポインタ型です。 ここには配列の先頭アドレスを渡すことができます。 .. literalinclude:: s001.cpp :language: c++ :linenos: :lineno-start: 27 :lines: 27-36 次の関数 ``copy_data`` は、配列から配列へ中身をコピーする関数です。 第二引数は ``const double *d`` として宣言されています。 こう書くと、ポインタdが指しているメモリの中身 ``*d`` が定数として扱われ、そこへの 代入が禁止され、エラーになります。`d` 単体には const がついていないので、 ``d`` は 変数であり、dへの代入は可能です。 もし ``const double * const d`` と書けば、``*d`` にも ``d`` にも代入禁止になります。 .. literalinclude:: s001.cpp :language: c++ :linenos: :lineno-start: 38 :lines: 38-48 次の関数では配列の中身を印字しています。 .. literalinclude:: s001.cpp :language: c++ :linenos: :lineno-start: 49 :lines: 49-70 最後に main 関数が書いてあります。 59行目を見ると、double のポインタを受け取る引数に、配列変数 ``data1`` を渡してい ます。配列変数はこのようにポインタ変数に代入ができます。 全体のソースを以下に示します: .. literalinclude:: s001.cpp :language: c++ :linenos: :download:`Download the source code` 実行例を示します:: % ./s001 s001 Before initialization [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] After initialization [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] After array copy [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]