结构体初阶

本文详细介绍了C语言中的结构体,包括结构体的声明、定义、成员访问以及结构体在函数参数传递中的应用。通过实例展示了如何声明和定义包含不同类型数据的结构体,以及如何通过指针访问结构体成员。同时,还讨论了结构体的嵌套使用和传址效率问题,适合C语言初学者学习。
摘要由CSDN通过智能技术生成

1.什么是结构体?

   结构体是由一系列具有相同或不同类型的数据构成的数据集合。由于生活中的事物信息是复杂的,比如我们定义一个学生,需要知道ta的姓名,年龄,学号等等,结构体恰好能解决这个问题。

2.结构体的声明

//结构体的声明
//结构体关键字(struct)+结构体标签+花括号{ 成员数据类型+成员名  };
struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

};

//结构体关键字-struct     结构体标签-student    结构体类型-struct student


  另一种声明方式

typedef struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

}stu;


//在原结构体类型前加typedef,在花括号与最后一个分号之间加上你想要的结构体类型缩写
//这种声明相当于重置结构体类型的名称并且通常有简化作用

  声明的注意:

👍
//声明的注意:
1.结构体的声明在使用之前
2.在任何函数之外声明的结构体作用于整个程序
3.在函数内部声明的结构体只能作用于这个函数内部

3.结构体的定义

   结构体的定义不少于1种,这里只讲最标准的一种

struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

};



int main()
{

	struct student s1 = { "张三", 18, "19990722" };
	//结构体类型+结构体变量名+=+花括号{   各成员数据  };
	//各成员数据之间用,隔开
	//结构体定义各成员数据的顺序应与声明时一致


	return 0;
}

或者

struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

}stu;



int main()
{

	stu s1 = { "张三", 18, "19990722" };
	//结构体类型+结构体变量名+=+花括号{   各成员数据  };
	//各成员数据之间用,隔开
	//结构体定义各成员数据的顺序应与声明时一致


	return 0;
}
结构体变量=结构体类型+变量名
  stu s1 =  stu    +   s1
类比以下
 整形变量=整数类型+变量名
    int a=  int +   a

4.结构体成员的访问

struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

};

int main()
{

	struct student stu = { "张三", 18, "19990722" };
	printf("%s %d %s", stu.name, stu.age, stu.id);
	//结构体变量名.成员名
	//相当于打印字符串,整形数据,字符串

	return 0;
}
利用指针访问结构体变量
typedef struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

}stu;

int main()
{
	 stu s1= { "张三", 18, "19990722" };
	 stu*ps = &s1;
	 //定义了一个所指向类型为结构体类型的指针ps
	 printf("%s %d %s", ps->name, ps->age, ps->name);
	 //指针加->成员名即可
     //ps->name相当于利用指针访问结构体中的name数据
	return 0;
}

5.结构体的嵌套使用

typedef struct more_information
{
	char hobby[20];
	char favorite_food[10];

}mi;

typedef struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号
	mi m1;
	//stu内部有结构体时,应写上此结构体类型加上结构体变量名
}stu;

int main()
{
	
	stu s1 = { "张三", 18, "19990722", { "篮球", "牛肉" } };
	printf("%s %d %s %s %s", s1.name, s1.age, s1.id, s1.m1.hobby, s1.m1.favorite_food);
	//访问结构体中的结构体的数据时用   一级结构体变量1名.二级结构体变量名.成员名
	//三级依次类推
	stu*ps = &s1;
	printf("\n");
	printf("%s %d %s %s %s",ps->name, ps->age, ps->id, ps->m1.hobby, ps->m1.favorite_food);
	//用一级结构体的指针访问其内容中的二级结构体加 . 成员名
	return 0;
}

6.结构体传址


typedef struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

}stu;

void print(stu tmp)
//由于形参tmp只是实参的一份临时拷贝
//所以在传参时,系统要额外为形参开辟空间
//如果实参特别大,这样会降低程序运行效率
{
	printf("%s\n", tmp.name);
	printf("%d\n", tmp.age);
	printf("%s\n", tmp.id);
}

int main()
{
	stu s1 = { "张三", 18, "19990722" };
    //stu*ps = &s1;
	print(s1);

	return 0;
}
typedef struct student
{
	char name[10];//声明姓名
	int age;//声明年龄
	char id[20];//声明学号

}stu;

void print(stu*ps)
//这里将结构体s1的地址传给print,由于地址只占四个字节,所以可以节省空间,提高效率
{
	printf("%s\n", ps->name);
	printf("%d\n", ps->age);
	printf("%s\n", ps->id);
}


int main()
{
	stu s1 = { "张三", 18, "19990722" };
    stu*ps = &s1;
	print(ps);


	return 0;
}
虽然两个程序个结果相同,但是很明显结构体传址的效率更高

7.说明

此博客出自c语言初学者之手,自然适合初学者阅读,若有不妥之处,恭请大家指正!另外,希望大家帮忙点赞,你们的善举将是我学习最大的动力。同时也祝各位学习进步!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值