1.目的
- 配列を使って、構造体の初期化を簡易化する。
目次
構造体の関連記事:
・C言語基礎知識7(構造体1) - Project_OKI’s diary
・C言語基礎知識17(構造体とポインタとアロー演算子の使い方) - Project_OKI’s diary
・C言語基礎知識26(構造体の配列) - Project_OKI’s diary
・C言語基礎知識27(構造体を複数の別ファイルで使用する) - Project_OKI’s diary
・C言語基礎知識28(構造体の中で構造体を宣言する) - Project_OKI’s diary
・C言語基礎知識39(構造体、typedefを使う際の注意点) - Project_OKI’s diary
※基本的な使い方は構造体と同じ為、他の使い方については構造体の記事を参照
2.構造体を使った配列の使い方
stract 構造体タグ名{ 構造体メンバ; };
//※初期値を設定する場合
構造体の型名 構造体配列名[1] = { {メンバ1初期値 , メンバ2初期値 , メンバ3初期値, ・・・} };
//※初期値が0の場合 構造体の型名 構造体配列名[1] = {0};
複数配列の場合
stract 構造体タグ名{ 構造体メンバ; }; 構造体の型名 構造体配列名[xx] = { {メンバ1初期値 , メンバ2初期値 , メンバ3初期値, ・・・}, {メンバ1初期値 , メンバ2初期値 , メンバ3初期値, ・・・}, ・・・ };
4.プログラムの作成(構造体と配列1)
#include <stdio.h> // 構造体の定義 typedef struct { int test1; int test2; int test3; } Gtest; int main(void) { // Gtest構造体の配列の宣言と初期化 //構造体と配列の差をつける為、通常の変数配列の外側に{}を付ける。 Gtest tes[1] = {{0, 0, 0}}; // test1, test2, test3 すべて0で初期化 // ポインタを使って構造体のメンバーにアクセス Gtest *ptest = &(tes[0]); printf("ptest->test1 = %d\n", ptest->test1); printf("ptest->test2 = %d\n", ptest->test2); printf("ptest->test3 = %d\n", ptest->test3); return 0; }
結果:https://paiza.io/projects/GSfQ-YFjYVFHwUOw4Hw7Cg?language=c
#include <stdio.h> //構造体 typedef struct { int test1; int test2; int test3; } Gtest; int main(void){ // Gtest構造体の配列を1つ用意し、test1, test2, test3を0で初期化 Gtest tes[1]={0}; //ポインタ宣言 Gtest *ptest = &(tes[0]); printf("ptest=%d\n",ptest->test1); printf("ptest=%d\n",ptest->test2); printf("ptest=%d\n",ptest->test3); }
結果: https://paiza.io/projects/M08SK94rw-fcaK4mThCI8w?language=c
5.プログラムの説明
・Gtest tes[1]={0};及びGtest tes[1] = {{0, 0, 0}};でtes配列を宣言し、初期値を0にする。
・Gtest tes[0].メンバ名の値を全て0に設定
・Gtest *ptest = &(tes[0]); で、ptestポインタを宣言
・これにより、通常は初期値を設定するのに、複数行書かなければいけないが、1行で書くことが可能
6.プログラムの作成(構造体と配列2:複数配列)
同じ構造体を複数用意する場合
#include <stdio.h> #define SETNUM 3 //構造体 typedef struct { int test1; int test2; int test3; } Gtest; //staticを使用し、起動時からファイル内グローバル変数。メイン関数に入る前に、呼ばれる。 static Gtest tes[SETNUM] = { { 0, 0, 0}, // 0 { 1, 2, 3}, // 1 { 4, 5, 6}, // 2 }; int main(void){ // Your code here! for(int i=0;i<SETNUM;i++){ //ポインタ宣言 Gtest *ptest = &(tes[i]); printf("ptest=%d\n",ptest->test1); printf("ptest=%d\n",ptest->test2); printf("ptest=%d\n",ptest->test3); } }
結果:https://paiza.io/projects/SCB36J1qz0wvZWXbVYhhhQ
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・C言語基礎知識6(関数) - Project_OKI’s diary
・C言語基礎知識7(構造体1) - Project_OKI’s diary
・C言語基礎知識8(enum:列挙型) - Project_OKI’s diary
・C言語基礎知識9(typedef) - Project_OKI’s diary