C言語の配列の使い方の学習
1.目的
- C言語で配列が使えるようになる。
目次
2.配列とは
同じデータ型の数値や文字列を1つの変数にまとめたもの。
書き方:
型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・};
3.プログラムの作成
配列を使って、配列に格納した数値を表示する。
#include <stdio.h> int main(void){ // Your code here! //配列の使い方 //宣言と初期化方法 //型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・}; //変数宣言 int i; //ループ用変数 int a[5] = {1,2,3}; //配列の宣言と初期化処理 //配列の要素数よりも少ない場合、残りにはすべて0が代入される。 for(i=0;i<5;i++){ //5回ループ printf("a[%d]=%d\n",i,a[i]); //aの配列の値を出力 } #if 0 //配列は宣言の時以外で、1度に複数の値を代入することはできない。 //下記bを有効にすると、エラーになる。 int b[3]; b[3] = {1,2,3} #endif //宣言の時の要素数の省略 int c[]={4,5,6}; //宣言の時に要素数を省略できる。 for(i=0;i<=2;i++){ //3回ループ printf("c[%d]=%d\n",i,c[i]); //aの配列の値を出力 } }
結果:https://paiza.io/projects/S695zS_FukH1xz6NXPMGQQ?language=c
4.プログラム説明
(1) int a[5] = {1,2,3};
aという変数の配列をint型で宣言している。
1,2,3を初期値として、a[0],a[1],a[2]に代入している。
a[3],a[4]は、0の値が入る。
配列では、最初の宣言の時にのみ、複数の値を設定できる。
そのため、下記書き方はできないので注意する。
a[5] = {1,2,3}
(2) for(i=0;i<5;i++){ }部分
forの繰り返しで、iを0から5まで繰り返す。
配列の要素をiにすることによって、a[0]~a[4]の数値を呼び出している。
(3) #if 0
コメントのように、処理を動作しないようにしている。
上記プログラムでは、#if から#endifまでは、処理が反映されないようになっている。
#if 0を#if 1にすると、処理が反映されるようになる。
コメントだと/* */を使う場合、/* /* コメント*/ */ のような使い方ができない。
また、0と1を変えるだけで、処理のON/OFFが出来るので、便利。
(4) int c[]={4,5,6};
これも、配列の宣言と初期化をしている。
要素数を省略することができる。
ただ、a[5]のように、c[3],c[4]には、0は入らない。
5.プログラム作成2(配列の要素数の求め方)
配列の要素数の求め方
#include <stdio.h> int main(void){ // Your code here! //要素数を求める。 //変数の宣言 int a[] = {7,8,9}; //配列を宣言 int i; //ループ用変数 //sizeof:データ型の大きさを求める単項の演算子 int b = sizeof(a); //配列a(全ての合計)のデータの大きさを求める。 int c = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。 int d = b/c; //配列の要素数を求める。 //int は4byte printf("配列a(全ての合計)のデータの大きさ:%d\n",b); printf("配列1個当たり(a[0])のデータの大きさ:%d\n",c); printf("配列aの要素数:%d個\n",d); for(i=0;i<d;i++){ //要素数の数だけループする。 printf("a[%d]=%d\n",i,a[i]); //配列aの値を列挙する。 } }
実行結果:https://paiza.io/projects/9_CqzTWx_0MlYAB8XeI0pg?language=c
参考:
6.プログラム作成(2重配列)
#include <stdio.h> int main(void){ // Your code here! //変数の宣言 int i,j; //宣言方法: 型 変数名[要素数1][要素数2] = {"要素1","要素2",・・・} //文字列の場合 char a[3][5] = {"12345","TEST2","TEST3"}; char b[3][7] = {"12345","TEST2","TEST3"}; //宣言方法: 型 変数名[要素数1][要素数2] = {{要素1_1,要素1_2,・・・},{要素2_1,要素2_2・・・},・・・} //数値の場合 int c[2][4] = {{1,2,3,4},{5,6,7,8}}; //sizeof:データ型の大きさを求める単項の演算子 int size_a = sizeof(a); //配列a(全ての合計)のデータの大きさを求める。 int size_a0 = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。 int size_num = size_a/size_a0; //配列の要素数を求める。 printf("配列a(全ての合計)のデータの大きさ:%d\n",size_a); printf("配列1個当たり(a[0])のデータの大きさ:%d\n",size_a0); printf("配列aの要素数:%d個\n",size_num); size_a = sizeof(b); //配列b(全ての合計)のデータの大きさを求める。 size_a0 = sizeof(b[0]); //配列1個当たり(b[0])のデータの大きさを求める。 size_num = size_a/size_a0; //配列の要素数を求める。 printf("配列b(全ての合計)のデータの大きさ:%d\n",size_a); printf("配列1個当たり(b[0])のデータの大きさ:%d\n",size_a0); printf("配列bの要素数:%d個\n",size_num); for(i=0;i<3;i++){ //文字列(char型配列)の末尾には、NULL文字'\0'があるため、データの大きさが5だと足りていない。 printf("a[%d]=%s\n",i,a[i]); //配列aの値を出力 //printf("a[%d]=%s\n",i,a[i][0]); //これはエラー printf("b[%d]=%s\n",i,b[i]); //配列bの値を出力 #if 1 //printfが見にくかったら0に変更 for(j=0;j<6;j++){ printf("a[%d][%d]=%c\n",i,j,a[i][j]); //配列aの[i][1]番目の文字を出力 printf("b[%d][%d]=%c\n",i,j,b[i][j]); //配列aの[i][1]番目の文字を出力 //printf("a[%d][%d]=%c\n",i,j,a[i][5]); //配列aの[i][1]番目の文字を出力 } #endif } //printf("c=%d\n",c); //これはエラー printf("c=%d\n\n",c[0][0]); //[0][0]の場所:1を出力 for(i=0;i<2;i++){ for(j=0;j<4;j++){ printf("c[%d][%d]=%d\n",i,j,c[i][j]); //cの値を出力 } } }
実行結果:https://paiza.io/projects/f0YxurQ76fThDCkR4ILWmA?language=c
7.プログラム作成(2重配列の確認、要素の省略)
#include <stdio.h> int main(void){ // Your code here! //要素数を求める。 //変数の宣言 //char a[] = "TEST"; //配列を宣言 1次元確認用 // char a[][] = {"TEST1","TEST2","TEST3"}; //これはエラーになる。 char a[][5] = {"TEST1","TEST2","TEST3"}; char b[][6] = {"TEST1","TEST2","TEST3"}; //sizeof:データ型の大きさを求める単項の演算子 int size_a = sizeof(a); //配列a(全ての合計)のデータの大きさを求める。 int size_a0 = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。 int size_num = size_a/size_a0; //配列の要素数を求める。 printf("配列a(全ての合計)のデータの大きさ:%d\n",size_a); printf("配列1個当たり(a[0])のデータの大きさ:%d\n",size_a0); printf("配列aの要素数:%d個\n",size_num); size_a = sizeof(b); //配列b(全ての合計)のデータの大きさを求める。 size_a0 = sizeof(b[0]); //配列1個当たり(a[0])のデータの大きさを求める。 size_num = size_a/size_a0; //配列の要素数を求める。 printf("配列b(全ての合計)のデータの大きさ:%d\n",size_a); printf("配列1個当たり(b[0])のデータの大きさ:%d\n",size_a0); printf("配列bの要素数:%d個\n",size_num); printf("a=%s\n",a); //配列aの値を出力 printf("b=%s\n",b); //配列bの値を出力 // printf("x=%s",x); }
実行結果:https://paiza.io/projects/nIsKPefvDhHnHdWxd4E18Q?language=c
参考:
【C言語】配列を引数として渡すことの考察(2次元配列まで) - Qiita
8.プログラム作成(関数で要素数を算出する(できない))
要素数を関数で求める場合、
引数の型のバイト数が要素数として返ってきてしまうため、
通常の関数を作成する方法では、要素数を求めることはできない。
#include <stdio.h> //要素数を求めるプログラム void Elm1(int *num); int main(void){ // Your code here! //変数の宣言 int a[] = {2,4,5,6}; //sizeof:データ型の大きさを求める単項の演算子 int b = sizeof(a); //配列a(全ての合計)のデータの大きさを求める。 int c = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。 int d = b/c; //配列の要素数を求める。 //要素数を求める。 Elm1(a); //関数を使用して要素数を算出(したいが・・・) printf("配列aの要素数:%d個\n",d); } //要素数を求める関数 void Elm1(int *num){ int numsizeall; int numsizeone; int numelm; numsizeall = sizeof(num); numsizeone = sizeof(num[0]); numelm = numsizeall/numsizeone; printf("配列aの要素数(Elm1):%d個\n",numelm); }
実行結果:https://paiza.io/projects/NBxuj8E29KLOfQlZJEvtrQ?language=c
9.プログラム作成(関数の引数に配列を使用する)
※配列の要素は、関数で求めることはできないが。
配列を関数に渡すことは、ポインタを使用すれば出来る。
配列を引数として、関数に渡して、その値を確認するプログラム。
#include <stdio.h> void Elm1(int *num); int main(void){ // Your code here! //要素数を求める。 //変数の宣言 //char a[] = "TEST"; //配列を宣言 int a[] = {2,4,5}; Elm1(a); #if 1 //sizeof:データ型の大きさを求める単項の演算子 int b = sizeof(a); //配列a(全ての合計)のデータの大きさを求める。 int c = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。 int d = b/c; //配列の要素数を求める。 printf("\n"); //改行 printf("配列a(全ての合計)のデータの大きさ:%d\n",b); printf("配列1個当たり(a[0])のデータの大きさ:%d\n",c); printf("配列aの要素数:%d個\n",d); //printf("a=%s\n",a); //配列aの値を列挙する。 #endif } //要素数を求める関数 void Elm1(int *num){ int numsizeall; int numsizeone; int numelm; numsizeall = sizeof(num); numsizeone = sizeof(num[0]); numelm = numsizeall/numsizeone; printf("関数Elm1の出力:num[0]=%d\n",num[0]); //配列aの値を列挙する。 printf("関数Elm1の出力:num[1]=%d\n",num[1]); //配列aの値を列挙する printf("関数Elm1の出力:num[2]=%d\n",num[2]); //配列aの値を列挙する printf("配列a(全ての合計)のデータの大きさ:%d\n",numsizeall); printf("配列1個当たり(a[0])のデータの大きさ:%d\n",numsizeone); printf("配列aの要素数:%d個\n",numelm); }
実行結果:https://paiza.io/projects/QEwq7WOqq85QlhQxLohTRw?language=c
参考:配列の要素数を求める | Programming Place Plus C言語編 逆引き
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・C言語基礎知識4(if文) - Project_OKI’s diary
・C言語基礎知識5(switch文) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・組み込みC言語基礎知識6(関数) - Project_OKI’s diary
・組み込みC言語基礎知識7(構造体1) - Project_OKI’s diary
参考