<结构体>
是什么:
是一种数据类型,是构造类型,里面可以存放不同类型的数据;
有什么用:
用于封装不同的数据类型到一个结构中,方便使用;
定义:
1).定义结构体类型 struct 结构体类型{数据类型1 名称;数据类型2 名称.......};
struct Person(){
char *name;
int age;
};
2).定义结构体变量及赋值:struct 结构体类型 变量名={数据1,数据2};
struct Person p1={"liuchuan",26};
取值:变量名.结构体元素变量名;
p1.name=
赋值:变量名.结构体元素变量名=新值;
p1.age=18;
什么时候用:
当需要把相关联的不同数据类型封装起来一起使用;
有什么特点?
1).可在定义结构体类型时同时定义结构体变量名,可定义匿名类结构体;
2).同一作用域内不可重复定义结构类型和结构变量,匿名类型结构体除外
3).可再函数内也可在函数外,效果及用法类似于局部变量和全局变量,也可嵌套定义
4).可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此
结构体练习
#include <stdio.h>
int main (){
//第一种定义方式,定义一个结构体类型,结构体变量名为per1
struct Person{
char *name;
int age;
char *sex;
};
//定义一个结构体变量 per1并初始化赋值
struct Person per1={"liuchuan",26,"男"};
//第二种定义方式,定义结构体类型同时,定义了结构体变量,初始化赋值
struct Person1{
char *name;
int age;
char *sex;
}per1={"liuchuan",26,"男"};//不可以定义之后,在批量赋值;
//第三种,匿名结构体,结构体类型一样,结构体元素变量和结构体一起定义可以使用,不能分开
//必须同时初始化变量,这种结构定义方式,不能重用;--不推荐使用,了解
//什么时候使用,在一次性使用的时候,因为这种方式每次定义结构体变量都要把结构体结构写一遍
struct {
char *name;
int age;
char *sex;
}per2={"liuchuan",26,"男"};
//struct per={}; 错误
//per={};错误
//打印结构体元素per1内的值
printf("姓名=%s\n年龄=%d\n性别=%s\n\n\n",per1.name,per1.age,per1.sex);
//修改结构体元素per1的值
per1.name="chuanchuan";
per1.age=16;
per1.sex="女";
//修改后打印
printf("修改后:\n\n姓名=%s\n年龄=%d\n性别=%s\n",per1.name,per1.age,per1.sex);
}
7. 全局变量和局部变量
1).可再函数内也可在函数外,效果及用法类似于局部变量和全局变量,也可嵌套定义
2).可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如
8. 匿名结构体:
什么时候使用,在一次性使用的时候,因为这种方式每次定义结构体变量都要把结构体结构写一遍
9.结构体可以嵌套练习
struct a{
int a1;
int a2;
int a3;
};
struct b{
int b1;
int b2;
struct a b3;
}bb={1,2,{1,2,3}};
printf("%d,%d,%d",bb.b1,bb.b2,bb.b3.a1);
<结构体数组>
1.是什么?
是数组,数组里的每一个元素是结构体类型;
2.有什么用?
用于存档多个有关联的结构体;
3.怎么用?
定义及初始化:
struct 结构体类型 数组名[长度]={结构体1,结构体2};
如:struct person{char *name;int age;};
struct person per1={};
struct person per2={};
struct person arr[2]={per1,per2};
取值,数组名[脚表] arr[0].name= /arr[1].name=
赋值.数组名[角标] arr[1].name="liuchuan";
4.什么时候用?
当需要存储多个有关联的结构体,并作为一个整体使用时;
5.有什么特点
遵循数组的特点;
<结构体指针>
1.是什么?
是指针,指针类型的结构体类型;
2.有什么用?
用于存储结构体的地址,,并操作地址对应的结构体空间内的数据;
3.怎么用?
定义及初始化赋值
struct 结构体类型 *指针名 =&结构体变量;
struct person
{
char *name;
int age;
};
struct person per1={"刘川",26};
struct person *p=&per1;
取值:*指针名.结构体元素名;
指针名->结构体元素名;
(*p).name=%s
p->name=%s
赋值:*指针名.结构体元素名;
指针名->结构体元素名;
(*p).name="liuchuan";
p->age=25;
4.什么时候用?
当需要使用指针操作结构体时;
5.特点:
指针移动对结构体本身没有意思,结构体名并不包含第一个元素的地址;(可以使用->小箭头)
6.结构体元素指针:
struct person
{
char *name;
int age;
};
struct person per1={"刘川",26};
struct person *p=&per1;
结构体元素指针定义:
int **p1=&per1.name;
int *p2=&per.age;
7.结构体内存分析
-->结构体分配内存空间遵循的2各原则-对其原则,或对其算法(增加CPU寻址效率)
1).每个元素的偏移量(当前元素首地址距离整个结构体首地址的字节数)必须是自己所占字节数的整数倍,如果不够,补齐上一个元素的字节数;
2).整个结构体的字节数必须是其最大元素所占自己的整数倍,如果不够,最后一个元素填充字节;
3).计算结构体sizeof(struct 结构体类型)-->sizeof(struct person);
8.结构体编程题
编程题1;
#include <stdio.h>
int main(){
struct Car {
char *pinPai;
int wheel;
int speed;
char *color;
}car1={"BMW",4,250,"白色"};
struct Car car2={"大众",3,120,"屎色"};
//第一种方式输入打印
printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",car1.pinPai,car1.wheel,car1.speed,car1.color);
//指针方式打印
struct Car *p=&car2;
printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",(*p).pinPai,(*p).wheel,(*p).speed,(*p).color);
printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",p->pinPai,p->wheel,p->speed,p->color);
}
编程题2-3:
#include <stdio.h>
int main(){
//定义一个结构体,用于保存家庭成员姓名,年龄,身份;
struct Family{
char *name;
int age;
char *ffname;
}family01,family02;
//第一种赋值
family01.name="冰";
family01.age=26;
family01.ffname="哥哥";
//定义一直指针赋值
struct Family *f1=&family02;
f1->name="洁";
f1->age=16;
f1->ffname="姐姐";
//普通打印成员信息
printf("\n-->%s\n-->%d\n-->%s\n",family01.name,family01.age,family01.ffname);
//指针方式打印成员信息
printf("\n-->%s\n-->%d\n-->%s\n",(*f1).name,(*f1).age,(*f1).ffname);
}
|