対象 | C言語初心者 |
記事概要 | C言語の配列について記載しています。 |
筆者 | Zuu [ ] C言語歴20年以上。 大手電機メーカーでの製品開発およびマネジメント経験がある現役エンジニアです。 プロジェクトマネージャ、システムアーキテクトなどの資格を保有しています。 |
はじめに
配列は、「変数」の一種です。変数についての理解が不十分だと感じている場合は、まずは変数について学びましょう。
本サイトでは、以下の記事で変数について説明しています。よろしければご覧ください。
配列とは?
複数の要素(値)の集合を格納・管理するのに用いられるデータ構造が配列である。数学のベクトルおよび行列に近い概念であり、実際にベクトルおよび行列をプログラム上で表現する場合に配列が使われることが多い。
今まで、変数は整数や小数、文字といった1つのデータを記憶していましたが、配列では複数のデータを記憶できるのがポイントです。ただし、同じ型のデータのみという制限があります。
異なる型の複数データを一括管理したい場合は、次回説明する「構造体」を使うのが良いです。
C言語での配列の扱い方
配列は変数の一種なので、使う場合には宣言が必要です。
宣言の際、変数名の後に要素数を指定することで配列として扱うことができるようになります。
「型、半角スペース、名前、[、要素数、]、セミコロン」という形になります。
配列内の個別のデータにアクセスする場合には、添え字というものを使用します。
添え字は、配列内のデータ位置を示すもので、0から始まります。
つまり、添え字は「0~要素数-1」の範囲でなければなりません。
※誤って添え字に負の値や要素数以上の値を使用すると、プログラムが誤動作する可能性があるので注意しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
int a[5]; int b; a[0] = 5; /* 添え字は「0」始まり */ a[1] = 4; a[2] = 3; a[3] = 2; a[4] = 1; /* 添え字は「要素数 - 1」まで */ b = a[2]; printf("%d, %d\n", a[2], b); |
添え字は、数値で指定する以外に、変数で指定することも可能です。
これにより、繰り返し処理との相性が非常に良くなります。
1 2 3 4 5 6 7 8 9 10 11 |
int a[5]; a[0] = 5; /* 添え字は「0」始まり */ a[1] = 4; a[2] = 3; a[3] = 2; a[4] = 1; /* 添え字は「要素数 - 1」まで */ for (int i = 0; i < 5; i++) { printf("%d\n", a[i]); } |
その他に覚えておきたいこと
配列の初期化方法
配列は、変数の一種のため、宣言時に初期化することもできます。
1 |
int a[5] = {1, 2, 3, 4, 5}; |
配列の要素数の求め方
配列の要素数を変更したのに、繰り返し回数を変更し忘れると不具合になってしまうことがあります。
このような不具合を防ぐ方法として、プログラム内で配列の要素数を求める場合があります。
配列の要素数を求めるには、以下のように記述します。
1 2 3 4 5 6 |
int num; num = sizeof(a) / sizeof(int); /* 配列全要素のサイズを1要素のサイズで割る */ for (int i = 0; i < num; i++) { printf("%d\n", a[i]); } |
文字列
配列の型は変数の型に使えるものと同じものが使用可能です。
つまり、文字型の配列を宣言することも可能です。
文字型の配列を使用すると、複数の文字を並べて使用することができるようになります。
複数の文字を並べたものは「文字列」と呼ばれ、主にコンソールへの出力などに使用されます。
第1回の「最小のプログラム」で紹介したprintf(“Hello, World!\n”);の“(ダブルクォート)で括られた部分も文字列です。
※変数と違ってダブルクォートで括られた固定の文字列のことは文字列リテラルと呼びます。
文字型の配列を初期化する際には、文字列リテラルを代入します。
文字列をprintf()で出力する際の書式は「%s」となります。
1 2 |
char str[] = "Hello, World!"; /* 要素数を省略することも可能です */ printf("%s\n", str); |
C言語では、文字列を操作するためのライブラリが用意されています。
文字列操作ライブラリを使用するには、「string.h」をincludeする必要があります。
1 2 3 4 5 6 7 8 9 10 |
char str[] = "Hello, World!"; char str2[32]; printf("%d\n", strlen(str)); /* strlen:文字列の長さを取得する */ strcpy(str2, str); /* strcpy:文字列をコピーする */ printf("%s\n", str2); strcat(str2, " This is Test."); /* strcat:文字列を連結する */ printf("%s\n", str2); |
文字列操作ライブラリには、以下のような関数があります。
詳しい使い方については、「関数」を学習してから、Googleなどで関数名を検索すると良いでしょう。
ライブラリ関数 | 機能 |
---|---|
strlen | 文字列の長さを取得する |
strcpy | 文字列をコピーする |
strcat | 文字列を連結する |
strcmp | 文字列を比較する |
strstr | 文字列を検索する |
また、文字列操作ライブラリを使用せずに配列内の文字を直接書き換えることも可能です。
文字を直接書き換える場合、文字列の終端に注意する必要があります。
文字列の終端には特殊な文字「’\0’」(ヌル文字)を使用します。
1 2 3 4 |
char str[] = "Hello, World!"; str[5] = '\0'; /* ',' を '\0'に書き換え */ printf("%s\n", str); /* '\0' の前までを表示 */ |
ヌル文字以外の特殊な文字としては、「’\n’」(改行)や、「’\t’」(タブ)があります。
まとめ
- 配列とは、同じ型のデータを連続で並べて使用したい場合に使う。
- 個別の要素に対しては「添え字」を使ってアクセスする(例:a[2])。
- 添え字は「0」から始まることに注意!(a[2]は、3番目のデータ)。
- 文字型を配列にすると「文字列」として扱うことが可能。専用のライブラリ関数もある。
コメント