c学习笔记:结构体(结构体数组、结构体嵌套结构体、结构体指针变量、堆区的结构体数组、共用体)

目录

知识点1【结构体】

知识点2【结构体数组】

知识点3【结构体嵌套结构体】

知识点4【结构体指针变量】

知识点5【堆区的结构体数组】

知识点6【结构体指针变量作为函数参数】

知识点7【结构体数组名作为函数的参数】

知识点8【指针变量作为函数的成员】

知识点9【const修饰结构体指针变量】

知识点10【共用体】


 

知识点1【结构体】

结构体中的成员空间是独立的
3种方式定义:

 

知识点2【结构体数组】

struct stu
{
	int num;
	char name[16];
	int age;
};

void test()
{
	struct stu arr[5] = { {10,"lucy",18},{11,"bob",20},{12,"tom",20} };
	int n = sizeof(arr) / sizeof(arr[0]);
	for (size_t i = 0; i < n; i++)
	{
		printf("%d %s %d\n", arr[i].num, arr[i].name, arr[i].age);
	}
}

 

知识点3【结构体嵌套结构体】

 

知识点4【结构体指针变量】

struct stu
{
	int num;
	char name[16];
	float age;
};

void test()
{
	struct stu lucy = { 100,"lucy",99.9f };
	struct stu *p = NULL;
	p = &lucy;
	printf("num=%d, name=%s age=%f\n", lucy.num, lucy.name, lucy.age);
	printf("num=%d, name=%s age=%f\n", (*p).num,(*p).name,(*p).age);
	printf("num=%d, name=%s age=%f\n", p->num, p->name, p->age);
	printf("num=%d, name=%s age=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->age);
}

 

知识点5【堆区的结构体数组】

struct stu
{
	int num;
	char name[16];
	float score;
};

void test()
{
	int n = 0;
	printf("请输入学生的个数:");
	scanf("%d", &n);

	//根据学生个数申请空间
	struct stu *arr = NULL;
	arr = (struct stu *)malloc(n * sizeof(struct stu));
	memset(arr, 0, n * sizeof(struct stu));

	//结构体成员赋值
	for (size_t i = 0; i < n; i++)
	{
		printf("请输入第%d学生的信息:", i + 1);
		scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score);
		//scanf("%d %s %f", &(*(arr + i)).num, (*(arr + i)).name, &(*(arr + i)).score);
		//scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, (arr+i)->score);
	}

	for (size_t i = 0; i < n; i++)
	{
		printf("num=%d, name=%s, score=%f\n", (arr+i)->num,(arr+i)->name,(arr+i)->score);
	}
	if (arr != NULL)
	{
		free(arr);
		arr = NULL;
	}
}

 

知识点6【结构体指针变量作为函数参数】

改变结构体的值

 

知识点7【结构体数组名作为函数的参数】
 

struct stu
{
	int num;
	char name[16];
	float score;
};

void myinputstuarray(struct stu *arr, int n)
//void myInputStuArray(struct stu arr[5], int n)
//void myInputStuArray(struct stu arr[], int n)
{
	printf("请输入%d个学生的信息:\n", n);
	for (size_t i = 0; i < n; i++)
	{
		scanf("%d %s %f", &(arr + i)->num, (arr + i)->name, &(arr + i)->score);
	}
}

void myprintstuarray(struct stu *arr, int n)
{
	printf("---------------------------\n");
	for (size_t i = 0; i < n; i++)
	{
		printf("num=%d,name=%s,score=%f\n", (arr + i)->num, (arr + i)->name, (arr + i)->score);
		//printf("num=%d, name=%s, score=%f\n", arr[i].num, arr[i].name, arr[i].score);
	}
}
void test()
{
	struct stu edu[5];
	menset(edu, 0, sizeof(edu));
	int n = sizeof(edu) / sizeof(edu[0]);
	myinptstuarray(edu, n);
	myprintstuarray(edu, n);

}

 

知识点8【指针变量作为函数的成员】

知识点9【const修饰结构体指针变量】

 void test04()
 {
 struct stu lucy = { 10, "lucy", 20 };
struct stu bob = {20, "bob", 21};

//const在*的左边:(*p只读 p可读可写)(不能通过p对结构体成员写操作 p可以指向其他结构体的地址)
const struct stu * p = &lucy;
//p->num = 100;//err
//(*p).num = 100;//err
p = &bob;

//const 在*的右边:(*p1可读可写 p1只读)(可以通过p1对结构体成员写操作 p1不可以指向其他结构体的地
址)
struct stu * const p1 = &lucy;
p1->num = 100;
(*p1).num = 100;
printf("num = %d\n", p1->num);
//p1 = &bob;//err

//const在*的左右两边(*p2只读 p2只读)(不能通过p2对结构体成员写操作 p2不可以指向其他结构体的地址)
const struct stu * const p2 = &lucy;
//p2->num = 200;//err
//p2 = &bob;//err
 }

知识点10【共用体】

结构体:成员拥有独立的空间 共用体:成员共享同一块空间

案例:共用体中的成员虽然公用同一段空间 但是 成员能使用空间的大小由成员自身类型决定。

原理分析:

案例2:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章