结构体概述
将多种数据结构封装在一起 形成新的结构胶结构体 每种数据结构 都有自己独立的空间。
结构体的关键字struct.
1、结构体 类型的定义方式
#include <stdio.h>
#include <string.h>
//定义结构体类型 系统是不分配空间
struct stu
{
//定义类型是 不要给成员赋值
//int num = 10; //是错误的
int num;
char name[32];
}; //必须有分号
void test01()
{
struct stu luck;
//访问结构体成员 必须遵循成员自身的类型
printf("%d %s\n",luck.num,luck.name);
}
void test02()
{
//结构体变量的初始化 必须遵循成员的顺序以及自身的类型
struct stu luck = {100,"huang"};
printf("%d %s\n",luck.num,luck.name);
}
void test03()
{
struct stu luck;
//使用memset给结构体变量清空
memset(&luck,0,sizeof(luck));
printf("%d %s\n",luck.num,luck.name);
}
//键盘给结构体变量中成员赋值
void test04()
{
struct stu luck;
//使用memset给结构体变量清空
memset(&luck,0,sizeof(luck));
printf("请输入num name:");
//&luck.num 取的是luck中num成员的地址
scanf("%d %s",&luck.num,luck.name);
printf("%d %s\n",luck.num,luck.name);
}
//单独操作结构体中的成员
void test05()
{
struct stu luck = {100,"hello"};
luck.num += 100;
//字符串数组 必须使用 字符串操作函数 进行操作
strcpy(luck.name,"nihao");
printf("%d %s\n",luck.num,luck.name);
}
//相同类型的结构体变量之间的赋值
void test06()
{
struct stu luck = {200,"hello"};
struct stu boo;
//方式1:逐个赋值
//boo.num = luck.num;
//stpcpy(boo.name,luck.name);
//方式2:相同类型的结构体变量,可以直接赋值
//boo = luck;
//方式3:相同类型的结构体变量 内存赋值
memcpy(&boo,&luck,sizeof(luck));
printf("%d %s\n",boo.num,boo.name);
}
int main()
{
test06();
return 0;
}
2.结构体嵌套结构体
#include <stdio.h>
struct Date{
int year;
int month;
int day;
};
struct student
{
int num;
char name[32];
struct Date ob;
};
void test01()
{
struct student luck = {100,"hello",{2023,3,14}};
//结构体嵌套结构体 访问到底层
printf("num = %d,name = %s\n",luck.num,luck.name);
printf("%d %d %d\n",luck.ob.year,luck.ob.month,luck.ob.day);
}
int main()
{
test01();
return 0;
}
执行结果:
3.结构体数组
1、结构体数组:本质是数组 每个元素是结构体
#include <stdio.h>
struct student{
int num; //结构体的成员
char name[32];
};
void test()
{
struct student edu[3] = {{100,"luck"},{200,"bob"},{300,"tom"}};
//memset(&edu,0,sizeof(edu)); //将整个结构体数组清0
int n = sizeof(edu) / sizeof(edu[0]);
int i = 0;
for(i=0;i<3;i++)
{
printf("%d %s\n",edu[i].num,edu[i].name);
}
}
//通过键盘给结构体赋值
void test01()
{
struct student edu[3];
memset(&edu,0,sizeof(edu));
int len = sizeof(edu)/sizeof(edu[3]);
printf("请输入%d个学生的信息 num name\n",len);
int i;
for(i=0;i<len;i++)
{
scanf("%d %s",&edu[i].num,edu[i].name);
}
for(i=0;i<len;i++)
{
printf("%d %s\n",edu[i].num,edu[i].name);
}
}
int main()
{
test01();
return 0;
}
执行结果:
通过键盘给结构体赋值结果:
4.结构体指针变量
1、结构体指针变量 本质是指针变量 保存的是结构体变量的地址
#include <stdio.h>
#include <string.h>
struct stu
{
int num;
char name[32];
};
void test()
{
struct stu luck = {100,"luck"};
//定义一个指针变量P保存luck的地址
struct stu *p = &luck;
//*p == luck
printf("%d %s\n",luck.num,luck.name);
printf("%d %s\n",(*p).num,(*p).name);
//通过 结构体指针变量直接访问结构体空间中的成员
printf("%d %s\n",p->num,p->name);
//不管.还是-> 就看符号 左边如果是变量使用. 如果左边是结构体地址 使用->
printf("%d %s\n",(&luck)->num,(&luck)->name);
}
int main()
{
test();
return 0;
}
执行结果: