C言語学習(4):構造体とポインタ

2263 ワード

前言:
構造体は、プログラマがデータ成分を1つに集約できるカスタムデータ型です.名前、年齢、性別、学年などの情報を含むstudent構造体を定義します.
本文:
1、構造体の定義は以下の2種類がある.
struct Student  //   
{
	const char* name;
	int age;
};

typedef struct Student //   
{
	const char* name;
	int age;
} STU;

この2つの違いは何ですか?実は定義するときは何の違いもありませんが、以下で構造体変数を初期化するときに違いがあります.
2、構造体変数の初期化
struct Student stu1; //         ,  :C   ,   struct Student            
STU stu1;            //         ,          
Student stu1;        //C++ , struct     

3、構造体配列
typedef struct Student
{
	const char* name;
	int age;
} STU;

int main()
{
	STU stu[3];
	stu[0].name = "xiaoming";  //       “.”    
	stu[0].age = 20;

	stu[1].name = "xiaohong";
	stu[1].age = 21;

	stu[2].name = "xiaohua";
	stu[2].age = 22;

	for (size_t i = 0; i < 3; i++)
	{
		std::cout << stu[i].name << ":" << stu[i].age << std::endl;
	}
    
}

4、構造体ポインタ
typedef struct Student
{
	const char* name;
	int age;
} STU;

int main()
{
	STU stu[3], *pStu;
	pStu = stu; //       

	pStu->name = "xiaoming"; //       “->”   
	pStu->age = 20;

	(pStu + 1)->name = "xiaohong";
	(pStu + 1)->age = 21;

	(pStu + 2)->name = "xiaohua";
	(pStu + 2)->age = 22;

	for (size_t i = 0; i < 3; i++)
	{
		std::cout << (pStu + i)->name << ":" << (pStu + i)->age << std::endl;
	}

}

5、構造体ポインタを関数とするパラメータ
typedef struct Student
{
	const char* name;
	int age;
} STU;

int getEvalAge(const int stuNum, STU* pStu);

int main()
{
	const int stuNum = 3;
	STU stu[stuNum];
	STU* pStu;
	pStu = stu; //       

	pStu->name = "xiaoming";
	pStu->age = 20;

	(pStu + 1)->name = "xiaohong";
	(pStu + 1)->age = 21;

	(pStu + 2)->name = "xiaohua";
	(pStu + 2)->age = 22;

	int evalAge = getEvalAge(stuNum, pStu);
	std::cout << evalAge << std::endl;
}

int getEvalAge(const int stuNum, STU* pStu)  //           
{
	int totalAge = 0;
	for (size_t i = 0; i < stuNum; i++)
	{
		totalAge += (pStu + i)->age;
	}
	return totalAge / stuNum;
}

まとめ
C言語の開発には構造体を用いるところが多い.