構造体(struct)

構造体

 構造体の型定義

 構造体データの定義

    struct 構造体タグ名 構造体名;
    
      struct	data	mydata;
      
  • typedefしてあれば、
    新しい型名 構造体名;
    
      DATA	mydata;
      
  • または、型定義と同時に、
    struct	構造体タグ名
    {
    	メンバの型 メンバ名
    	…
    } 構造体名;
    
      struct	data
      {
      	char	name[20];
      	int	age;
      	float	weight;
      	float	height;
      } mydata;
      
  • この際は構造体タグ名(data)は無くても良い

 構造体データの初期化

    struct 構造体タグ名 構造体名 = { メンバ1, メンバ2,,, };
    
      struct	data	mydata = { "Deguchi", 40, 85.0, 170.0 };
      
  • typedefしてあれば、
    新しい型名 構造体名 = { メンバ1, メンバ2,,, };
    
      DATA	mydata = { "Deguchi", 40, 85.0, 170.0 };
      
  • または、型定義と同時に、
    struct	構造体タグ名
    {
    	メンバの型 メンバ名
    	…
    } 構造体名 = { メンバ1, メンバ2,,, };
    
      struct	data
      {
      	char	name[20];
      	int	age;
      	float	weight;
      	float	height;
      } mydata = { "Deguchi", 40, 85.0, 170.0 };
      
  • この際は構造体タグ名(data)は無くても良い

 構造体メンバの参照

    構造体名.メンバ名
    構造体へのポインタ->メンバ名
    
      struct	data	newdata;
      struct	data	*p, *q;
      
      mydata.age = 41;
      p = &mydata;
      p->weight = 86;
      
      strcpy( newdata.name, mydata.name);
      q = &newdata;
      q->height = p->height;
      

 構造体の代入

  • 構造体の代入は全メンバーがコピーされる
    typedef	struct	data
    	{
    		char	name[20];
    		int	age;
    		float	weight;
    		float	height;
    	} DATA;
    DATA	mydata = { "Deguchi", 40, 85.0, 170.0 };
    DATA	newdata;
    
    newdata = mydata;
 

構造体を関数に渡してみよう

/* 構造体のメンバを表示する関数1 */
#include <stdio.h>
#include <string.h>

typedef	struct	data
	{
		char	name[20];
		int	age;
		float	weight;
		float	height;
	} DATA, *Data;
/*
	DATA は struct data 型
	Data は struct data 型へのポインタ
*/

/* void prdata( struct data d ) と書いても良いが... */
void prdata( DATA d )
{
	printf("名前 = %s\n", d.name );
	printf("年齢 = %d\n", d.age );
	printf("体重 = %3.1f\n", d.weight );
	printf("身長 = %3.1f\n", d.height );
        printf("---------------\n");
}

main()
{
	DATA	mydata = { "Deguchi", 40, 85.0, 170.0 };

	prdata( mydata );
}
/* end of struct1.c */
/* 構造体のメンバを表示する関数2 */
#include <stdio.h>
#include <string.h>

typedef struct data
	{
		char	name[20];
		int	age;
		float	weight;
		float	height;
	} DATA, *Data;
/*
	DATA は struct data 型
	Data は struct data 型へのポインタ
*/

/* void prdata( struct data *dp ) と書いても良いが... */
void prdata( Data dp )
{
	printf("名前 = %s\n", dp->name );
	printf("年齢 = %d\n", dp->age );
	printf("体重 = %3.1f\n", dp->weight );
	printf("身長 = %3.1f\n", dp->height );
        printf("---------------\n");
}

main()
{
	DATA	mydata = { "Deguchi", 40, 85.0, 170.0 };

	prdata( &mydata );
}
/* end of struct2.c */
  1. 初期化を使わずに、個々のメンバ値を設定してみよう!
    (以下のようにmainを書き換える!!)
main()
{
	DATA	mydata;

	/* 個々のメンバを設定する */
	mydata.name = "Deguchi"; /* これは駄目! */

	prdata( &mydata );
}
/* end of struct3.c */

構造体の配列を使ってみよう

/* 構造体の配列 */
#include <stdio.h>
#include <string.h>

typedef	struct	data
	{
		char	name[20];
		int	age;
		float	weight;
		float	height;
	} DATA, *Data;
/*
	DATA は struct data 型
	Data は struct data 型へのポインタ
*/

void prdata( Data dp )
{
	printf("名前 = %s\n", dp->name );
	printf("年齢 = %d\n", dp->age );
	printf("体重 = %3.1f\n", dp->weight );
	printf("身長 = %3.1f\n", dp->height );
        printf("---------------\n");
}

main()
{
	/* 構造体の配列の初期化 */
	DATA	ourdata[4] =
			{
				{ "山田太郎", 18, 80.0, 170.0 },
				{ "鈴木健史", 17, 75.0, 175.0 },
				{ "佐藤博司", 19, 90.0, 180.0 },
				{ "", 0, 0, 0 }
			};
	int	datanum = 3;
	int	i;
	
	for( i = 0; i < datanum; i++ )
		prdata( &ourdata[i] );
}
/* end of structa.c */
  1. データの個数(datanum)を使わないで、
    データの名前が空(NULL文字列)であることが
    データの終わりを表すことを利用する版に書き換えよう!