结构体的理解

34 篇文章 6 订阅
订阅专栏

前言

记录对于结构体知识的了解

结构体?

结构体是一种复杂类型对象,可以用来描述一些复杂对象;
比如说:对于一个人来说,他不光只有年龄、身高、体重、姓名等,我们通过基本数据类型无法来描述它,为此我们得想办法,解决他啊!C语言为我们提供了struct关键字来解决这个问题,利用struct关键字我们可以用来定义结构体,把这些原本单个的数据给它打包在一起,形成一个新的类型;
那么struct怎么用呢?
举个例子,比如说我们要描述人:

struct Person
{
char name[20];
char sex[5];
int age;
}

我们想这样定义就好了,其中struct Person就是和int 、char、double同等地位的东西了,struct Person也是一个数据类型,只不过它是复杂数据类型,由基本数据类型组成,能描述的信息也就更多。这也是C语言的灵魂之一;
基本语法就是:

struct +类型名
{
成员变量;
};//主义这里要加分号结尾;
因此我们有了这样的一个类型,我们该如何定义变量呢?

定义变量

上面我们说了struct定义出来的复杂数据类型和基本数据类型是一样的地位,都是类型,那么自然的定义变量的方式也是一样的;
基本数据类型是怎么定义的我们就怎么定义:
在这里插入图片描述
红色部分是我们的类型,黑色部分是变量;

如何赋初值?

赋初值就和基本数据类型有所区别了,基本数据类型,只有一个,我们只需要=进行赋初值就行了;但是复杂数据类型不一样啊,它里面有多个基本数据类型,为了能给每个都赋值到位,我们应该用{ }的形式进行赋值操作,其中格式按照基本数据类型对应的格式就好了:
比如:

struct Person p1={"张三","man",19};

必须按照基本数据类型的顺序正确赋值,不能随意颠倒顺序;!!!
就像数组那样一样赋值就像了;
我们还有一直赋初值的方式:
上面一种方式不是要求我们不能颠倒赋值顺序嘛,这一种方式就是破解上一个方式的:

struct Person p1={.age=19,.sex="man",.name="张三"};

像这样的赋值方式相当于我们“指哪打哪”想给那个成员变量赋值,就给那个成员变量赋值;这里我们讲到了**.**(点)这个操作符,也就是访问结构体的方式;

结构体的访问

既然我们定义好了结构体同时也对结构体进行了相应的初始化,那么我们应该如何去访问结构体里面的数据呢?
C语言为我们提供了两个操作数去解决这个问题:
在这里插入图片描述
.操作符和->操作符;
.操作符是配合着普通结构体变量来使用的;
->操作符是配合结构体指针来使用的;
具体怎么使用呢,我们来具体看一看:
1、.操作符使用
在这里插入图片描述
2、->操作符使用
在这里插入图片描述

结构体的嵌套使用

当然我们的结构体不是只能由基本数据类型组成,还可以由结构体组成:
比如说:
在这里插入图片描述

注意事项

**1、**结构体并不一定要有名字,匿名结构体(没有名字的结构体也是可以的),但是该结构只能用一次;什么意思呢?
我们来看代码;
在这里插入图片描述
我们不能单独将匿名结构体拿出来创建变量,我们只能在定义结构体的的时候随便创建一个变量(类似于左边图),这就是为什么匿名结构体只能使用一次?
那么如果现在有我定义了两个一模一样的匿名结构体,编译器会认为这两个结构体是同一个数据类型吗?
我们来验证一下:
测试代码:

struct 
{
	char name[20];
	char sex[5];
	char id[20];
	int age;
}str1 = { "张三","man","110112119112",10 };
struct
{
	char name[20];
	char sex[5];
	char id[20];
	int age;
}*str2;

int main()
{
	str2 = &str1;
	return 0;
}

在这里插入图片描述
我们可以看到虽然编译器让段代码通过了,但是还是保了个警告;
我们知道“=”两边的数据类型必须一样,现在报了警告,这说明现在“=”两边的数据类型出现了不统一,这也就说明了虽然两个匿名结构体虽然成员变量完全一模一样,但是在编译器看来他们仍然是两个不同的数据类型;当然对于两个完全相同的有名结构来说就不会存在这样的情况,编译器会直接给你报错误,说你重定义了这个数据类型:
在这里插入图片描述
**2、**对于结构体来说,它的类型名字一般都比较长,我们有没有什么办法使它的名字变得短一点;当然可以,我们可以利用typedef关键字对类型进行重名名,比如说:
在这里插入图片描述
我们利用了typedef使得原来冗长的数据类型变得简单起来了,虽然简单起来了,我们确不能滥用,因为我们利用typedef过后,代码可读性变差了,就比如:Person,单单放在这里,我们可以说他联合体类型、也可以说他是枚举类型同时也可以说他是结构体类型,给人的可读性不是太友好;当然这只是一方面的原因,同时一些公式也会对此做一些代码规范的要求,有些公式可能为了代码的可读性,禁止使用typedef,当然有的公司则无此限制;具体怎么使用看个人情况;
**3、**我们定义一个结构体最好定义在函数的外面,不要再函数内部定义,这样的话我们才能进行更多的操作和减少不必要的麻烦;
**4、**结构体虽然能嵌套使用,但是不能嵌套自己;
比如这样:
在这里插入图片描述
为什么呢?
你看我们好像无法计算出struct Person这个结构体的大小对吧,我们知道name是20个字节,那struct Person是多大呢?你看我们是不是又回到了原点,似乎该计算过程在无限递归下去,我们无法求的一个准确的大小,编译器也就无法为其开辟一个合理的空间;
但是呢我们可以嵌套自己类型的指针啊,你想啊指针的大小是固定的(4/8)我们可以明确算出结构体的大小啊!
在这里插入图片描述
事实的确是这样的!

结构体的大小

既然上面我们谈到了结构体的大小问题,那我们便来看看一个结构体,
并算一算结构体的大小是多少;

struct Person
{
	char a;
	char b;
	int c;
};

我们来算一算这个结构体的大小
可能我们第一次算的时候会算成6;那么结果是不是呢,我们运行一下:
在这里插入图片描述
我们可以看到运行结果是8,这是为什么??
这主要是由于啊,结构体的大小并不是简单的相加就解决的,对于结构体来说,它们存在这内存对齐这一说法;
何为内存对齐?

内存对齐

内存对齐:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的值为8
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

下面我们就来具体应用一下该规则(VS2019环境,默认对齐数:8):
在这里插入图片描述
下面我们来放空间:
在这里插入图片描述
这也就是为什么该结构体大小是8的原因;
既然明白了原理,我们立刻趁热打铁,继续算几个:

struct S2
{
char c1;
int  c2
char c3;
};
struct S3
{
double d;
char c;
int i;
};

我们画一个s3吧,另一个当作练习:
在这里插入图片描述
空间分布:
在这里插入图片描述
运行结果:
在这里插入图片描述
的确如此;
那么我们现在来看一个结构体嵌套的结构体的大小:

struct S3
{
double d;
char c;
int i;
};
struct S4
{
char a;
int b;
struct S3 e;
};

由上面可知S3的总大小是16个字节,然后呢根据内存对齐的第4条规则,我们可以得出S3结构体的对齐数为其成员对齐数的最大值,也就是:8,因此S3的对齐数为8;
接下来我们算一下对齐数表:
在这里插入图片描述
接下来分配内存:
在这里插入图片描述
运行一下:
在这里插入图片描述
的确如此!!!

默认对齐数的修改

既然由默认对齐数这个东西,我们能不能去修改掉它呢?
当然可以;

我们可以通过预处理指令来修改
比如#pragma pack(4)//修改默认对齐数为4
#pragma pack()//取消默认对齐数修改

下面我们还是来计算

struct S3
{
double d;
char c;
int i;
};

我们快速计算一下:
0~7//d占用
8//c占用
9~11//浪费
12~15//i占用
总的:16字节,最大对齐数是4,16是4的整数倍,故最后结构体总大小为:16字节;
运行截图:
在这里插入图片描述
同时我们可以利用offsetof宏函数来计算一下每个成员变量的偏移量,同时验证我们的推理过程是否正确;
0~7//d从偏移量为0占用
8//c从偏移量为8占用
9~11//浪费
12~15//i从偏移量为12占用
在使用前先了解一下offsetof宏函数:
在这里插入图片描述

包含在同文件<stddef.h>里面;
运行结果:
在这里插入图片描述
的确如此;

为什么存在内存对齐?

从两个方面来说:

1、平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
比如说:32位平台,一次性只能读取四个字节的数据;

struct S
{
char a;
int i;
};

在这里插入图片描述

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起。

结构体传参

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;
}

上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数。
原因:
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结论:
结构体传参的时候,首选传结构体的地址。

位段

结构体的基础知识讲完了,我们就来谈谈结构的位段;

什么是位段?

1、位段与结构体的声明是类似的,但是位段的成员必须是int、unsigned int、signedint、char;
2、位段的成员名后面有一个“ : ”和一个数字,以" ; "结尾;
3、访问的方式与结构体一样(可以通过点操作符和箭头操作符);
4、位段不存在内存对齐;

具体实例:

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

首先我们来解析一下,这个位段的位是什么意思,以及" : "后面的数字代表什么意思?
首先,位嘛,就是比特位的那个位,而冒号后面的数字,就表示这个变量要占用几个比特位;比如上面结构体中,int _a:2;就表示成员变量_a只需要使用2个比特位就够了,不在需要一个int的大小;

位段的内存分配

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

在讨论位段的内存分配之前,我们先来算一个位段的大小:

struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};

在这里插入图片描述
我们可以看到该结构只占3个字节,其实按照我们之前的理论我们可以得出相应的结论;
是char类型的位段;
编译器一上来先开辟1个字节,给你用,用完了无,我在给你开辟;
然后a说我要3个比特位,还剩下5个比特位;
b说我要4个比特位,还剩下1个比特位;
c说我要5个比特位,这时候只剩下一个1特位,不够啊,那我再给你开辟一个字节;嗯,现在空间够了,但是我们现在面临一个选择的问题,就是上一次剩下的那个字节,我到底是用还是不用?这个问题C语言并没有做出明确规定,是由编译器决定的,这是位段可移植性差的一个点,再VS2019中,编译器是不用的(博主用的VS2019),那我们现在假设不用那么我在新开的一个字节中用了5个比特位,还剩下3比特位;
d说,我要4比特位,不够啊,编译器在开一个字节,这时就够了,总体来说,编译器一共就开辟了3个字节,因此,我们sizeof算出来的就是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;

首先,我们直到S会占3字节,我们把这3个字节全部用0初始化:
则这3个字节的每个位里面放的都是0;
现在,我们将10的放进去:
10
补码:00000000000000000000000000001010
我们只存3位进去,也就是只有后3位,010,
在这里插入图片描述
但是现在我们面临一个问题选择问题?
我们是从左边还是右边来使用这一个字节?这是不确定的,C语言没有明确规定,完全取决于编译器,因此这是位段可移植性差的一个点;
我们假设是从右边开始存的,那么该字节内容就变为了:
在这里插入图片描述
然后我们再来看b,b=12
12:
补码:
00000000000000000000000000001100,我们只存4位进去,也就是(1100);更新一下第一字节里面的内容;
在这里插入图片描述
现在s.c=3;
3的补码:00000000000000000000000000000011
我们要存5个比特位进去(00011),现在不够了,我们在开辟一个字节,
在这里插入图片描述
但是现在我们又面临一个选择的问题,我们用绿色线圈起来的那个位,我们到底用不用?还是直接从新的字节开始?对于这样的问题C语言没有做出明确规定,用还是不用这个问题却决于编译器,这也是位段可移植性差的又一个原因;现在我们接着假设,这个比特位咱们不用,那么我们新的内容就是:
在这里插入图片描述
接着s.d=4;
4的补码:00000000000000000000000000000100
我们只存4比特位进去(0100),不够啊,我们再开一个字节:
在这里插入图片描述
在这里插入图片描述
我们来算一下这3个字节对应的16进制:62 03 04
我们看到的就应该是这样的,我们来验证一下:

在这里插入图片描述
我们可以看到的确是这样,那说明我们之前的假设刚好假设正确;事实上这是VS2019对于位段的处理方法;

位段的“取”

既然我们利用位段存了数据,我们得取出来啊?不然我们存进去了,取不出来,有啥用啊;
根据我们刚才存进去的样子:
在这里插入图片描述
我们以%d打印s.a那么a实际存的是010,最高位为0,我们会发生整型提升,提升成int类型:
既printf实际打印的是
00000000000000000000000000000010
原码就是2;
在这里插入图片描述
我们再来看b,b里面实际存的是1100,%d打印发生整型提升:
11111111111111111111111111111100%d打印,符号位为1,为负数
1000000000000000000000000011
1000000000000000000000000100
也就是-4;
在这里插入图片描述

如果是%u打印,就是直接打印:11111111111111111111111111111100
也就是一个很大的数:

在这里插入图片描述

位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
    (对于一个int位段的的位段,我们一次性会开辟4字节,但是这4字节的最高位会不会北当成符号位,是不确定的,是由编译器决定的)
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
    器会出问题。
    比如:
struct S
{
int a:2;
int b:20;
int C:30;
}

在32位平台下,int占4个字节,但是在早期16位平台下int占2个字节,我们如果要给b分给20比特位,在32位平台下没问题,但是在16位平台下就跑不过去了;
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的。

总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

位段的应用

在这里插入图片描述
位段的最大优点就在于可以最大限度的节省空间,就比如,对于一些数据来说,我们只需要4比特位来存储就够了,就没必要开辟一个int来存,这样大大节省了空间!!!

【小白打基础系列】浅谈对结构体理解
elegant_cheater的博客
03-25 363
本文是学习过程中的思考与总结,存在许多不妥之处,若有幸被大牛指点出纰漏,必当及时更正,感激不尽! 一、什么是结构体? 二、结构体数组与结构体指针 三、结构体指针作为函数参数 一、什么是结构体? 可以把结构体当作自定义的数据类型,它相当于一个容器,里面容纳了许多的基本数据类型(int ,float ,char ,double…诸如此类)。姑且把结构体所容纳的变量叫做成员变量。 struct s...
STM32_GPIO结构体理解
weixin_41804528的博客
02-21 563
在这个例子中,结构体类型Person有两个成员:name和age。name成员是一个字符数组,用于存储人的姓名;age成员是一个整数,用于存储人的年龄。结构体类型的定义使用关键字struct,后跟结构体名称和一对花括号{},在花括号中定义结构体的成员。每个成员的定义包括成员的数据类型和成员的名称。是一种自定义的数据类型,它允许将不同类型的数据组合在一起,形成一个新的数据类型。结构体类型由多个成员组成,每个成员可以是不同的数据类型。这样,我们可以使用结构体类型来组织相关的数据对数据进行操作、传递和存储。
C语言必学知识点六】自定义类型——结构体
最新发布
蒙奇D索大的博客
09-02 1654
C语言必学知识点六】自定义类型——结构体 详细介绍结构体的声明、使用的相关内容……
<C语言>结构体理解
WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人.
08-14 757
题目:关于C语言结构体理解 作者:wsg 时间:2017年8月14日 一、先来看看理论点的不好理解结构体定义: { ·概念:结构体(structure)是由各种类型组成的的复合数据类型。 ·定义一个结构体类型的语法如下: struct {成员列表}; ·定义一个结构体变量的3种形式: ①常规形式: struct {成员列表}; struct ; ②与类型定
深入理解结构体
ll1175555的博客
04-13 530
一.结构体 1.结构体类型的声明 结构体是一些值得集合,这些值被称为成员变量,结构体的每一个成员可以是不同类型的变量。 声明: struct tag { member - list; }variable-list; 那么描述一个学生该怎么描述呢? struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }; //分号不能丢 声明结构体的时候,还...
signal函数和sigaction结构体理解
我的新博客
04-08 8041
signal函数和sigaction结构体理解 一,signal函数 详细介绍: http://blog.csdn.net/ta893115871/article/details/7475095 #include #include #include /* SIG_IGN忽略/SIG_DFL默认,这俩宏也可以作为信号处理函数。同时SIGSTOP/SIGKILL这俩信号
C++ 位图bmp相关的几个结构体理解
往南的博客
11-16 908
int main(){ /** * 说明:BITMAPFILEHEADER(位图文件头),是一个固定长度为14个字节的结构体 * 结构体属性: * bfType 位图文件类型 * bfSize 位图文件大小 * bfOffBits 从文件头到实际的位图数据的偏移字节数 */ BITMAPFILEHEADER bitmapFileHeader; /** * 说明:BITMAPINFOHEADER(位图信息头),是一个固定长度为40个字节的结构体 * 结构体属性: .
深入理解结构体中占位符的用法
09-05
C语言中,结构体struct)是一种复合数据类型,允许我们将多个不同类型的变量组合成一个单一的结构。在某些情况下,我们可能需要在结构体中精确地控制每个...理解这些概念对于编写高效且内存敏感的C程序至关重要。
C语言——结构体(全)
热门推荐
weixin_48560325的博客
04-19 11万+
一、结构体的设计 C语言提供了基本的数据结构,例如 char 、short 、int 、float....等类型;这些偶称为内置类型。怎样设计出来属于自己的类型? 程序员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。 结构体的定义形式为 struct 结构体名 { 成员列表(可以是基本的数据类型,指针,数组或其他结构类型) }; 举个例子来说吧; 客观事务(实体)是复杂的,要描述它必须从多方面进行;也就是用不同的数据类型来描述不同的方面;用学生实体来说: ..
结构体
zjqx_w的博客
07-20 1239
一、什么是结构体 1、C语言构造类型       构造数据类型:构造数据类型是根据已经定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
如何理解结构体
u013488563的专栏
12-29 1671
话不多说,摘录网上的理解,貌似理解一些了。 typedef struct Node   {        Element data;        struct Node * next;   }Node, * Linklist; typedef struct node { int data; PNode next; }PNode,*Linklist;
结构体理解( 结构体数组、指针、函数)
KongBai_ren的博客
09-08 453
结构体的名称只能用来表示该结构体,系统编译时并不对它分配内存;当定义了结构体变量时,系统才会给结构体变量分配内存;可以说,结构体名称没有地址,结构体变量有地址。结构体有简单的结构体,也有数组结构体、指针结构体。通定义过结构体变量,可以访问结构体里的成员变量。
结构体的一些理解
Ljiyu0506的博客
02-15 88
结构体的一些理解
结构体理解(创建,初始化,内存对齐,位段,枚举,联合)
W_J_F_的博客
04-20 638
1:结构体类型创建 2:结构体初始化 3:结构体内存对齐 4:位段,位段计算机大小。 5:枚举+联合。 struct 结构体名{ 结构体所包含的变量或数组 }; 结构体的成员包括: 标量,数组,指针,其他结构体结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员
什么是结构体
neixinqiangda的专栏
10-21 668
<br />什么是结构体?<br /> <br />简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。<br /> <br />定义结构体使用st
结构体是什么?
2301_77580623的博客
10-24 645
其实很简单,结构体变量的初始化使⽤{}.可以看到,我们既能够在结构体末尾定义结构体变量,也能在外面定义结构体变量。//初始化:定义变量的同时赋初值。当然也可以定义结构体变量跟赋值同时操作。多类型结构体也是一样的操作,结构体镶嵌初始化也是如此,看下图。切记一点,什么类型的结构体变量初始化就定义什么类型变量。而且一定要按照结构体成员位置顺序初始化。
對結構體的認識
duguduchong的专栏
11-03 514
1結構體實際上是特殊的類 結構體是只有成員變量的類,且都是公共成員變量。 2.結構體也可以有構造函數 結構體既然是類,自然就可以擁有構造函數,通常其函數體為空,故可以省略。 以下是驗證過的可編譯的結構體 struct STRUCT_DEMO { int a; int b; bool c; STRUCT_DEMO() { a = 0; b = 1; c = fal
写文章

热门文章

  • C语言简易小游戏 42058
  • C语言300行代码实现扫雷(可展开+可标记+可更改困难级别+内附图形界面版本) 10429
  • 快速入门EasyX图形编程 7162
  • ProtoBuf的学习和使用(C++) 4617
  • C语言三大结构 4520

分类专栏

  • QT 14篇
  • redis 5篇
  • Linux 17篇
  • 项目 1篇
  • C语言 34篇
  • ProtoBuf学习 1篇
  • git学习笔记 1篇
  • MySQL 14篇
  • 数据结构(初阶) 23篇
  • C++ 21篇

最新评论

  • C语言简易小游戏

    风雪易宁: 为什么我编译后没一个能用?表情包

  • C语言简易小游戏

    可爱的十三婆: 深入浅出,不忽悠。果断关注!

  • C语言简易小游戏

    南猿北者: 不用啊,秒编译

  • C语言简易小游戏

    xiu.873: 大佬,果断关注!提问:画爱心的那个需要编译很长吗表情包表情包

  • ProtoBuf的学习和使用(C++)

    南猿北者: 永远支持哥哥表情包表情包表情包

大家在看

  • 大模型LangChain框架基础与使用示例
  • makefile注释详解 16
  • jsp高校教室场馆资产管理系统bzd6c(程序+源码+数据库+调试部署+开发环境)
  • 排列组合问题之圆形分布 2
  • Kafka原理剖析之「Purgatory(炼狱 | 时间轮)」 19

最新文章

  • Qt界面优化
  • Qt系统机制
  • Qt事件机制
2024年19篇
2023年50篇
2022年65篇

目录

目录

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南猿北者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家河南佛像玻璃钢彩绘雕塑订做廊坊玻璃钢仿真水果雕塑厂家金华抽象玻璃钢雕塑生产厂家南宁大型商场中庭美陈花艺盐城玻璃钢抽象人物雕塑供货商江苏拉丝玻璃钢雕塑品牌企业商场美陈是什么概述玻璃钢人像雕塑生产厂家揭阳玻璃钢起舞人物雕塑义乌玻璃钢雕塑企业济南金百盈玻璃钢雕塑加工厂组合式玻璃钢花盆有哪些外贸玻璃钢艺术雕塑辽宁商场创意商业美陈传播福建大型商场美陈报价嘉峪关大型玻璃钢雕塑多少钱上海大型商场美陈生产公司商场中秋节美陈装饰动物玻璃钢雕塑方法富阳区玻璃钢金属雕塑哪家好佳木斯玻璃钢雕塑设计江苏拉丝玻璃钢雕塑性价比高玻璃钢雕塑厂家联系方式玻璃钢雕塑市场分析冀州玻璃钢伟人像雕塑福建步行街玻璃钢雕塑设计尚雕坊玻璃钢雕塑制作过程玻璃钢雕塑童男童女上海有吗呈贡生产玻璃钢雕塑厂家贵不贵徐州玻璃钢雕塑厂商销售香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化