上記の宣言によって、 3つ分の int 型のデータを格納する領域がコンピュータのメモリ上に 連続して確保され、その先頭に marks という配列変数名が付きます。int marks[3]; /* 3人分の点数データ */
この配列変数の要素の一つを指定するときは、 [ ] に番号(整数)を書きます。 これを添字と呼びます。 添字は確保された領域の先頭の位置からのオフセット(変位)です。
この宣言により marks[0], marks[1], marks[2] という
3つの int 型変数が使用できるようになります。
なお、marks[3] は含まれないので注意してください。
添字には整数型の変数や式を使うこともできます。marks[0] = 10; marks[1] = 24; marks[2] = 42; printf("合計点 = %d\n", marks[0] + marks[1] + marks[2]);
i = 1; printf("%d,%d,%d\n", marks[i], marks[i+1], marks[i-1]);
多次元配列
表形式のデータなどを処理するのに便利なように、
二次元の配列も使うことができます。
これは次のようにして宣言します。
これは以下のように3×3=9個の要素を持つ配列を宣言します。int table[3][3]; /* 2次元配列 */
コンピュータの記憶空間(メモリ)は、 実際には一次元配列の構造をしているので、 2次元以上の配列の領域は 右図のように一次元に展開して確保されます。
table[0][0] table[0][1] table[0][2] table[1][0] table[1][1] table[1][2] table[2][0] table[2][1] table[2][2]
この図を見て分かるとおり、 この配列は3つの int 型の要素を持つ配列を、 3組用意したものになります。
同様にして、三次元の配列は次のようにして宣言します。
この配列は4×3×2=24個の要素を持つ配列を宣言します。 これは2個の要素を持つ int 型の配列3組をひとまとめにして、 それを更に4組用意します。 このようにして、さらに次元の高いの配列を宣言することもできます。int volume[4][3][2]; /* 3次元配列 */
char name[4]; name[0] = 'K'; name[1] = 'e'; name[2] = 'n'; name[3] = '\0';
引数として(個々の要素ではなく)配列変数全体を用いるときは、 配列変数名(この場合 name)だけを指定します。 書式文字列中の変換指定子 %s が name の内容に置き換わります。printf("He is %s\n", name);
printf は書式文字列中に変換指定子 %s があると、 それに対応する変数を文字列とみなし、 その最初の要素から '\0' が見つかるまで1文字ずつ順番に出力していきます。 もし配列変数 name の最後の要素が '\0' でなければ、 printf は文字列の最後が見つけられないため、 暴走してしまいます。
"…" で挟まれたものは、文字列定数と呼びます。
"Ken" は前述の配列変数 name と同様、 'K', 'e', 'n', '\0' の4つの要素からなる配列です。 見てわかるとおり、 printf の書式文字列 "He is %s\n" も文字列です。 従って、次のようなこともできます。printf("He is %s\n", "Ken");
char format[10]; format[0] = 'H'; format[1] = 'e'; format[2] = ' '; format[3] = 'i'; format[4] = 's'; format[5] = ' '; format[6] = '%'; format[7] = 's'; format[8] = '\n'; format[9] = '\0'; printf(format, "Ken");
文字列定数や配列変数に格納された文字列を全部配列変数にコピーするには、 strcpy などのライブラリ関数を使用します。char name[4]; name = "Ken"; /* × これはエラー */
strcpy(s1, s2)
この結果 name には "Hazuki Riona" という文字列が入るため、 name は char name[13以上]; として宣言されている必要があります。strcpy(name, "Hazuki "); strcat(name, "Riona");
この結果、length は3になります。int length; length = strlen("Ken");
strcmp("abc", "def") < 0 strcmp("ghi", "def") > 0
#include <string.h>