扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
基本数据类型
数组类型
指针类型
结构体也是数据类型。
统计一个班的成绩 – 数组 {620,720,530}
有大有小,按照成绩排序-- 最高分,
但是如果需要知道谁是最高分 – 同学的名字获取不到。
每一个学生的成绩和姓名放在一起,按照成绩排序后,就可以得到这个学生的名字。
存储成绩 — float 类型
存储名字 – 字符串 – 字符数组类
结构体就是用来存储不同数据类型的数据,将某一个物体的属性抽离出来,保存在一起形成一个整体。
将学生主体里面的成绩和姓名属性抽离出来,放在一起形成一个学生的整体。
是一种自定义数据类型。
结构体关键字:struct
结构体起个名字:自定义 Student
属性需要使用{}
{}里面的语法: 属性类型 属性名; 属性名自定义
struct Student
{//成绩 -- float 类型
float score;
//姓名 -- 字符数组类型
char names[21];
};
数据类型的名字:struct Student 类似于 int float char
2.结构体变量数据类型是规定空间多大。
开空间 – 定义变量。 数据类型 变量名
数据类型:struct Student
代码如下(示例):
struct Student s1;
//开空间的时候会按照里面属性的顺序进行分配空间。
//通过变量定位到属性,可以采用 点语法 结构体变量.属性名
//s1.score
scanf("%f",&s1.score);
//s1.names
scanf("%s",s1.names);
3.容易混淆的概念
3.1给类型起个别名1、先定义在起别名:
typedef 数据类型 别名;
typedef struct Student student;
//直接使用别名定义变量
student s1;
2、在定义结构体的时候直接起别名。
//第一种方法
typedef struct Student
{float score;
char names[21];
}student;
//第二种方法
typedef struct
{float score;
char names[21];
}student;
3.2在定义结构体的时候直接定义结构体变量或者结构体指针,结构体数组typedef struct Student
{float score;
char names[21];
}s1,s2; //s1、s2是结构体变量
总结:有 typedef{}后面就是类型名称,不加 typedef{}后面就
4.结构体成员在内存中分布结构体属性在内存是按照结构体定义的顺序进行分配空间。
分配的时候遵循字节对齐的原则。
字节对齐:
首先找到占用字节数大的成员,以这个成员所占字节为单位进行分配空间。
成员首地址距离结构体变量的首地址必须保证是成员所占字节数的正数倍。
struct test1
{int a; // 4
float b; // 4
short c; // 2
}
//发现占用空间数最多的是 4,那么分配空间的时候就是以 4 为单位进行分配
printf("%d",sizeof(struct test1)); // 12
struct test2
{char a; // 1
short b; // 2
int c; //4
};
printf("%d",sizeof(struct test2)); // 8
5.结构体变量初始化定义变量就给值。
代码如下(示例):
struct Student s1 = {720,"lili"};
printf("%f %s",s1.score,s1.names);
6.结构体数组
6.1结构体数组定义数组:元素数据类型 数组名[元素个数]
代码如下(示例):
struct Student
{float score;
char names[21];
};
struct Student arr[3];
//第一个结构体 :arr[0] -- arr[0].score arr[0].names
//第二个结构体: arr[1]
//第三个结构体: arr[2]
arr[0].score = 650;
// *(arr[0].names) -- char 空间 arr[0].names[0] 就一个char
strcpy(arr[0].names,"小明");
printf("%f %s",arr[0].score,arr[0].names);
6.2结构体数组初始化代码如下(示例):
struct Student arr[3] = {{650,"小明"},{530,"小白"},{620,"小兰"}};
int i;
for(i=0;i<3;i++)
{printf("%f %s\n",arr[i].score,arr[i].names);
}
//怎么获取结构体数组的长度? sizeof(arr) / sizeof(struct
7.结构体指针指针:指向对象的数据类型 *指针名
通过结构体指针操作 指向的结构体成员可以用 ->成员访问符号
struct Student s1 = {560,“小白”};
struct Student *p;
p = &s1
//通过结构体指针操作 指向的结构体成员可以用 ->成员访问符号
printf("%f %s",p->score,p->names);
scanf("%f %s",&p->score,p->names);
结构体指针指向— 动态申请的地址
struct Student *p = (struct Student *)malloc(sizeof(struct Student))
8.注意点1、结构体变量除了初始化之外,不能整体赋值
2、可以整体拷贝。
两个结构体变量交换值。
代码如下(示例):
#includestruct Student
{float score;
char names[21];
};
int main()
{struct Student s1 = {720,"小白"};
struct Student s2 = {530,"小兰"}
struct Student temp;
temp = s1;
s1 = s2;
s2 = temp;
printf("%f %s\n",s1.score,s1.names);
printf("%f %s\n",s2.score,s2.names);
return 0;
}
结构体就是用来存储不同数据类型的数据,将某一个物体的属性抽离出来,保存在一起形成一个整体。
是一种自定义数据类型。
结构体关键字:struct
结构体起个名字:自定义 Student
属性需要使用{}
{}里面的语法: 属性类型 属性名; 属性名自定义
取别名
//第一种方法
typedef struct Student
{
float score;
char names[21];
}student;
//第二种方法
typedef struct
{
float score;
char names[21];
}student;
直接定义结构体变量
typedef struct Student
{float score;
char names[21];
}s1,s2; //s1、s2是结构体变量
结构体属性在内存是按照结构体定义的顺序进行分配空间。
结构体变量除了初始化之外,不能整体赋值。
可以整体拷贝。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流