C语言笔记(自定义类型:结构体、枚举、联合体 )

前言

        本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。

目录

前言

1 结构体

1.1 结构体的声明

1.2 结构体的自引用

1.3 结构体变量的定义和初始化

1.4 结构体变量的内存对齐

1.5 修改默认对齐数

1.6 结构体传参

2.位段

2.1 位段的内存分配

2.2 位段的跨平台问题

3.枚举

3.1枚举类型的定义

3.2枚举的优点

3.3枚举的使用

4. 联合(共用体)

4.1 联合类型的定义

4.2 联合的特点

4.3 联合大小的计算

1 结构体

结构体是一些值的集合,这些值称为成员变量,结构的每一个成员可以是不同类型的变量。

1.1 结构体的声明
struct tag
{
member-list;
}variable-list;

tag                结构体标签

member-list  成员列表

variable-list   变量列表

注意:创建结构提变量的时候最后的不能丢掉

结构体就创建一个自定义的包含多种数据类型的数据类型

示例

创建一个描述学生的结构体数据类型 Stu 

struct Stu
{char name[20];int age;char sex;char id[20];
};

特殊声明 :匿名结构体类型,没有结构体的标签,没有给结构体起名字。

示例1(创建没有标签的结构体)

struct
{int a;char b;float c;
}x;//x创建的结构体变量

        这种结构的使用只能现创现用,在不同的位置是无法创建同一类型的结构体变量的,创建变量需要结构体标签,没有标签就是创建不了变量了。

示例2(创建结构体的指针)

struct
{
int a;
char b;
float c;
} *p;

示例1和示例2中下方等式成立吗?

p = &x;

1.2 结构体的自引用

        结构体的自引用就是结构体中包含结构体的指针。

示例:在数据结构中数据的存放有链表性结构,链表中的每一处的节点都会存放一个数据,还可以根据节点找到下一个节点的地址,然后创建结构体;那么我结构体存放节点的数据和指向下一个节点的指针就可以了,这就是结构体的自引用了。

struct Node
{int data;//            节点的数据struct Node* next;//   下一个节点的地址
};

        结构的创建变量的时候名字较为复杂还有 unsigned int 、unsigned char等等 都可以使用 typedef重新定义名字,这样在创建变量的时候就简单了,如下

//重新定义变量
typedef unsigned int uint;
typedef unsigned char uchar;
typedef char u8;
typedef struct Stu Stu;
//创建变量
unit a;
unchar b;
u8 c;
Stu x;

需要注意

在结构体创新命名的时候,需要结构体有标签。

1.3 结构体变量的定义和初始化

        结构体定义就是创建结构体变量,以下是创建结构提变量的方式:


//方式1 创建结构体的时候创建全局变量
struct Point
{int x;int y;
}a1;
//方式2
struct Point a2;
//方式3
int main()
{struct Point a3;return 0;
}

        初始化和和数组的初始化较为相似,是应用{ }来初始换结构体创建的变量,在后面附上值就可以了,完全初始化,

struct Point
{int x;int y;
}a1 = {10,20};
struct Point a2 = {5,9};int main()
{struct Point a3 = { 2,3 };return 0;
}

        不完全初始化(一个一个的给变量赋值)

struct S s1= { .num=10,.ch='q',.p.x=6, .p.y=10 };

嵌套结构体的初始化,有几个结构体就用几个{ }来创建变量,示例如下:

struct Point1
{int x;int y;
};
struct Point2
{int z;char ch;struct Point1 a1;float d;
};
int main()
{struct Point2 s = { 1,'a',{1,2},6.14f };return 0;
}

结构体的访问方式,分为两种,一种是使用 . 符号来访问,一种是使用 -> 符号来访问

struct Point
{int x;int y;
};
struct S
{int num;char ch;struct Point p;float d;
};int main()
{//	初始化struct S s = { 3,'w',{1,2},3.15f };//访问printf("%d %c %d %d %0.1f\n", s.num,s.ch,s.p.x, s.p.y, s.d);return 0;
}
struct Stu
{char name[20];int age;char sex[20];float score;
};
int main()
{//打印结构体信息struct Stu s = { "张三", 20, "男", 95.0f };struct Stu *ps = &s;printf(" %s %d %s %.1f\n", ps->name, ps->age, ps->sex, ps->score);return 0;
}
1.4 结构体变量的内存对齐

        结构体的内存对齐决定了结构体的在内存中所占用的空间大小。

引入

        创建两个结构体,结构体中的变量类型相同,但是顺序不同,其内存大小一样吗?

struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
int main()
{printf("%d\n", sizeof(struct S1));//12printf("%d\n", sizeof(struct S2));//8return 0;
}

1.结构体的顺序不一样,内存不一样;

2.内存的大小和成员的数据类型有关吗?

结构体的对齐方式按照以下几条

1.结构体的第一成员,对齐到结构体在内存中的存放位置的0偏移处;

2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍处;

对齐数:结构体成员自身大小和默认对齐数的较小值;

VS:默认对齐数为8;

Linux gcc :没有默认对齐数,对齐数就是结构题成员的自身大小;

3.结构体的总大小,必须是所有成员的对齐数中最大对齐数的整数倍。

4.如果结构体中嵌套了结构体成员,要将嵌套的结构体成员的对齐到自己的成员中最大的对齐数的整数。(结构体的总大小必须是最大对齐数的整数倍,包含请嵌套结构体成员的对齐数,是所有对齐数的最大值)

S1的结构体存储的方式

struct S1
{char c1;int i;char c2;
};

 (1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);

(2)i为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量为4,偏移量 1,2,3处内存浪费掉了(黄色);

(3)c2字符变量,对齐数为1,默认对齐数为8,取较小值为1,占用偏移量为8的位置(红色);

(4)确定结构体的大小,从c1到c2处,占用了9个字节的空间,取结构体成员的最大对齐数4,因此内存要占用12个字节,浪费6个字节(蓝色)。

S1的结构体存储的方式

struct S2
{char c1;char c2;int i;
};

(1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);

(2)c2字符变量,对齐数为1,默认对齐数为8,取较小值为1,偏移量是对齐数的倍数 2,占用偏移量为2的位置(红色);

(3)i为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量为4,去偏移量的倍数 4,偏移量 2,3处内存浪费掉了(黄色);

(4)确定结构体的大小,取结构体成员的最大对齐数4,因此内存要占用8个字节,浪费2个字节空间(蓝色)。

使用 offsetof函数来验证上述的偏移量是否正确,这个函数就是计算偏移量的,头文件是stddef,

验证程序

struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
int main()
{printf("%d\n", sizeof(struct S1));//12printf("%d\n", offsetof(struct S1, c1));//0printf("%d\n", offsetof(struct S1,i));//4printf("%d\n", offsetof(struct S1,c2));//8return 0;
}

嵌套结构体内存对齐,

#include <stdio.h>
#include <stddef.h>
struct S2
{char c1;char c2;int i;
};
struct S3 
{double d;struct S2 s2;int a;
};
int main()
{printf("%d\n", sizeof(struct S3));//24printf("%d\n", offsetof(struct S3,d));//0printf("%d\n", offsetof(struct S3,s2));//8printf("%d\n", offsetof(struct S3,a));//16return 0;
}

S3是如何对齐呢?

struct S3 
{double d;struct S2 s2;int a;
};

(1)d是第一个成员,从0偏移量存储,占用8个字节(灰色);

(2)s3为结构体变量,结构体成员最大的对齐数为4,默认对齐数为8,取较小值为4,偏移量是对齐数的倍数 8,占用偏移量为8的位置(黄色);

(3)a为整型变量,对齐数为4,默认对齐数为8,取较小值为4,偏移量取16,取偏移量的倍数 16(黄色);

(4)确定结构体的大小,取结构体成员的最大对齐数8,因此内存要占用24个字节,浪费4个字节空间(蓝色)。

为什么要对齐呢?

1. 程序移植: 不是所有的平台数据的存储方式和访问方式是一样的。
2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总结:结构体的对齐就是利用内存换取运行时间的手段。

如何节省空间?

        将占用空间小的成员集中到一起。

1.5 修改默认对齐数
#pragma pack()//恢复默认对齐数
#pragma pack(1)//设置对齐数为1
#include <stdio.h>
#include <stddef.h>
#pragma pack(1)//设置对齐数为1
struct S1
{char c1;int i;char c2;
};
#pragma pack()//恢复默认对齐数int main()
{printf("%d\n", sizeof(struct S1));//6printf("%d\n", offsetof(struct S1,c1));//0printf("%d\n", offsetof(struct S1,i));//1printf("%d\n", offsetof(struct S1,c2));//5return 0;
}

此时S1的空间对齐方式

(1)c1是第一个成员,从0偏移量存储,占用一个字节(灰色);

(2)i为整型变量,对齐数为1,偏移量为1,(黄色);

(3)c2字符变量,对齐数为1,占用偏移量为5的位置(红色);

(4)确定结构体的大小,从c1到c2处,占用了6个字节的空间。

1.6 结构体传参

        结构体传参一般采用地址传参的方式,在传递值传参的时候,需要重新创建变量,浪费大量的内存空间,传址调用较为省空间。

struct S
{int data[1000];int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}
int main()
{print1(s);  //传结构体print2(&s); //传地址return 0;
}

2.位段

位段的声明和结构体类似,有两种不同的标志

1.位段的成员必须是 int 、unsigned int、或者是signed int;

2.位段的成员名后有一个冒号和一个数字。

struct A
{int _a:2;int _b:5;int _c:10;int _d:30;
};

A是一个位段类型,位段的大小是多少呢?

printf("%d", sizeof(struct A));//8

原本4个整型数据,占据16个字节,如何在内存中限制到8个字节的呢?

2.1 位段的内存分配

1. 位段的成员可以是 int unsigned、 int、 signed int 、 char 类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

struct S
{char a:3;char b:4;char c:5;char d:4;
};struct S s = {0};s.a = 10;s.b = 12;s.c = 3;s.d = 4;

        位段开辟空间一次开辟一个字节,不够使用的话再开辟另一个字节;位段是从低地址到高地址存储的,在每个字节中也是从低位向高位存储;

2.2 位段的跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。

特点:位段和结构体相比,位段的存储空间为共用空间,位段更加节省空间,但是存在跨平台问题。

3.枚举

3.1枚举类型的定义

可以被一一列举的变量,语法形式和结构体类似,例如生活中的,

1.一周的星期一到星期日有限的7天,可以一一列举;

2.性别有:男、女分别;

3.一年有12个月,可以一一列举。

enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex
{MALE,FEMALE,SECRET
};

三原色

enum Color
{RED,GREEN,BLUE};

上述是有可能取到的值,默认从零开始一次递增,在定义的时候可以赋初值,示例

#include <stdio.h>
enum Day
{Mon = 1,Tues = 2,Wed = 3,Thur = 4 ,Fri = 5,Sat = 6,Sun = 7 
};
int main()
{printf("%d\n", Mon);//1printf("%d\n", Tues);//2return 0;
}

        枚举常量就是给特定的字符赋予一定的数值,在后续的使用中Mon和1等价。

3.2枚举的优点

和#define相比枚举创建的常量可以在调试中显示,而宏定义是不可以的。

1. 增加代码的可读性和可维护性;
2. 和#define定义的标识符比较枚举有类型检查,更加严谨;
3. 防止了命名污染(封装);
4. 便于调试;
5. 使用方便,一次可以定义多个常量。

3.3枚举的使用

下述代码是用于C51单片机的按键控制LED亮灭的程序,创建的枚举变量使用的时候程序较好理解,如果将KEY1_PRESS为1的话,并不是特别的直观的表达出按键1以将按下。

#include <REGX52.H>
#include <stdio.h>
//引脚定义
#define  SMG_A_DP_PORT  P1 
sbit KEY1 = P0 ^ 0;
sbit KEY2 = P0 ^ 1;
sbit KEY3 = P0 ^ 2;
sbit KEY4 = P0 ^ 3;
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3 = P2 ^ 2;
sbit LED4 = P2 ^ 3;enum KEY
{KEY_UNPRESS = 0,KEY1_PRESS = 1,KEY2_PRESS = 2,KEY3_PRESS = 3,KEY4_PRESS = 4,
};//枚举
char key_scan(mode);//当mode=0的时候 单次扫描 mode=1 连扫
void main()
{unsigned char  ret = 0;while (1){ret = key_scan(0);switch (ret){case KEY1_PRESS:{LED1 = !LED1;break;}case KEY2_PRESS:{LED2 = !LED2;break;}case KEY3_PRESS:{LED3 = !LED3;break;}case KEY4_PRESS:{LED4 = !LED4;break;}}}}//延时函数 当1=ten_us,延时10us
void delay_10us(unsigned int ten_us)
{while (ten_us--);
}
char key_scan(mode)//当mode=0的时候 单次扫描 mode=1 连扫
{static char key = 1;if (mode){key = 1;}if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)){key = 0;delay_10us(1000);if (KEY1 == 0)return KEY1_PRESS;else if (KEY2 == 0)return KEY2_PRESS;else if (KEY3 == 0)return KEY3_PRESS;else if (KEY4 == 0)return KEY4_PRESS;}else if (KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1){key = 1;}return KEY_UNPRESS;
}

4. 联合(共用体)

4.1 联合类型的定义

联合是一种特殊的自定义类型,定义的变量也包含一系列的成员这些成员会共用一块内存空间。

union UN 
{char c;int i;
};
int main()
{union UN un;printf("%d\n", sizeof(un));//4printf("%p\n", &un);//00EFFB08printf("%p\n", &(un.c));//00EFFB08printf("%p\n", &(un.c));//00EFFB08return 0;
}

        三次取地址的结果是一样的,说明c和i的起始地址的是一样,可以得出,两个变量占用得空间开始是一样得,当然两个变量是不可以同时使用得,c占用4个字节的第一个字节,i占用四个字节,如图

4.2 联合的特点

        联合的成员是共用同一块内存空间的,联合变量的大小至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

int main()
{union Un{int i;char c;};union Un un;//下面输出的结果是什么?un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);//11223355return 0;
}

        un的前四个字节为11223344,后有将44修改为了55,因为VS2017上位小端存储。

可以封装成函数判断大小端存储:

#include<stdio.h>
int check_sys()
{union Un{int i;char c;}un;un.i = 1;return un.c;//判断变量,低位是否为1或者0
}
int main()
{int ret = check_sys();if (ret){printf("小端存储");}elseprintf("大端存储");return 0;
}
4.3 联合大小的计算

1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

int main()
{union Un1{char c[5];int i;};union Un2{short c[7];int i;};//下面输出的结果是什么?printf("%d\n", sizeof(union Un1));//8printf("%d\n", sizeof(union Un2));//16
}

Un1的内存大小为8

(1).c[5]的对齐数位1,占用5个字节的空间

(2).i的对齐数为4,占用内存4个字节的空间,

(3)最大对齐数为4,再取4的倍数,内存大小为8个字节;

Un2的内存大小为16

(1).c[7]的对齐数位2,占用14个字节的空间

(2).i的对齐数为4,占用内存4个字节的空间,

(3)最大对齐数为4,再取4的倍数,内存大小为16个字节;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477795.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】list模拟实现(详解)

本篇来详细说一下list的模拟实现&#xff0c;list的大体框架实现会比较简单&#xff0c;难的是list的iterator的实现。我们模拟实现的是带哨兵位头结点的list。 1.准备工作 为了不和C库里面的list冲突&#xff0c;我们在实现的时候用命名空间隔开。 //list.h #pragma once #…

数字化工厂 MES试点方案全解析(三)

目 录 三、试点实施步骤 需求分析与方案设计阶段 系统开发与测试阶段 系统部署与培训阶段 试点运行与优化阶段 总结与评估阶段 三、试点实施步骤 需求分析与方案设计阶段 1、成立由企业生产、工艺、质量、设备、IT 等多部门人员组成的项目团队&#xff0c;与 MES 供应商共…

ShuffleNet V2:高效卷积神经网络架构设计的实用指南

摘要 https://arxiv.org/pdf/1807.11164 当前&#xff0c;神经网络架构设计大多以计算复杂度的间接指标&#xff0c;即浮点运算数&#xff08;FLOPs&#xff09;为指导。然而&#xff0c;直接指标&#xff08;例如速度&#xff09;还取决于其他因素&#xff0c;如内存访问成本…

【Opencv学习】PART1-图像基础处理

目录 一、图像的读入、显示和保存 1、读入图像 imread函数 范例 显示控制参数 2、显示图像 imshow函数 范例 tips waitkey函数 含义 delay参数: tips destoryAllWindows函数 3、保存图像 imwrite函数 范例 实操 01-读入显示保存 代码 结果 二、图像处理入…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段&#xff0c;帮助我们发现问题&#xff0c;识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里&#xff0c;除了panic问题…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

图形化界面MySQL(MySQL)(超级详细)

1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录&#xff0c;再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables&#xff1b;要先选中 圆圈处支持自己输入 点击这个就执…

vulhub靶场与pikachu靶场

一、搭建vulhub 环境&#xff1a;kaildocker 1.1 提权&#xff1a; :::color4 sudo su #权限升级为root ::: 1.2更新软件&#xff1a; :::color4 apt-get update ::: (此处我已更新过) 1.3安装HTTPS协议和CA证书&#xff1a; :::color4 apt-get install -y apt-transpo…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期&#xff1a;20241124 学习目标&#xff1a;http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记&#xff1a; 安装requests 安装方式&#xff1a;pip/pip3 install requests 官网教程&#xff1a;Requests: HTTP fo…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络&#xff0c;想使用wireshark抓包工具抓取Android手机网络日志&#xff0c;有以下两种连接方法&#xff1a; Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑&#xff0c;并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧&#xff1a; https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

【数据结构与算法】树和二叉树

【数据结构与算法】树和二叉树 文章目录 【数据结构与算法】树和二叉树前言一、树的基本概念二、二叉树的基本概念三、二叉树的递归遍历四、二叉树的编程五、二叉树的非递归遍历总结 前言 本篇文章将讲到树的基本概念&#xff0c;二叉树的基本概念&#xff0c;二叉树的递归遍历…

大语言模型---Llama7B和Llama8B的区别;模型参数量;权重文件的不同;嵌入层权重的不同;输入序列长度的不同;应用场景

文章目录 1.概要2. 模型参数量3. 权重文件的不同4. 嵌入层权重的不同5. 输入序列长度的不同6. 应用场景 1.概要 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta开发的一系列语言模型&#xff0c;其中不同版本的参数量&#xff08;如7B、8B等&#xff09;…

Android Binder技术概览

Android中的Binder是一种基于远程过程调用&#xff08;Remote Procedure Call, RPC&#xff09;的轻量级通信机制&#xff0c;核心用于 Android 系统中的进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;。Binder 是 Android 系统中不可或缺的一部分&#…

NoteExpress导入知网论文无法智能更新题录的处理方法

知网论文下载下来一般为“标题_作者.caj”&#xff0c;只要在导入文件时对字段默认值进行设置就行了。 其他地方下载的论文也是一样&#xff0c;根据文件名称设置字段默认值。

搜索二维矩阵

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c…

Mysql中的 TEXT 和 BLOB 解析

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…