大一上学期学C的时候讲的内容,其中结构体的内存布局还没整理,这个坑以后见到了再填吧。
目录
一、结构体
结构体-由用户定义的类型
注意区分:C中的结构体类型是struct STUDENT,而C++中的结构体类型就是STUDENT
结构体-指针与数组
结构体-嵌套
结构体嵌套是指结构体类型中包含结构体成员。结构体嵌套体中不能出现自身。为了保证不发生自身嵌套 ,A 结构体中如果包含 B 结构体类型(非指针)成员,则 B 结构体必须在 A 之前定义。
结构体-定义匿名类型
struct {
char id[6];
char name[10];
int age;
} john;
//创建了匿名结构体类型,并声明了一个john变量
结构体操作-实例变量初始化
结构体的实例变量采用初始值列表依次初始化每个成员,未初始化成员则填零值,对嵌套结构体成员同样使用初始值列表初始化。
typedef struct {
int year, month, day;
} Date;//定义结构体
typedef struct {
char id[6];
char name[10];
Date birthday;//嵌套结构体成员
int age;
} Student;
Student Anna = {"0101", "Anna", {1995, 10, 1};//初始化列表
结构体操作- &*=运算符
结构体操作-成员运算符
结构体操作-作为函数参数或者返回值
结构体类型作为函数参数,如果是传值会导致实参赋值初始化形参,当结构体成员很多时会产生性能问题。原则上采用传引用(C用指针,C++用&),除非结构体成员明确且较少。
指针作为函数的返回值注意事项:
指针作为函数的返回值,必须保证所指对象没有被释放,因此不能返回指向函数中自动变量的指针。具体的,以下返回的指针都是安全的:
1. 返回指向函数中静态变量(static)的指针;
2. 返回指向函数中定义的字符串字面量的指针;
3. 返回指向全局变量或函数的指针;
4. 返回函数参数引用的对象及其关联对象的指针,如指向传入数组的元素,或指向传入结构体指针的成员;
5. 返回动态申请内存的指针
结构体操作-动态内存
注意内存分配和释放的顺序:
构建结构体时:先分配动态结构体,再分配成员空间;
释放结构体时:先释放成员空间,再释放动态结构体。
结构体-自引用结构体
利用自引用结构体可以表示序列结构数据(如链表),甚至更复杂的数据结构,会单独出一个帖子来整理。
二、typedef关键字(C语言中用得较多)
typedef关键字-类型别名
typedef关键字-定义结构体
typedef关键字-定义数组或指针
三、共用体
可对共用体执行的操作有三种:
实例变量的复制;
& 运算符取共用体实例变量地址,注意:实例变量地址值和所有成员变量地址值都相等;
用原点成员运算符或指针运算符访问共用体的成员。 不能用运算符==或!=来比较两个共用体。
四、枚举类型
C语言提供的最后一个用户自定义的数据类型,称为枚举类型(enumeration)。通过关键字enum引入的枚举类型,是一个用标识符表示的整型枚举常量的集合。除非专门定义,枚举类型中枚举值都是从0开始并且依次递增1的。
补充:对结构体排序(C++)
定义一个结构体数组,用sort函数实现升序或者降序排序。
注:sort函数默认是升序排序
实现sort函数降序排序的方法:
(1)使用比较函数cmp
(2)Lambda
以下这篇文章有详细讲述
C++ sort 排序(降序、升序)使用总结_c++sort降序排列_十觞亦不醉的博客-CSDN博客
#include <iostream>
#include <algorithm>
using namespace std;
struct Student {
int id;
int score;
};
//重载比较函数(因为比较的元素是结构体了)
//降序排序且成绩相同,学号小的排在前面
bool cmp(Student& a, Student& b) {
return (a.score > b.score) || (a.score == b.score && a.id < b.id);
}
int main()
{
//默认已经输入完成
Student students[10];
sort(students, students+10, cmp);
sort(students, students+10, [](Student& a, Student& b)
{return (a.score > b.score) || (a.score == b.score && a.id < b.id);});
//也可使用Lambda表达式,匿名函数
return 0;
}