int array[5]; // 要素数 5 の配列を宣言 int n=5; // 配列の要素数 |
int n=5; // まずは配列の要素数を決める int array[n]; // 要素数 n の配列を宣言 (しかしコンパイルエラー!!) |
const int n=5; // まずは配列の要素数を定数として定める int array[n]; // 要素数 n の配列を宣言 (これなら n は定数なのでコンパイルは通る) |
(補足) なお、C 言語では上記の記述を以下のように書くことが多かった。 「#define SIZE 5」とは「SIZE という文字列を強制的に 5 に置き換える」という意味である #define SIZE 5 int main(int argc, char *argv[]){ int array[SIZE]; /* 要素数 SIZE の配列を宣言 */ int i; for(i=0 ; i<SIZE ; i++){ /* 何らかの処理 */ } |
int n; // 配列の要素数として用いる std::cout << "配列の要素数を入力してください : "; std::cin >> n; // この行は初めて登場するが、「コンソールから入力された値を n に代入する」という意味である std::cout << "読み込まれた n の値は" << n << "です\n"; int array[n]; // 要素数 n の配列を宣言 (n は定数ではないのでコンパイルエラー!!) |
const int n; // 配列の要素数として用いる std::cout << "配列の要素数を入力してください : "; std::cin >> n; // 今度は定数 n を変更しようとしてコンパイルエラー! std::cout << "読み込まれた n の値は" << n << "です\n"; int array[n]; // ここまで到達しない) |
(補足) ここで見たように、C/C++ では使用するメモリは自分で管理するのが特徴なのだが、上記にあるように、 プログラムが複雑になればなるほど、メモリリーク (メモリの解放し忘れ) のバグを引き起こしがちである。 その問題を解決するため、C++ より後に作られた Java や C# という言語では
このことを、上の「int 型の配列確保」を例に用いて解説しよう。 C++ では配列の確保の方法は以下の二通りがあることはこれまで学んできた。 int array1[5]; // C++ : 方法1 int *array2; // C++ : 方法2 array2 = new int[5]; 一方、Java や C# では配列を用いる際に以下の方法を用いる。 int[] array; // Java/C# : 方法 array = new int[5]; 注意深く観察すると、Java/C# の方法は「C++ : 方法2」から生まれた記法であることが分かるだろう。 また、Java や C# では (原則として) ポインタは存在しないので、宣言が「int[] array;」 となっているが、 ポインタを理解した後でこの記法を見ると、ポインタは存在しないのではなく、 単にユーザーから隠蔽しただけであることもわかる。 また、メモリの解放については、 delete[] array ; // C++ (書かないくて良い) // Java/C# という違いがある。 ただし、Java/C# では array = null; のように array にヌルポインタを代入して、 array がどこも指さないようにする、ということはしばしば行われる。 C++ のメモリ管理を体験した後で Java/C# に移行すると、メモリ管理をシステムに任せることができるのは 非常にプログラミングが楽になる、ということが実感できる。 しかし個人的には、Java/C# からプログラミングを学ぶ者でも、 この講義で学ぶ程度のメモリ管理の知識は最低限身につけて欲しいと考えている。 それは、これらについて知っていた方が、効率的なプログラムを書けると考えられるからである。 |