Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識41(構造体と配列)

テーマ

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

 

関連記事

過去の記事:

知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - 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

C言語基礎知識10(extern宣言) - Project_OKI’s diary

C言語基礎知識11(#define) - Project_OKI’s diary

 

組み込みC言語