结构体、共用体和枚举类型

大一上学期学C的时候讲的内容,其中结构体的内存布局还没整理,这个坑以后见到了再填吧。

目录

一、结构体

        结构体-由用户定义的类型

        结构体-指针与数组

        结构体-嵌套

        结构体-定义匿名类型

        结构体操作-实例变量初始化

        结构体操作- &*=运算符

        结构体操作-成员运算符

        结构体操作-作为函数参数或者返回值

                指针作为函数的返回值注意事项:

        结构体操作-动态内存

        结构体-自引用结构体

二、typedef关键字(C语言中用得较多)

        typedef关键字-类型别名

        typedef关键字-定义结构体

        typedef关键字-定义数组或指针

三、共用体

四、枚举类型

补充:对结构体排序(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值