自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 标准C++3

标准C++一、对象的创建和销毁过程二、成员函数是如何分辨调用它的对象三、常函数四、拷贝构造与赋值操作一、对象的创建和销毁过程  1、对象的创建    a、给对象划分内存空间(栈、堆)    b、执行初始化列表      根据继承表的顺序调用父类的构造函数,可以调用无参构造,也可以调用有参构造 方式 构造函数 : 父类名(参数)      根据成员的定义顺序调用类类型成员的构造函数,可以调用无参构造,也可以调用有参构造 方式 构造函数 : 成员名(参数)      初始化其他成员    c

2021-10-12 20:03:05 153

原创 标准C++2

标准C++一、默认形参二、内联函数三、引用四、强制类型转换五、面向对象与面向过程六、类和对象七、访问控制限定符八、构造函数九、析构函数十、初始化列表一、默认形参  1、什么是默认形参    在C++中可以给函数的参数设置默认值,当函数被调用时如果调用者提供了实参则使用实参,如果没有提供则使用默认值  2、默认形参要靠右    如果函数有多个参数,设置默认形参要从右到左连续设置  3、只在函数声明中设置默认形参    当函数的声明与定义分开实现时,只能在函数声明时设置默认形参,否则会出现语法错误

2021-10-12 19:57:26 212

原创 标准C++1(简介、与C的不同、名字空间、堆内存、函数重载)

标准C++一、C++介绍二、第一个C++的程序三、C++与C数据类型不同1、结构的不同2、联合的不同3、枚举的不同4、bool类型的不同5、字符串的不同6、void*的不同四、名字空间五、C++中的堆内存管理六、函数重载一、C++介绍  本贾尼·斯特劳斯特卢普,1979年4月份在贝尔实验室在分析UNIX系统的内核流量时,特别希望有一款更加模块化的工具,于1979年10月份开始着手开发改进一款新的编程语言,在C语言的基础上增加了面向对象机制,1983年完成了C++的第一个版本  C++与C的重要的区别:

2021-10-12 19:18:32 871

原创 网络编程5(线程竞争)

线程竞争线程竞争一、基本概念竞争与同步原子操作临界区与临界资源二、互斥量(互斥锁)三、信号量四、死锁1、什么是死锁2、产生死锁的四大必要条件3、如何防止死锁的产生4、如何判断死锁五、条件变量六、生产者与消费者模型七、哲学家就餐线程竞争一、基本概念竞争与同步  同一个进程中的线程能够共享进程中的绝大多数资源,当它们进行随意的竞争时就会导致共享的资源被破坏、脏数据、不完整、不一致等问题。  通过一些方法让线程在竞争资源时相互协调,避免出现数据不完整、不一致等问题,这种就叫做线程同步原子操作  在操

2021-09-30 08:43:16 146

原创 网络编程4(线程管理)

线程管理线程管理一、基础概念二、POSIX线程三、线程管理四、线程的执行轨迹五、线程的终止六、线程的属性线程管理一、基础概念  1、线程时进程的执行线路,他是进程内部的控制序列,或者说线程是它所在进程的一部分(进程是一个资源单位,线程是进程的一部分,是真正负责执行的)  2、线程是轻量级的,没有它自己独立的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前目录等资源  3、线程有自己独立的栈内存、线程ID、错误码、信号掩码等  4、一个进程可以包含多个线程(多个执

2021-09-30 08:37:37 119

原创 网络编程3(多路复用)

多路复用c多路复用selectselect设计不合理的地方select的优点pselectpollepollepoll的优点epoll的条件触发和边缘触发c多路复用  使用一个进程(且只有一个主线程)同时监控若干个socket文件描述符的读写,这种读写模式叫做多路复用  多用于TCP服务端,用于监控若干个客户端的连接和数据的收发​ 优点:不需要频繁地创建进程、销毁进程,从而达到节约内存资源、时间资源,也能避免进程之间的竞争、等待​ 缺点:单个客户端的任务不能耗时太长,否则其他客户端就会感知到。

2021-09-30 08:32:25 171

原创 网络编程2(TCP、UDP)

多路复用多路复用selectpselectpollepoll多路复用​ 使用一个进程(且只有一个主线程)同时监控若干个socket文件描述符的读写,这种读写模式叫做多路复用​ 多用于TCP服务端,用于监控若干个客户端的连接和数据的收发​ 优点:不需要频繁地创建进程、销毁进程,从而达到节约内存资源、时间资源,也能避免进程之间的竞争、等待​ 缺点:单个客户端的任务不能耗时太长,否则其他客户端就会感知到。​ 适合并发量高、任务量短小的情景,例如:Web服务器select#include

2021-09-22 19:10:06 162

原创 网络编程1(网络通信)

网络通信网络通信基于TCP协议的网络通信模型使用到的函数基于UDP协议的网络通信模型使用到的函数网络通信​ 底层遵循TCP/IP协议,在系统中以socket接口方式呈现基于TCP协议的网络通信模型服务端 客户端创建socket对象 创建socket对象准备通信地址(本机ip)+端口号 准备通信地址(目标公网ip)+端口号绑定socket和通信地址 ...设置监听和排队的数量 ...等待客户端连接

2021-09-17 17:08:17 76

原创 Linux环境编程6(进程间通信)

进程间通信进程间通信基本概念什么是进程间通信传统进程间通信-管道有名管道:基于有文件名的管道文件的通信匿名管道XSI进程间通信共享内存消息队列信号量进程间通信基本概念什么是进程间通信  是指两个或多个进程之间交互数据的过程,是因为进程之间是相互独立的,为了协同工作的需要必须要交互数据​ 进程间通信的分类  简单的进程间通信:信号、文件、环境变量、命令行参数  传统的进程间通信:管道文件​  XSI进程间通信:共享内存、消息队列、信号量  网络进程间通信:套接字Socket传统进程间通信

2021-09-15 10:26:57 70

原创 Linux环境编程5(进程)

进程c进程的基本概念1、程序与进程2、进程的分类3、查看进程4、父进程、子进程、孤儿进程和僵尸进程5、进程标识符创建进程使用exec系列函数加载可执行文件进程的正常退出进程的异常终止子进程回收c进程的基本概念1、程序与进程  程序就是存储在磁盘上的可执行文件,当程序被加载到内存中开始运行时就叫做进程。  一个程序可以被多次加载生成多个进程,进程就是处于活动状态的计算机程序2、进程的分类  进程一般分为三种类型:交互进程、批处理进程、守护进程  守护进程一般都处于活跃状态,运行在后台,由操作系统

2021-09-15 10:14:40 46

原创 Linux环境编程4(信号)

信号信号处理基本概念信号捕获信号的发送进程休眠信号信号集与信号阻塞信号集相关函数信号阻塞定时器信号处理基本概念​ 1、中断  当进程接收到信息后中止当前正在执行的进程,转而去执行其他任务,等其他任务完成后再返回,这种执行模式叫做中断模式,中断分为硬件中断和软件中断。​ 2、信号  是一种软件中断,有操作系统发出,进程接收后执行相应的操作​ 3、常见的信号kill -l 显示出所有的信号SIGINT(2) Ctrl+c 终止SIGQUIT(3) Ctrl+\ 终止+cor

2021-09-15 10:02:10 183

原创 Linux环境编程3(系统调用、文件)

系统调用、文件一、系统调用(API)二、一切皆文件三、文件系统的调用四、随机读写五、系统IO读写文本文件六、文件描述符七、文件同步八、文件属性九、文件权限十、修改文件大小十一、删除和重命名十二、链接文件什么软硬链接文件?区别十三、目录操作一、系统调用(API)  系统调用就是操作系统提供的一些功能给程序员使用,这些功能已经被封装成C函数的形式,但它们不是标准C的一部分  一般应用程序运行在用户态(使用的是0 ~ 3G的虚拟内存),系统调用时工作在内核态(使用的是3~4G的虚拟内存)  常用的标准库函

2021-09-15 09:53:19 122

原创 Linux环境编程2(C内存管理)

内存管理一、内存管理二、进程映像三、虚拟内存四、映射虚拟内存与物理内存的函数一、内存管理  用户层​STL 自动分配/释放内存 调用C++C++ new/delete 调用CC malloc/free 调用POSIXPOSIX brk/sbrk 调用Linux系统函数Linux mmap/munmap 调用内核 kernal​ 系统层​内核 kmalloc/vmalloc 调用驱动驱动 get_free_page二、进

2021-09-15 09:33:09 62

原创 Linux环境编程1(简介、库、环境变量、错误处理)

Linux环境编程UNIX系统介绍Linux系统介绍相关知识GNU编译工具构建过程文件类型编译参数预处理指令库静态库制作静态库使用静态库共享库制作共享库使用共享库静态库和共享库的辅助工具环境变量表操作系统变量表的函数错误处理UNIX系统介绍  BCPL->newB->C->UNIX->Minix->Linux->gcc  最早版本诞生于1970年,属于美国贝尔实验室,作者丹尼斯·里奇和肯·汤普逊,是最早的多用户、多任务、支持多种CPU架构、高安全性、高稳定性、高可靠

2021-09-04 09:33:14 72

原创 数据结构与算法7(十大排序)

排序排序算法冒泡选择插入希尔快速归并堆计数桶基数排序算法  排序算法的稳定性:  在待排序的数组中,如果有值相同的数据,排序过程中如果无论如何都不会改变它们俩的前后顺序,则认为该排序算法是稳定的  注意:算法的时间复杂度并不能完全地代表算法的实际执行时间,有些时候看似复杂度高的算法反而速度快  (以下默认从小到大排)冒泡  数据左右进行比较,把最大的数据交换到最后,特点是该算法对数据的有序性敏感,在排序过程中如果发现有序可以立即停止,如果待排序的数据基本有序时,冒泡排序的效率非常高。  时间

2021-09-04 09:21:02 64

原创 标准C语言总结

2021-08-27 15:29:39 65

原创 数据结构与算法总结

2021-08-27 15:28:10 59

原创 数据结构与算法6(算法简介、分治、查找)

算法算法如何评价一个算法分治查找算法顺序查找二分查找块查找(权重查找)哈希查找:hash哈希函数的设计方法算法  数据结构中的算法,指的是数据结构所具备的功能  解决特定问题的方法,它是前辈们的一些优秀的经验总结​  输入:一个算法具有0个或多个输入。  输出:一个算法至少有1个或多个输出。  有穷性:算法再有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成。  确定性:算法中的每一步都有确定的含义,不能产生二义性。  可行性:算法的每一步都是可行的,也就是说每

2021-08-24 18:38:40 81

原创 数据结构与算法5(图)

图型结构图型(Graph)结构图的遍历图的存储结构邻接矩阵邻接表十字链表邻接多重表图型(Graph)结构 什么是图型结构:由有穷且非空的顶点和顶点之间的边的组成的集合  通常表示:G(V,E) G表示一个图,V是图中顶点(元素)集合,E是图中边(元素之间的关系)的集合 无向图:  边用(A,B)方式表示,点与点之间是互通的  在无向图中,任意两个顶点之间都有边,该图称为无向完全图,则含有n个顶点的无向完全图有 n*(n-1)/2 条边 有向图:  边用<A,B>方式表示,仅表示从

2021-08-24 18:37:18 69

原创 数据结构与算法4(各种二叉树)

各种二叉树二叉树二叉树的性质二叉树的操作二叉树的存储二叉树的遍历二叉树的存储有序二叉树二叉树的常考的笔试面试题线索二叉树选择树堆平衡二叉树红黑树二叉树  是一种常用的数据结构,处理起来比较简单方便,而且普通树可以很方便地转换成二叉树使用。  定义:节点度最多为2    二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。二叉树的性质  性质1二叉树的第i层上至多有2^(i-1)(i≥1)个节点。  满二叉

2021-08-23 18:57:57 171

原创 数据结构与算法3(树型结构)

树型结构树形结构:1、树的基本概念2、树的表示方法:倒悬树、嵌套法、凹凸法3、树的专业术语(不同资料略有不同)4、树的存储双亲表示法 顺序孩子表示法兄弟表示法树形结构:1、树的基本概念​  一种表示层次关系(一对多)的数据结构  有且仅有一个特定的节点,该节点没有前驱,被称为根节点。  剩余的n个互不相交的子集组成,其中的每一个子集也都是一棵树,被称为根节点的子树  注意:树型结构具有递归性(树中有树)2、树的表示方法:倒悬树、嵌套法、凹凸法3、树的专业术语(不同资料略有不同)  节点:

2021-08-17 19:16:04 200

原创 数据结构与算法2(栈、队列、链表)

栈和队列功能受限的表栈顺序栈链式栈栈的应用栈的常见笔试面试题队列顺序队列链式队列功能受限的表栈只有一个进出的出入口的表结构,先进后出,FILO(LIFO)顺序栈  数据项:    存储元素的内存首地址    栈的容量    栈顶的位置  运算:    创建、销毁、入栈、出栈、栈满、栈空、栈顶  注意:    栈顶指向顶部的第一个数据,称为满增栈    栈顶指向接下去要入栈的位置,称为空增栈                满减栈、空减栈链式栈  数据域:    栈顶    

2021-08-11 17:26:49 91

原创 数据结构与算法01(数据结构基础、顺序表和链式表)

数据结构基础、顺序表和链式表一、什么是数据结构1、数据结构的起源2、数据结构的基本概念3、数据结构的三个方面二、逻辑关系和存储关系数据的逻辑结构数据的存储结构逻辑结构与存储结构的对应关系三、数据结构的运算四、顺序表和链式表的实现顺序表:array链式表:list一、什么是数据结构1、数据结构的起源  1968年,美国高德纳教授,《计算机程序设计艺术》的第一卷《基本算法》的出版,开创了数据结构和算法的先河。  数据结构是一门研究数据之间关系和操作的学科,而非计算方法。  数据结构+算法=程序,沃斯凭

2021-08-10 20:32:27 78

原创 标准C语言的简单介绍(文件读写)

文件读写文本的分类:文件IO二进制方式读写文件文本方式读写文件文件的随机读写文件位置指针main函数的参数文本的分类: 文本文件:存储的是ASCII码的二进制 ‘2’ ‘5’ ‘5’ (人能看得懂) 二进制文件:存储是数据的补码 255 1111 1111文件IOFILE *fopen(const char *path, const char *mode);/*功能:打开或创建文件path:文件的路径mode:打开模式r 以只读权限打开文件,如果文件不存在则打开失败r+ 在

2021-08-08 09:47:00 69

原创 标准C语言的简单介绍9(结构、联合、枚举)

结构、联合、枚举结构struct设计定义结构变量结构体变量初始化访问成员结构变量作为形参时typedef重定义结构体类型如何结算结构体的字节数内存对齐内存补齐联合union枚举enum结构struct 结构是一种由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个不同的基础类型组成。设计struct 结构体名{ 类型1 成员名1; 类型2 成员名2;};定义结构变量 struct 结构体名 变量名; 注意:在定义结构变量时,struct不能省略结构体变量初始化 str

2021-08-08 09:43:58 89

原创 标准C语言的简单介绍8(头文件、Makefile)

头文件、Makefile头文件头文件中应该写什么头文件的编写规则头文件的相互包含Makefile编译规则一个最简单的Makefile脚本头文件头文件中应该写什么 问题:头文件可能被任何的源文件包含,意味着头文件的内容会在多个目标文件中存在,合并时要保证不能冲突 重点:头文件中只能编写声明语句,不能有定义语句  全局变量声明 extern int num;  函数声明  宏常量  宏函数  typedef 类型重定义  结构、联合、枚举的类型声明头文件的编写规则 1、为每个.c文件写一

2021-07-29 18:45:55 306

原创 标准C语言综合案例(通讯录)

通讯录介绍数据功能代码main.cphone_book.ctools.c介绍主要在linux终端中运用多文件编程实现通讯录的功能。数据​ 姓名、性别、电话,最多存储50个联系人功能​ 1、添加联系人​ 2、按名字删除联系人​ 3、按名字修改联系人信息​ 4、查找联系人,姓名、电话,支持模糊查找​ 5、显示所有联系人信息代码main.c#include<stdbool.h>#include "phone_book.h"#include

2021-07-29 18:38:17 97

原创 标准C语言的简单介绍7(预处理)

预处理预处理指令查看预处理过程预处理指令的分类#include 文件包含#define 定义宏常考的笔试面试题:(C语言中与指针相关的知识点有哪些)条件编译预处理指令 程序员所编写的代码并不能被真正的编译器编译,需要一段程序把代码翻译一下 翻译的过程叫做预处理,负责翻译的程序叫做预处理器,被翻译的代码叫做预处理指令,以#开头的代码都是预处理指令​查看预处理过程 gcc -E code.c 把预处理的结果显示到终端上 gcc -E code.c -o code.i 把预处理结果存储到code.i

2021-07-27 19:12:05 100

原创 标准C语言的简单介绍6(字符串、缓冲区)

标准C语言的简单介绍6字符字符的输入字符的输出串字符串字符串的输入字符串的输出:字符串的存在形式字符数组字符串字面值常用方式:输出缓冲区输入缓冲区字符串相关的常用操作字符​ 在计算机中是以整型形式存储的,当需要显示时会根据ASCII表中的对应关系显示出相应的符号或图案​ ‘\0’ 0​ ‘0’ 48​ ‘A’ 65​ ‘a’ 97​ %c %hhd字符的输入​ scanf("%c",&ch);​ ch = getchar();字符的输出​ printf("%c

2021-07-24 08:58:35 288

原创 标准C语言的简单介绍5(指针、内存)

这里写目录标题什么是指针为什么要使用指针如何使用指针使用指针需要注意的问题指针的运算const与指针什么是指针​ 指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量中存储的是整型数据,代表了内存的编号,通过这个编号可以访问对应的内存,为什么要使用指针​ 1、函数之间相互独立,但有时候需要共享变量​ 传参是单向值传递​ 全局变量容易命名冲突​ 使用数组还需要传递长度​ 命名空间是独立的,但是地址空间是同一个,所以指针可以解决这个问题​ 2、由于函数之间传

2021-07-20 17:01:53 68

原创 标准C语言综合案例(五子棋)

五子棋数据业务逻辑代码数据​ 1、定义棋盘二维数组 15*15 空位置’*’​ 2、定义棋子角色变量 白棋’O’ 黑棋’X’​ 3、定义变量用于记录下棋的位置业务逻辑 是否需要初始化 for( ; ; ) {  1、清理屏幕、打印棋盘  2、落子   坐标合法、该位置不能有棋子,否则继续落子  3、判断是否五子连珠  4、交换角色 }代码#include<stdio.h>#include<stdlib.h>#include<stdboo

2021-07-19 18:43:47 298

原创 标准C语言的简单介绍4(函数、进程映像、局部变量全局变量、类型限定符)

标准C语言的简单介绍4一、函数函数分类标准库函数系统函数第三方库函数自定义函数函数传参二、进程映像二、局部变量和全局变量:局部变量全局变量块变量三、类型限定符:**auto****extern****static**constvolatileregistertypedef一、函数 一段具有某项功能的代码的集合,是C语言中管理代码的最小单位 把代码分成一个个函数,可以方便地管理和调用调用代码函数分类标准库函数 C语言标准委员会为C语言以函数形式提供的一套基础功能,被封装在libc.so库中,使用时

2021-07-16 20:46:34 124

原创 标准C语言综合案例(推箱子)

推箱子​ 1、确定数字与字符的对应关系​ 路 0​ 墙壁 1​ 人 2​ 箱子 3​ 目标点 4​ 人在目标点 6​ 箱子在目标点 7​ 2、定义二维数组地图​ 3、定义人的坐标​ 4、进入死循环​ 1、清理屏幕并显示地图​ 2、检查是否完成任务​ 是:一共走了几步,结束程序​ 3、获取方向键...

2021-07-14 15:48:46 205

原创 标准C语言综合案例(走迷宫)

走迷宫头文件1、time.h2、stdlib.h3、getch.h步骤1、定义二维数组作为迷宫2、定义变量记录老鼠的坐标3、记录游戏开始时间4、进入死循环代码头文件1、time.h 使用time(NULL)来计算时间2、stdlib.h 使用system()来调用系统命令 system(“clear”)清屏3、getch.h 使用getch()来获取键盘按键步骤1、定义二维数组作为迷宫 0 代表 ‘ ’ 1 代表 ‘ ’ 2 代表 ‘@’2、定义变量记录老鼠的坐标3、记录游戏开

2021-07-13 16:57:59 181

原创 标准C语言的简单介绍3(数组)

标准C语言的简单介绍3数组二维数组变长数组数组什么是数组:变量的组合,是一种批量定义变量的方式定义:类型 数组名[数量]; int arr[5];使用:数组名[下标]; 下标:从零开始 范围:0~数量 -1 遍历:与for循环配合,使用循环变量i当作数组的下标 初始化:类型 数组名[数量] = { 1 , 2 , 3 , 4 …};  1、数组与普通变量一样默认值是随机的,为了安全要对数组进行初始化  2、这种初始化语法只能在定义数组时使用,并且只能逐个赋值,不能整体赋值  3、初始化

2021-07-13 16:31:04 95

原创 标准C语言的简单介绍2(常量、运算符、语句、进制转换)

标准C语言的简单介绍2一、常量二、格式化输入输出三、运算符自变运算符 ++/--算数运算符 + - / %关系运算符> < >= <= == !=逻辑运算符&& || !三目运算符赋值运算符 = += -=位运算符 & | ~ >> <<四、类型转换自动类型转换强制类型转换五、分支语句六、开关语句七、循环语句for循环语句while循环do while循环循环嵌套一、常量​ 什么是常量:程序运行期间数值不能变化的叫常量​10

2021-07-09 20:18:36 119

原创 标准C语言的简单介绍(编译、数据类型)

这里写目录标题一、第一个C程序#include<>main函数二、编译器三、C代码变成可执行程序的过程四、数据类型五、变量与常量一、第一个C程序#include <stdio.h>int main(){ printf("Hello world!\n"); return 0;}#include<>程序员所编写的代码并不是标准的C代码,需要一段程序把它翻译成标准的C代码,负责翻译的程序叫做 预处理器,翻译的过程叫做 预处理,被翻译的代码叫做

2021-07-08 19:19:37 444

原创 vim文本编辑器介绍及常用指令

vim文本编辑器​ 可以在终端下采用纯键盘操作的一款文本编辑器,号称“编辑器之神”,可以升级(二次开发),可以扩展(安装插件)​ 基本用法​ 进入vim: vim filename.c 如果文件不存在则创建,文件存在则打开​ 输入i:进入编辑模式,编写代码​ 保存退出:按Esc键退出编辑模式,输入ZZ保存并退出​ 三大模式​ 正常模式:一般用于阅读文件,或者使用快捷键快速地修改文件​ 编辑模式:一般用于编辑文件,输入内容​ 行底模式:一般用于对vim进行配置,或者执行一些高级操

2021-07-07 18:13:52 123

原创 Ubuntu使用小技巧

Ubuntu使用小技巧​ ctrl+l 清理屏幕​ tab 自动补全文件名、目录名​ ctrl+alt+t 快速调出终端​ ctrl+shift+t 终端下新建标签页​ ctrl+tab+方向键 切换工作区​ alt+tab 切换程序

2021-07-07 18:03:17 57

原创 Linux系统命令介绍

Linux系统命令介绍发展根目录文件介绍Linux的系统命令常用命令文件相关的命令目录相关的命令网络相关的命令发展​ BCPL->newB->C语言->UNIX->Minix(类UNIX操作系统)->Linuxki2ww根目录文件介绍​ Linux管理硬盘的能力非常强大,所以我们看到的只有一个分区​ / 根目录,所有文件都存储在它下面​ ~ 用户主目录​ . 当前目录​ … 上一级目录/bin 存储系统命令 /dev

2021-07-06 20:10:32 61

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除