《C语言程序设计 第4版》笔记和代码 第十二章 数据体和数据结构基础
12.1从基本数据类型到抽象数据类型
1 所有的程序设计语言都不能将所有复杂数据对象作为其基本数据类型,因此需要允许用户自定义数据类型,在C语言中,就存在构造数据类型(复合数据类型)。
2 结构体是构造数据类型的一种经典代表。
3 抽象数据类型是不再单纯是一组值的集合,还包括作用在值集上操作的集合,且类型的表示细节和操作的实现对外是不可见的。
4 C++中的类是抽象数据的一种具体实现,也是面向对象程序设计语言中的一个重要概念,但是不能将C++看成是带类的C。
12.2 结构体的定义
1 数组的存储方式存在一些问题,如:(1)分配内存不集中,寻址效率低;(2)对数组赋初值时容易发生错位;(3)结构显得零散,不易管理。
2 数组适合对具有相同属性的数据进行批处理;而结构体将不同类型的数据成员组织到统一的名字下;共用体虽然也能表示逻辑相关的不同类型的集合,但是数据成员是情景互斥的。
3 结构体模板的格式如下:
注意,结构体模板并未声明结构体类型的变量,因此不会被分配内存。
4 C语言有两种方式定义结构体变量.
5 关键字typedef可用于为系统固有的或自定义的数据类型定义一个别名,它只是定义一个新的名字,而不是定义一种新的数据类型。
6 结构体变量的初始化格式:
结构体类型 结构体变量={值1,值2……值n};
7 结构体可以实现嵌套,即在一个结构体中包含了另一个结构体作为其成员。
8 访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符),其格式为:
结构体变量名 . 成员名
9 出现结构体嵌套时,必须以级联方式访问结构体成员,也就是通过成员选择运算符逐级找到最底层的成员再引用。
例12.1见文末
10 C语言允许对具有相同结构体类型的变量进行整体赋值,如stu1=stu2;
11 并非所有的结构体成员都可以用赋值运算符来赋值,对字符数组类型的结构体成员进行赋值时,必须使用字符串处理函数strcpy()。
12 结构体类型的声明既可以放在所有函数体的外部(全局声明,可以被所有函数使用),也可以放在函数体的内部(局部声明,只能再本函数体内使用)。
13 结构体变量的地址是结构体变量所占内存空间的首地址,而结构体成员的地址值与结构体成员再结构体中所处的位置以及该成员所占内存的字节数有关。
例12.2见文末
14 系统为结构体变量分配内存的大小,或者说结构体类型所占内存的字节数,并非是所有成员所占内存字节数的总和,它不仅与所定义的结构体类型有关,还与计算机系统本身有关。
12.3 结构体数组的定义和初始化
1 结构体数组的定义格式为:
结构体类型 结构体变量[数量];
2 可以在定义时初始化结构体数组,否则其他数组元素被系统自动赋值为0。
例12.3见文末
12.4 结构体指针的定义和初始化
1 如果已经声明了STUDENT的结构体类型,那么指向该结构类型的指针变量的方法为:
STUDENT *pt; //指针变量pt的值是随机值
为了使pt 指向确定的存储单元,需要对指针变量进行初始化,如:
pt=&stu1;
以上两条语句等价于:
STUDENT *pt=&stu1;
2 访问指针变量指向的结构体成员有两种方式:(一)使用成员选择符;(二)使用指向运算符(也称箭头运算符)。
3 使用箭头运算符访问结构体成员的标准形式为:
pt->studentID=1003101221;
等价于
(*pt).studentID=1002101221;//不常用
4 访问嵌套结构体指针变量下的成员,通常结合成员选择符和指向运算符,如:
pt->birthday.year=2002;
12.5 向函数传递结构体
1 向函数体传递结构体有三种方法。
2 方法一:用结构体的单个成员作为函数参数,向函数传递结构体的单个成员。这种方法与普通类型的变量作为函数实参没有区别,都是按值调用。
3 方法二:用结构体变量作函数参数,向函数传递结构体的完整结构。通过这种方法,可以在函数内用成员选择运算符引用结构体其他成员,同样是按值传递,但是时空开销大,并且只能当行参和实参是同一结构体才可以使用。
4 方法三:用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。这种方法属于传地址调用,效率更高。
例12.4见文末
5 使用方法一和方法二,结构体变量的成员值是不能在被调函数中被修改,而方法三可以被修改。
例12.5~例12.7见文末
12.6 共用体
1 共用体也称为联合,是将不同类型的数据组织在一起共同占有同一段内存的一种构造数据类型。
2 共用体与结构体的声明方法类似,只是关键字变成union。
例12.8见文末
3 共用体所占的内存空间大小取决于成员中占内存空间最多的那个成员变量。
4 共用体采用与开始地址对齐的方式分配内存空间。
5 共用体通过覆盖技术来实现内存的共用,因此在每一瞬起作用的成员是最后一次被赋值的成员。
6 不能为共用体的所有成员同时初始化。
7 共用体不能进行比较操作,也不能作为函数参数。
12.7 枚举数据类型
1 当某些量仅由有限个数据值组成时,通常用枚举类型来表示。
2 枚举描述的是一组整型值的集合,需要使用关键字enum来定义。
3 枚举类型的声明格式为:
enum 枚举标签{枚举常量1,枚举常量2……枚举常量n};
4 枚举常量的定义格式为:
enum 枚举标签 枚举变量名;
可以将枚举常量赋值给对应的枚举标签。
5 当枚举标签和枚举变量放在一起定义时,枚举标签可以省略不写,如:
enum {no,yes,none} answer;
6 虽然枚举标签后面的花括号内的标识符代表枚举型变量的可能取值,但其值是整型常数,不是字符串,因此不能作为字符串来使用。
12.8 动态数据结构—单向链表
1 动态数据结构是利用动态内存分配,使用结构体并且配合指针来实现的一种数据结构。
2 在结构体声明时不能包含结构体类型成员,但可以包含指向本结构体类型的指针成员。
3 链表实际是链式存储、顺序访问的线性表,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的,链表长度是不固定的。
4 链表的每一个元素称为一个节点,节点包含数据域和指针域两部分。
5 节点的数据域用于存储本身的数据信息,节点的指针域是一个结构体指针,用于存储其直接后继的节点信息,当其值为空指针(NULL)时,表示链表结束。
6 链表中还需有一个指向链表的起始节点的头指针变量。
7 只包含一个指针域,由n个节点链接形成的链表就被称为线性链表或者单向链表。
8 链表只能顺序访问,不能随机访问,因此最大的缺点是容易出现断链,且断链后影响大。
9 单向链表的建立考虑(1)若原链表为空表,则将新建节点置为头结点;(2)若原链表非空,则将新建节点添加到表尾.
例12.9见文末
10 单向链表的删除考虑 (1)若原链表为空表,则无须删除,直接退出程序;(2)若找到的待删除节点是头节点,则将头指针变量指向当前节点的下一个节点;(3)若找到的待删除节点不是头结点,则将前一节点的指针域指向当前节点的下一节点;(4)搜索到表尾,依旧未找到待删除节点,则提示未找到.
例12.10见文末
11 单向链表的插入考虑 (1)若原链表为空表,则将新节点作为头结点;(2)若原链表非空,则按节点值的大小确定插入新节点;(3)若在表尾插入新节点,则末节点指针域指向新节点.
例12.11见文末
代码
12.1a
演示结构体变量的赋值与用于方法,从键盘输入数据
/12.1a演示结构体变量的赋值与用于方法
#include<stdio.h>
typedef struct date
{int year;int month;int day;}DATE;//别名为DATEtypedef struct student{long studentID;char studentName[10];char studentSex;DATE birthday;//嵌套结构体 int score[4]; }STUDENT;
int main(void)
{STUDENT stu1={100210121,"王刚",'M',{1991,5,19},{72,83,90,82}};//初始化,赋值用花括号 STUDENT stu2;//定义一个相同结构体类型的结构体变量stu2stu2=stu1;//相同结构体类型之间进行赋值printf("stu2:%10ld%8s%3c%6d/%02d/%02d%4d%4d%4d%4d\n",//这里的%02d表示输出数据时若左边有多余位则补0stu2.studentID,stu2.studentName,stu2.studentSex,//对应学号、姓名、性别 stu2.birthday.year,stu2.birthday.month,stu2.birthday.day,//对应出生年月日stu2.score[0], stu2.score[1], stu2.score[2], stu2.score[3]); return 0;}
12.1b
演示结构体变量的赋值与用于方法,从键盘输入数据
//12.1b演示结构体变量的赋值与用于方法,从键盘输入数据
#include<stdio.h>
typedef struct date
{int year;int month;int day;}DATE;//别名为DATEtypedef struct student{long studentID;char studentName[10];char studentSex;DATE birthday;//嵌套结构体 int score[4]; }STUDENT;
int main(void)
{STUDENT stu1,stu2; //定义结构体变量int i;//用于控制成绩输入printf("Input a recoed:\n");scanf("%ld",&stu1.studentID);scanf("%s",&stu1.studentName);scanf(" %c",&stu1.studentSex);//%c前面有一个空格 scanf("%d",&stu1.birthday.year);scanf("%d",&stu1.birthday.month);scanf("%d",&stu1.birthday.day);for(i=0;i<4;i++){scanf("%d",&stu1.score[i]);}stu2=stu1;//相同结构体类型之间进行赋值printf("&stu2=%p\n",&stu2);//打印stu2的地址 printf("stu2:%10ld%8s%3c%6d/%02d/%02d%4d%4d%4d%4d\n",//这里的%02d表示输出数据时若左边有多余位则补0stu2.studentID,stu2.studentName,stu2.studentSex,//对应学号、姓名、性别 stu2.birthday.year,stu2.birthday.month,stu2.birthday.day,//对应出生年月日stu2.score[0], stu2.score[1], stu2.score[2], stu2.score[3]); return 0;}
12.2
演示结构体所占字节数的计算方法
//12.2 演示结构体所占字节数的计算方法
#include<stdio.h>
typedef struct sample
{char m1;int m2;char m3;
}SAMPLE;
int main(void)
{SAMPLE s={'a',2,'b'};printf("bytes=%d\n",sizeof(s));return 0;}
12.3
利用结构体数组计算每个学生的4门课程的平均分
//例12.3 利用结构体数组计算每个学生的4门课程的平均分
#include<stdio.h>
typedef struct date
{int year;int month;int day;}DATE;//别名为DATEtypedef struct student{long studentID;char studentName[10];char studentSex;DATE birthday;//嵌套结构体 int score[4]; }STUDENT;
int main(void)
{int i,j,sum[30]; STUDENT stu[30]={{100210121,"张三",'M',{1991,5,19},{72,93,80,52}},{100210122,"李四",'F',{1990,3,22},{83,93,73,12}},{100210123,"王二",'F',{1991,11,9},{92,73,93,86}},{100210124,"赵五",'M',{1991,5,5},{92,84,95,86}}};//注意花括号的对应for(i=0;i<4;i++){sum[i]=0;for(j=0;j<4;j++){sum[i]=sum[i]+stu[i].score[j];}printf("%10ld%8s%3c%6d/%02d/%02d%4d%4d%4d%4d%6.1f\n",stu[i].studentID,stu[i].studentName,stu[i].studentSex,//对应学号、姓名、性别 stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,//对应出生年月日stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3],sum[i]/4.0); } return 0;}
12.4
演示结构体变量作函数实参实现传值调用
//12.4 演示结构体变量作函数实参实现传值调用
#include<stdio.h>
struct date
{int year;int month;int day;
};//无别名,不要忘记分号
void Func(struct date p)//结构体变量作函数形参
{p.year=2000;p.month=5;p.day=22;}
int main(void)
{struct date d;d.year=1999;d.month=4;d.day=23;printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);Func(d);printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);return 0;
}
12.5
修改12.4,改用结构体指针变量作函数实参
//12.5 修改12.4,改用结构体指针变量作函数实参
#include<stdio.h>
struct date
{int year;int month;int day;
};//无别名,不要忘记分号
void Func(struct date *pt)//结构体zz变量作函数形参
{pt->year=2000;//指针运算符 pt->month=5;pt->day=22;}
int main(void)
{struct date d;d.year=1999;d.month=4;d.day=23;printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);Func(&d);//传地址调用 printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);return 0;
}
12.6
从函数返回结构体变量的值
//12.6 从函数返回结构体变量的值
#include<stdio.h>
struct date
{int year;int month;int day;
};
struct date Func(struct date p)//返回类型是struct date型
{p.year=2000;p.month=5;p.day=22;return p;}
int main(void)
{struct date d;d.year=1999;d.month=4;d.day=23;printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);d=Func(d);printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);return 0;
}
12.7
修改12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分
//例12.7 修改12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分
#include<stdio.h>
#define N 30
typedef struct date
{int year;int month;int day;}DATE;//别名为DATEtypedef struct student{long studentID;char studentName[10];char studentSex;DATE birthday;//嵌套结构体 int score[4]; }STUDENT;
void InputScore(STUDENT stu[],int n,int m);
void AverScore(STUDENT stu[],float aver[],int n,int m);
void PrintScore(STUDENT stu[],float aver[],int n,int m);
int main(void)
{float aver[N];STUDENT stu[N];int n;printf("How many students?");scanf("%d",&n);InputScore(stu,n,4);AverScore(stu,aver,n,4);PrintScore(stu,aver,n,4);return 0;}
void InputScore(STUDENT stu[],int n,int m){int i,j;for(i=0;i<n;i++){printf("Input recore %d:\n",i+1);scanf("%ld",&stu[i].studentID);scanf("%s",stu[i].studentName);//这里无取地址符scanf(" %c",&stu[i].studentSex);scanf("%d",&stu[i].birthday.year);scanf("%d",&stu[i].birthday.month);scanf("%d",&stu[i].birthday.day);for(j=0;j<m;j++){scanf("%d",&stu[i].score[j]);}}
}
void AverScore(STUDENT stu[],float aver[],int n,int m){int i,j,sum[N];for(i=0;i<n;i++){sum[i]=0;for(j=0;j<4;j++){sum[i]=sum[i]+stu[i].score[j]; }aver[i]=(float)sum[i]/m;}
}
void PrintScore(STUDENT stu[],float aver[],int n,int m){int i,j;printf("Result:\n");for(i=0;i<n;i++){printf("%10ld%8s%3c%6d/%02d/%02d",stu[i].studentID,stu[i].studentName,stu[i].studentSex,//对应学号、姓名、性别 stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day); //对应出生年月日for(j=0;j<m;j++){printf("%4d",stu[i].score[j]);}printf("%6.1f\n",aver[i]);}
}
12.8
演示共用体所占内存字节数的计算方法
//12.8 演示共用体所占内存字节数的计算方法
#include<stdio.h>
union sample
{char i;int ch;char f;
};
typedef union sample SAMPLE;
int main(void)
{printf("bytes=%d\n",sizeof(SAMPLE));return 0;}
12.9
单向链表的建立
//12.9 单向链表的建立
#include<stdio.h>
#include<stdlib.h>
struct link *AppendNode(struct link *head);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);
struct link
{int data;struct link *next;
};int main(void)
{int i=0;char c;struct link *head=NULL;//链表的头指针printf("Do you want to append a new node(Y/N)?");scanf(" %c",&c);while(c=='Y'||c=='y'){head=AppendNode(head);//向head为头指针的链表末添加节点DisplyNode(head);//显示当前链表中的各节点信息printf("Do you want to append a new node(Y/N)?");scanf(" %c",&c);i++; } printf("%d new nodes have been apended!\n",i);DeleteMemory(head);//释放所有动态分配的内存 return 0;
}
//函数功能:新建一个节点并添加到链表末尾,返回添加节点后的链表的头指针
struct link *AppendNode(struct link *head)
{struct link *p=NULL,*pr=head;int data;p=(struct link *)malloc(sizeof(struct link));//p指向新建节点if(p==NULL){printf("No enough memory to allocate!\n");//提醒用户分配失败exit(0);//退出程序 } if(head==NULL){//原链表为空表 head=p;//新建节点置为头结点 }else{while(pr->next!=NULL)//未到末尾,就移动pr,让pr指向表尾{pr=pr->next;//让pr指向下一个节点 }pr->next=p;//末节点的指针域指向新建节点 }printf("Input node data:");scanf("%d",&data);p->data=data;p->next=NULL;//将新建节点置为表尾 return head;} //函数功能:显示链表中所有节点的节点号和该节点中的数据项void DisplyNode(struct link *head){struct link *p=head;int j=1;while(p!=NULL)//不是表尾{printf("%5d%10d\n",j,p->data);p=p->next;j++;} } //函数功能:释放head指向的链表中所有节点占用的内存void DeleteMemory(struct link *head){struct link *p=head,*pr=NULL;while(p!=NULL){pr=p;//用pr保存当前节点 p=p->next;//移动指针,使其指向下一个节点 free(pr);//释放当前节点 }}
12.10
单向链表的删除操作函数
//12.10 单向链表的删除操作函数
//函数功能:从head 指向的链表中删除一个节点,返回删除节点后的链表的头指针
struct link *DeleteNode(struct link *head,int nodeData)
{struct link *p=head,*pr=head;if(head==NULL)//空表{printf("Linked Table is empty!\n")return (head);} while(nodeData!=p->data&&p->next!=NULL)//未找到并且 未到表尾{pr=p;//pr保存当前节点 p=p->next; //指向下一节点 } if(nodeData==p->data)//找到待删除节点{if(p==head){head=p->next;//如果是头节点,就让头结点指向待删除节点的下一个节点 }else{pr->next=p->next;//前一节点的指针域指向待删除节点的下一个节点 }free(p);//释放删除节点的内存 }else //到来表尾依旧没有找到待删除节点{printf("This Node has nor been found!\n");} return head;}
12.11
单向链表的插入操作函数
//12.11单向链表的插入操作函数
//函数功能:在已按升序排序的链表中插入一个新节点,返回插入节点后的链表的头指针
struct link *InsertNode(struct link *head,int nodeData)
{struct link *pr=head,*p=head,*temp=NULL;p=(struct link *)malloc(sizeof(struct link));//p指向待插入节点 if(p=NULL){//内存分配失败 printf("No enough memory!\n");exit(0);}p->next=NULL;//指针域赋值为空 p->data=nodeData;//赋值数据 if(head==NULL){//空表 head=p;}else{while(pr->data<nodeData&&pr->next!=NULL){temp=pr;//用temp保存当前节点的指针 pr=pr->next;//指向下一节点 }if(pr->data>=nodeData){if(pr==head)//在头结点前插入 {p->next=head;//将新节点的指针域指向原链表的头节点 head=p;//让head指向新节点 }else//在链表之间插入 {pr=temp;p->next=pr->next;//新节点的指针域指向下一节点 pr->next=p;//前一节点的指针域指向新节点 }}else//在链表末尾插入 {pr->next=p;//末节点指向新节点 }}return head;}
相关文章:

《C语言程序设计 第4版》笔记和代码 第十二章 数据体和数据结构基础
12.1从基本数据类型到抽象数据类型 1 所有的程序设计语言都不能将所有复杂数据对象作为其基本数据类型,因此需要允许用户自定义数据类型,在C语言中,就存在构造数据类型(复合数据类型)。 2 结构体是构造数据类型的一种…...

学习记录——day26 进程间的通信 无名管道 无名管道 信号通信 特殊的信号处理
目录 一、进程间通信引入 二、无名管道 1、无名管道相关概念 2、无名管道的API接口函数 pipe(int pipefd[2]); 3、管道通信的特点 4、管道的读写特点 三、有名管道 1、有名管道:有名字的管道文件,其他进程可以调用 2、可以用于亲缘进程间的通信&…...
WHAT - xmlhttprequest vs fetch vs wretch
目录 前言1. XMLHttpRequest (XHR)2. fetch3. wretch总结 fetch1. 简洁性和易用性2. 错误处理3. 默认行为和功能扩展4. 请求和响应的处理5. 跨域请求和 CORS6. 现代 Web 开发需求 fetch vs xhr 代码示例使用 XMLHttpRequest使用 fetch代码对比 前言 根据标题我们可以知道今天主…...

吴恩达老师机器学习作业-ex7(聚类)
导入库,读取数据,查看数据类型等进行分析,可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…...
lombok 驼峰命名缺陷,导致后台获取参数为null的解决办法
1.问题: 下面是我定义一个请求类的属性,采用Lombok注解,自动构建get和set方法。 Schema(description "父组织编码", requiredMode Schema.RequiredMode.REQUIRED) private String pOrgCode; 遇到这种命名,你会发现在…...

【dockerpython】亲测有效!适合新手!docker创建conda镜像+容器使用(挂载、端口映射、gpu使用)+云镜像仓库教程
文章目录 docker基本概念简介配置镜像加速源创建conda镜像1. 写 Dockerfile文件2. 创建镜像3. 创建容器并测试 容器的使用1. wsl挂载2. 端口映射3. 补充-gpu 云镜像仓库使用1. 登录2. 将本地镜像上传至云镜像仓库3. 从云镜像仓库下载镜像到本地 docker基本概念简介 简单来讲&a…...
矩阵,求矩阵秩、逆矩阵
求矩阵秩的方法: 高斯消元法:通过行变换将矩阵化为行阶梯形矩阵,然后数非零行的数量。LU分解:通过分解矩阵成上下三角矩阵,计算非零对角元素的数量。SVD分解:通过奇异值分解,计算非零奇异值的数…...
指针和const
const int* ptr,int* const ptr,const int* const ptr 这三种指针定义有什么区别?用法有什么不同? 指向的地址是否可变指向的地址上存储的内容是否可变const属性const int* ptr可改变不可改*ptr具有const属性int* const pts不可改…...

基于C#调用文心一言大模型制作桌面软件(可改装接口)
目录 开发前的准备账号注册应用创建应用接入 开始开发创建项目设计界面使用 AK,SK 生成鉴权签名窗体代码 百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录 开发前的准备 账号注册 访问百度智能云平台,通过百度账号登录或手机号验证…...

VScode插件安装
一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code vscode 中文插件 Auto Rename Tag 闭合标签 Path Intellisense 一个非常实用的工具,它提供了文件路径的自动补全功能,可以极大地提高开发效率。路径自动补全、…...

《Milvus Cloud向量数据库指南》——高可用黄金标准:深入解析与业务策略考量
高可用黄金标准:深入解析与业务策略考量 在信息技术飞速发展的今天,高可用性(High Availability, HA)已成为衡量企业IT系统性能与稳定性的关键指标之一。它不仅仅关乎技术层面的优化与配置,更是企业保障业务连续性、提升客户体验、增强市场竞争力的重要基石。尽管高可用性…...

sqli-labs注入练习1,2关
sqli-labs第一关 判断是否存在sql注入 可见,根据输入数字的不同,结果也不同 判断sql语句是否是拼接,且是字符型还是数字型 由上可见,这关指定是字符型且存在sql注入漏洞 使用联合注入 第一步:首先知道表格有几列&…...

B站宋红康JAVA基础视频教程个人笔记chapter04
文章目录 1.IDEA安装好后的一些设置和学习1.1关于IDEA内部jdk版本的设置1.2 一些样式以及快捷键的常用设置(强烈推荐) 2.工程与模块管理3.如何彻底的卸载IDEA 1.IDEA安装好后的一些设置和学习 1.1关于IDEA内部jdk版本的设置 1.File—>Project Struc…...
关于java枚举为什么可以拿来当单例实现这件事看看ikun怎么说
为什么枚举可以保证单例 枚举可以保证单例的原因主要可以归结为以下几个方面: 1. 枚举的实例化过程 线程安全:枚举的实例化过程是由JVM控制的,在类加载时就完成了枚举常量的初始化。由于这个初始化过程是线程安全的(JVM在加载枚…...
Hugging Face下载模型
1、安装 huggingface-cli pip install -U huggingface_hub 2、设置环境变量(如果你打算使用 HF_ENDPOINT 环境变量来指定下载镜像站点): export HF_ENDPOINThttps://hf-mirror.com 3、使用 huggingface-cli 下载模型: 使用下面的命令来下…...

JVM-垃圾回收
什么是JVM的垃圾回收? 垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)自动管理内存的一种机制,其目的是自动回收不再使用的对象所占用的内存空间,以防止内存泄漏和提升内存利用效率。 运…...

8.C基础_指针基础
指针概述 1、定义与初始化 形式:<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同,p时的偏移地址量不同,偏移地址 sizeof(类型)Byte 注意点: 指针的类型要与数据的类型保持一…...

安泰功率放大器使用注意事项有哪些内容和要求
功率放大器是一种广泛应用于音频系统、通信系统和实验室等领域的设备,其作用是将输入信号放大到足够大的功率输出。为了安全使用功率放大器并保证其性能和寿命,以下是一些使用功率放大器时需要注意的事项和要求。 一、选择适当的功率放大器: …...

windows下,使用vs code远程连接云服务器【以CentOS7为例】
windows下,使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网: 下载地址:https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…...

x264 中像素扩边算法源码分析
介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...