型 変数名 [個数];「型」はCの変数型名,「変数名」は配列の名前,「個数」は配列の要素の数を示す.例えば,1クラス最大80名の学生のテストの点数を示す配列を宣言するなら以下の様にするだろう.
int result_of_a_test [80];または,正の整数だけ扱えればよく,最小のメモリ消費に抑えたければ,以下の様にする.
unsigned char result_of_a_test[80]; // 0-255までの値を80個扱える配列配列の要素にアクセスするには,要素の番号を使って,配列に添字(index)をつける. 配列の一番最初の要素にアクセスするには,
result_of_a_test[0] = 100; // 配列の先頭の要素に100を代入とする.
result_of_a_test[79] = 100; // 配列の最後の要素に100を代入のように,indexが79となる.
int a[5];
for(int i=0; i<5; i++)
a[i] = 'A'+i;
が実行されると,メモリ配置は,
[要素番号]
は,実は「演算子」であり,その意味するところは,
a[3]
は,ポインタを用いて,
*(a+3)
と書くことができる.ここで,aは配列名であり,配列の先頭アドレスを示し,+3はオフセット,すなわち (a+3)は先頭から3要素分離れた場所にある要素へのアドレス(参照)を示す.その前についている *(asterisk)
は,参照の中身を示す演算子(ポインタ)であり,上のテーブルの場合,
*(a+3) == 'D'
である.このように配列とポインタは互換性がある.![]()
【ヒント】配列表記との違いに気をつけよう
#include <stdio.h>
int main(void)
{
int x[10];
for(int i=0; i<100; i++){
x[i] = i*i;
printf("x[%d]=%d\n", i, x[i]);
}
}
【ヒント】ソースコード中に直接「数字」を書いてはいけない!
int a[10], b[10];
b = a; // エラー.a, b共にラベルであって,変数ではない.
b[9] = a[9]; // 最後の要素一つがコピーされるだけ.
要素一つ一つをコピーする関数を作る.
void copy_array(int b[], int a[], int n){
for(int i=0; i<n; i++)
b[i] = a[i];
}
int main(void){
int a[100], b[100];
copy_array(b,a,100); // copy a to b
}
あるいは,バイナリコピー関数を利用してコピーする.
#include <string.h>
int main(void){
int a[100], b[100];
bcopy(a,b,sizeof(int)*100); // copy a to b
}
* C++では,定義次第では,代入によって多くのオブジェクトを一気にコピーする機能を作ることもできる.
* 半角文字の場合はASCIIコード.全角文字の場合は多くのコード体系が混在している.これが文字化けの起こる理由である.ここでは半角のみ取り扱う.
char* str = "Meiji University";
のようにダブルコーテーションで括って書く.ダブルコーテーションで括られた
char s[20]; // 最低でも17文字以上必要
strcpy(s,"Meiji University"); // char型の配列sに文字列17文字分をコピー
char* strcpy(char* destination, const char* source);
char* strcat(char* destination, const char* source);
int strcmp(const char* s1, const char* s2);
int strlen(const char* s);
int a[3][4];
と宣言する.

const int M = 3;
const int N = 4;
int a2[M][N];
int* a1 = a2[0]; // 先頭アドレスをあわせる.ポインタを使用
x = a1[N*i+j]; // == a2[i][j] とおなじ
int a3[10][3][4];
これは,3x4の2次元配列が10セット,3次元的にレイヤになっていると考えるとわかりやすい.
int array1[] = { 1, 2, 3, 4, 5 };
この時,[]の中身を書かなくても良い.サイズはコンパイラが自動的に決定してくれる.これは次の文字列の初期化に利用するとメリットが実感できるだろう.
char str[] = "mojisuu wo kazoenakutemo yoi!";
後で文字列を変更した時にも,文字数をわざわざ数える必要がない.
int array2[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};
int main(void)
{
char str[100];
input(str); // キーボードから入力された文字列をstrに移します.
disp(str); // strに格納された文字列を画面に表示します.
printf("文字数は %d です.\n", count(str));
return 0;
}

【ヒント】引数の (char* str) は,(char str[ ]) とほぼ同じ意味で,どちらでも使えます.
//実行例 > 07-2 Type a string: ababccc a: 2 b: 2 c: 3

【ヒント】上の解答例では,ループのスタート文字を'A'にしてしまっていますが, これだと一部の文字や記号しかスキャンされません.たとえばスペース' '(==0x20)から始めて, ティルダ'~' (==0x7E)までスキャンすると,ほぼすべての文字をカウントできます. アスキーコード表をよく見て考えてみましょう.



> 07-5
>> abc
abc
>> 123
abc 123
>> pqr
abc 123 pqr
>> end
abc 123 pqr
rqp 321 cba

14 if(!strcmp("end",word)){
15 int len = strlen(str)-1;
16 str[(len<0 ? 0 : len)] = 0; // 0以下にならないようにする
17 break;
18 }
作成したプログラムを