当前位置: 首页 > news >正文

1。C语言基础知识回顾

学习嵌入式的C基础知识,主要包括几个核心知识点:三大语法结构常用的数据类型函数结构体指针文件操作

一、顺序结构

程序自上而下依次执行、没有分支、代码简单。

常见顺序结构有:四则运算:+,-,*(乘),/(除)以及%(求余)。

二、选择结构

if-else

switch case

三、循环结构

for循环

while循环

do-while循环

do{循环体;条件控制语句;}while (条件判断语句);              // 终止条件

四、常用的数据类型

一个字节为2的8次方

四、常用的函数

1 Main函数

一个C程序就是由若干头文件和函数组成,有且只有一个主函数,即main函数。

2 strcpy函数

C语言 strcpy() 函数用于对字符串进行复制(拷贝)。

头文件:string.h语法/原型:char* strcpy(char* strDestination, const char* strSource);参数说明:strDestination:目的字符串。strSource:源字符串。

strcpy() 会把 strSource 指向的字符串复制到 strDestination。

必须保证 strDestination 足够大,能够容纳下 strSource,否则会导致溢出错误。

返回值:目的字符串,也即 strDestination。

3 malloc函数

malloc 向内存申请一块空间, 大小为 _Size, 并返回一个指向该空间的地址. 指针类型和内存大小由程序员自行定义.

4 free函数

free()函数用于释放内存, 只需向函数传递已经通过 malloc 分配空间的指针即可.

5 strlen函数

用来返回字符串长度的. 函数参数是 指向字符数组的指针

6 strcat函数

用于拼接字符串, 即将原字符串插入目标字符串的后面. 函数参数从左到右依次是 : 指向目标字符数组的指针, 指向原字符数组的指针. 返回类型是一个 char 指针*.

7 strcmp函数

比较字符串的长短或者查看两个字符串是否相等. 其原理是将字符串的字符一一比较 ascii 值大小得到的

8 预处理

__FILE__  //进行编译的源文件文件路径()
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

五 结构体

        结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。
        结构体的优点:结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。

1 结构声明(定义一个结构体)

struct 结构体名{
成员列表
};

 2 定义结构变量

struct 结构体名 结构体变量名;

struct Student stu1; //定义结构体变量

结构体变量的定义可以放在结构体的声明之后:

结构体变量的定义也可以与结构体的声明同时,这样就简化了代码:

3 访问结构成员

        虽然结构类似一个数组,只是数组元素的数据类型是相同的,而结构中元素的数据类型是可以不同的。但结构不能像数组那样使用下标去访问其中的各个元素,而应该用结构成员运算符点(.)。

访问成员的一般形式是:
结构变量名 . 成员名
如 stu1 . name 表示学生stu1的姓名。

 特殊的:则用 stu1.birthday.year 访问出生的年份。

但如果结构体中的成员又是一个结构体,如:则用 stu1.birthday.year 访问出生的年份。

struct Birthday{                //声明结构体 Birthday
    int year;
    int month;
    int day;
};
struct Student{                 //声明结构体 Student
    char name[20];              
    int num;                    
    float score;                 
    struct Birthday birthday;   //生日
}stu1;

4 结构体变量的初始化:结构体变量的初始化可以放在定义之后:

struct Student stu1, stu2;      //定义结构体变量
strcpy(stu1.name, "Jack");
stu1.num = 18;
stu1.score = 90.5;

stu2 = (struct Student){"Tom", 15, 88.0};

或 结构体变量的初始化也可以与定义同时

struct Student{                 //声明结构体 Student
    char name[20];               
    int num;                    
    float score;                 
}stu = {"Mike", 15, 91};        //注意初始化值的类型和顺序要与结构体声明时成员的类型和顺序一致

六 结构体数组

结构类型作为一种数据类型,也可以像基本数据类型那样,作为数组的元素的类型。

生活中经常用到结构数组来表示具有相同数据结构的一个群体,如一个班的学生的信息,一个书店或图书馆的书籍信息等。

1 结构数组定义

struct 结构名 {
成员列表
} 数组名[数组长度];

如:

struct Student{                 //声明结构体 Student
    char name[20];
    int num;
    float score;
}stu[5];                        //定义一个结构结构数组stu,共有5个元素

2 结构数组的初始化

1)声明结构数组的同时进行初始化

struct Student stu[2] = {{"Mike", 27, 91},{"Tom", 15, 88.0}};  

2)先定义,后初始化

stu[2] = (struct Student){"Jack", 12, 85.0};

3)将结构体变量的成员逐个赋值:

strcpy(stu[3].name, "Smith");
stu[3].num = 18;
stu[3].score = 90.5;

3 输出结构体数组

//结构体数组的长度:
int length = sizeof(stu) / sizeof(struct Student);
//逐个输出结构数组的元素
for (int i = 0; i < length; i++) {
    printf("姓名:%s  学号:%d  成绩:%f \n", stu[i].name, stu[i].num, stu[i].score);
}

 

 七 结构体与指针

当一个指针变量用来指向了一个结构变量,这个指针就成了结构指针变量。
结构指针变量中的值是所指向的结构变量的首地址。可以通过指针来访问结构变量。

1 定义结构体指针变量

struct 结构体名 结构体变量名 * 结构指针变量名

struct Student stu *pstu;      //定义一个结构体变量和一个结构体指针

或将结构体变量的地址赋值给结构体指针

pstu = &stu

2 通过结构体指针间接访问成员值

(*结构指针变量). 成员名 或 结构指针变量 -> 成员名

(*pstu).name    //注意(pstu)的小括号不能省略,因为成员符“.”优先级为1,取地址符“”优先级为2,去掉括号就相当于*(pstu.name)了。
pstu->name

八 结构体的嵌套

1 结构体中的成员可以又是一个结构体,构成结构体的嵌套:

struct Birthday{                //声明结构体 Birthday
    int year;
    int month;
    int day;
};
struct Student{                 //声明结构体 Student
    char name[20];              
    int num;                    
    float score;                 
    struct Birthday birthday;   //生日
}; 

2 结构体不可以嵌套跟自己类型相同的结构体,但可以嵌套定义自己的指针。如

3 多层嵌套

 九 结构体与函数

结构体的成员可以作为函数的参数,属于值传递(成员是数组的除外)。如:

struct Student{                 //声明结构体 Student
    char name[20];
    int num;
    float score;
};


void printNum(int num){         //定义一个函数,输出学号
    printf("num = %d \n", num);
}


struct Student student0 = {"Mike", 27, 91}; //结构体参数初始化
printNum(student0.num);     //调用printNum 函数,以结构成员作函数的参数
//运行结果:num = 27 

结构变量名也可以作为函数的参数传递,如

void PrintStu(struct Student student){      //定义 PrintStu 函数,以结构体变量名作函数的形参
    student.num = 100;                      //修改学号
    printf("PrintStu 修改后:姓名: %s, 学号: %d, 内存地址: %p \n", student.name, student.num, &student);
}
    struct Student student0 = {"Mike", 27, 91};
    PrintStu(student0);                     //调用 PrintStu 函数,以结构变量名作函数的参数
    printf("原来:姓名: %s, 学号: %d,  内存地址: %p \n", student0.name, student0.num, &student0);

还可以用定义的结构体指针变量来传参

        形参和实参的地址不一样,是在函数中创建了一个局部结构体,然后实参对形参进行全部成员的逐个传送,在函数中对局部结构体变量进行修改并不影响原结构体变量。这样传送的时间空间开销都比较大,特别是当成员有数组的时候,程序效率较低。所以可以考虑使用指针:

void PrintStu2(struct Student *student){      //定义 PrintStu2 函数,以结构指针作函数的形参
    student->num = 100;                       //修改学号
    printf("PrintStu2 修改后:姓名: %s, 学号: %d, 内存地址: %p \n", student->name, student->num, student);
}
    struct Student student0 = {"Mike", 27, 91};
    PrintStu2(&student0);                     //调用 PrintStu 函数,以结构变量的地址作函数的参数
    printf("           原来:姓名: %s, 学号: %d,  内存地址: %p \n", student0.name, student0.num, &student0);

十 指针

为什么要使用指针

需要说明一下的是指针类型存储的是所指向变量的地址:
所以32位机器只需要32bit,而64位机器需要 64bit

由此可知,在一台电脑上,所有指针大小都是一样的。

那么,当我们定义了一些非常复杂庞大的结构体,比如这个结构体有50个字节(Byte)。
这时候,向函数中传入参数的时候,是直接把这个50个字节的数据的副本传递到形参上快?
还是,直接传递32bit或者64bit的指针快呢??

很明显,传入指针可以大大大大提高运算的效率。

基本格式:

基本类型 *指针变量名 = &变量名;

* 取值运算符  &取地址运算符

//定义变量:
int a = 666;
char b = 'b';

//定义指针变量:
//1.告诉计算机这是一个保存int类型数据地址的指针变量
int *pa = &a;

//2.告诉计算机这是一个保存char字符类型数据地址的指针变量
char *pb= &b;

野指针

没有初始化的指针,就可以称为:野指针。

#include <stdio.h>

int main(void){
    int *p;
    *p = 10;
    return 0;
}

十一 指针与数组

一、指向数组元素的指针

1 数组元素地址赋值给指针变量

int c[10], d[20];
int *p, *q=&c[0]; //初始化

p = &c[3];//数组c下标为3的元素赋值给指针P
p = d;//整个数组的地址赋值给指针p

 2 指针的运算

众所周知,数组,存在内存中一片地址连续的区域中
即就是说,数组,在逻辑上是一个元素挨着一个元素,在物理存储上也是一个元素挨着一个元素的。

1 数组元素指针自身加或减

当指针变量指向数组元素时,指针变量加/减一个整数n,表示指针向后/前移动n个元素!

int c[20];
int *p1 = &c[9];
p1--;
p1+=3;

2 数组元素指针之间加减

相减得到的这个数字是这两个地址之间相差的字节数。
然后,用这个字节数,除以每个元素所占的字节数。
就可以得出这两个地址之间相差几个元素。


二、指针数组(数组元素是指针

整形数组中,数组元素都是整型
字符数组中,数组元素都是字符
指针数组中,数组元素都是指针

int i = 1;
int j = 2;
int k = 3;
int l = 4;
int *p[4] = {&i, &j, &k, &l};

//单目运算符,同优先级的情况下,丛右往左进行运算
//[]先与p结合,表示这是一个数组
//*再与p[]结合,表示这个数组元素类型是指针
//最后加上前面的int,表示这个int类型的指针

注意区分两个概念:

int (*p)[5];
//这里*先与p结合,表示p是一个指针,这个指针指向这个数组,这个数组是int类型的数组
int *p[5];

//这个表示指针数组,每个元素都是指针,上面说过了

十二 指针与函数

1 返回值是指针的函数

指针函数:指针函数的本身是一个函数,其函数的返回值是一个指针
函数的返回值的类型既可以是整型(若没有设定,则默认为整型),实型,字符型,也可以是指针型。
返回值为指针类型的函数又称为指针类型的函数,建成指针函数。

其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个"指向返回值为…的指针(地址)

类型名 *函数名(参数表)

int *a(int x)
//解释一下
//这里函数名先和()结合,表示这是一个函数
//然后a()再和前面的*结合,表示这是一个指针类型的函数。
//最后与前面的int结合,表示这是int指针类型的函数,返回值是指针
 //(这个过程有点类似前面的指针数组,可以翻上去复习一下)

2 函数指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

函数返回值类型 (* 指针变量名) (函数参数列表);

int(*p)(int, int);

十三 文件操作

1 文件指针

 在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。

FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息。

typedef struct

{

short                  level; //缓冲区"满"或者"空"的程度

unsigned           flags; //文件状态标志

char                   fd; //文件描述符

unsigned char   hold; //如无缓冲区不读取字符

short                  bsize; //缓冲区的大小

unsigned char   *buffer;//数据缓冲区的位置

unsigned            ar;  //指针,当前的指向

unsigned            istemp; //临时文件,指示器

short                   token; //用于有效性的检查

}FILE;

 C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:

stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端。

2 文件的打开

任何文件使用之前必须打开

#include <stdio.h>

FILE * fopen(const char * filename, const char * mode);

功能:      打开文件

参数:

filename:需要打开的文件名,根据需要加上路径

mode:     打开文件的模式设置

返回值:

成功:       文件指针

失败:       NULL

filename参数

FILE *fp_passwd = NULL;

//相对路径:

//打开当前目录passdw文件:源文件(源程序)所在目录

FILE *fp_passwd = fopen("passwd.txt", "r");

//打开当前目录(test)下passwd.txt文件

fp_passwd = fopen(". / test / passwd.txt", "r");

//打开当前目录上一级目录(相对当前目录)passwd.txt文件

fp_passwd = fopen(".. / passwd.txt", "r");

//绝对路径:

//打开C盘test目录下一个叫passwd.txt文件

fp_passwd = fopen("c:/test/passwd.txt","r");

mode参数

 3 文件的关闭

任何文件在使用后应该关闭:

  1. 打开的文件会占用内存资源,如果总是打开不关闭,会消耗很多内存
  2. 一个进程同时打开的文件数是有限制的,超过最大同时打开文件数,再次调用fopen打开文件会失败
  3. 如果没有明确的调用fclose关闭打开的文件,那么程序在退出的时候,操作系统会统一关闭。

#include <stdio.h>

int fclose(FILE * stream);

功能:关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。

参数:

stream:文件指针

返回值:

成功:0

失败:-1

FILE * fp = NULL;

fp = fopen("abc.txt", "r");

fclose(fp);

4 文件的读写

put 写 get 读

按照字符读写文件fgetc、fputc

按照行读写文件fgets、fputs

按照字符串格式化读写文件fprintf、fscanf //根据format字符串来转换并格式化数据

按照块读写文件fread、fwrite

5 文件的随机读写 

int fseek(FILE *stream, long offset, int whence);

功能:移动文件流(文件光标)的读写位置。

long ftell(FILE *stream);

功能:获取文件流(文件光标)的读写位置。

void rewind(FILE *stream);

功能:把文件流(文件光标)的读写位置移动到文件开头。

 6 获取文件状态

#include <sys/types.h>

#include <sys/stat.h>

int stat(const char *path, struct stat *buf);

功能:获取文件状态信息

参数:

path:文件名

buf:  保存文件信息的结构体

返回值:

成功:0

失败-1

struct stat 

{

dev_t         st_dev;         //文件的设备编号

ino_t         st_ino;          //节点

mode_t        st_mode;   //文件的类型和存取的权限

nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1

uid_t         st_uid;         //用户ID

gid_t         st_gid;         //组ID

dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号

off_t         st_size;        //文件字节数(文件大小)

unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)

unsigned long st_blocks;    //块数

time_t        st_atime;     //最后一次访问时间

time_t        st_mtime;    //最后一次修改时间

time_t        st_ctime;     //最后一次改变时间(指属性)

};

 7 删除 重命名文件

删除文件

#include <stdio.h>

int remove(const char *pathname);

功能:删除文件

参数:

pathname:文件名

返回值:

成功:0

失败:-1

重命名文件

#include <stdio.h>

int rename(const char *oldpath, const char *newpath);

功能:把oldpath的文件名改为newpath

参数:

oldpath:旧文件名

newpath:新文件名

返回值:

成功:0

失败: - 1

 8 文件缓冲区

磁盘文件的存取

#include <stdio.h>

int fflush(FILE *stream);

功能:更新缓冲区,让缓冲区的数据立马写到文件中。

参数:

stream:文件指针

返回值:

成功:0

失败:-1

相关文章:

1。C语言基础知识回顾

学习嵌入式的C基础知识&#xff0c;主要包括几个核心知识点&#xff1a;三大语法结构、常用的数据类型、函数、结构体、指针、文件操作。 一、顺序结构 程序自上而下依次执行、没有分支、代码简单。 常见顺序结构有&#xff1a;四则运算&#xff1a;&#xff0c;-&#xff0…...

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM 题目要求 我们将构建一个简单的颜色猜谜游戏。每次游戏启动时&#xff0c;都会选择一个随机的RGB颜色代码。根据游戏模式&#xff0c;我们将在屏幕上提供三个&#xff08;简单&#xff09;或六个&#xff08;困难&…...

【算法学习】—n皇后问题(回溯法)

【算法学习】—n皇后问题(回溯法) 1. 什么是回溯法&#xff1f; 相信"迷宫"是许多人儿时的回忆&#xff0c;大家小时候一定都玩过迷宫游戏。我们从不用别人教&#xff0c;都知道走迷宫的策略是&#xff1a; 当遇到一个岔路口&#xff0c;会有以下两种情况&#xf…...

万亿OTA市场进入新爆发期,2025或迎中国汽车软件付费元年

伴随智能汽车市场规模发展&#xff0c;越来越多的汽车产品具备OTA能力&#xff0c;功能的优化、以及服务的差异化&#xff0c;成为了车企竞争的新战场。 例如&#xff0c;今年初&#xff0c;问界M5 EV迎来了首次OTA升级&#xff0c;升级内容覆盖用户在实际用车中的多个场景&am…...

Android硬件通信之 蓝牙Mesh通信

一&#xff0c;简介 蓝牙4.0以下称为传统蓝牙&#xff0c;4.0以上是低功耗蓝牙&#xff0c;5.0开始主打物联网 5.0协议蓝牙最重要的技术就是Mesh组网&#xff0c;实现1对多&#xff0c;多对多的无线通信。即从点对点传输发展为网络拓扑结构&#xff0c;主要领域如灯光控制等&…...

PG数据库实现bool自动转smallint的方式

删除函数&#xff1a; 语法&#xff1a; DROP FUNCTION IF EXISTS your_schema_name.function_name(arg_type1, arg_type2) CASCADE RESTRICT; 实例&#xff1a; DROP FUNCTION IF EXISTS platformyw.boolean_to_smallint(bool) CASCADE RESTRICT; 查询是否存在函数 语法: SELE…...

易观千帆 | 2023年3月证券APP月活跃用户规模盘点

易观&#xff1a;2023年3月证券服务应用活跃人数14131.58万人&#xff0c;相较上月&#xff0c;环比增长0.61%&#xff0c;同比增长0.60%&#xff1b;2023年3月自营类证券服务应用Top10 活跃人数6221.44万人&#xff0c;环比增长0.08%&#xff1b;2023年3月第三方证券服务应用T…...

2023年江苏专转本成绩查询步骤

2023年江苏专转本成绩查询时间 2023年江苏专转本成绩查询时间预计在5月初&#xff0c;参加考试的考生&#xff0c;可以关注考试院发布的消息。江苏专转本考生可在规定时间内在省教育考试院网&#xff0c;在查询中心页面中输入准考证号和身份证号进行查询&#xff0c;或者拨…...

JavaScript中sort()函数

sort()函数是javascript中自带函数&#xff0c;这个函数的功能是排序。 使用sort()函数时&#xff0c;函数参数如果不设置的话&#xff0c;以默认方式进行排序&#xff0c;就是以字母顺序进行排序&#xff0c;准确的讲就是按照字符编码的顺序进行排序。 var arr [3,2,3,34,1…...

泰克Tektronix DPO5204B混合信号示波器

特征 带宽&#xff1a;2 GHz输入通道&#xff1a;4采样率&#xff1a;1 或 2 个通道上为 5 GS/s、10 GS/s记录长度&#xff1a;所有 4 个通道 25M&#xff0c;50M&#xff1a;1 或 2 个通道上升时间&#xff1a;175 皮秒MultiView zoom™ 记录长度高达 250 兆点>250,000 wf…...

突破传统监测模式:业务状态监控HM的新思路

作者&#xff1a;京东保险 管顺利 一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿&#xff…...

0Ω电阻在PCB板中的5大常见作用

在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那它存在于PCB板中的原因是什么呢&#xff1f;今天我们一探究竟。 1、充当跳线 在电路中&#xff0c;0Ω电阻…...

分布式消息队列Kafka(三)- 服务节点Broker

1.Kafka Broker 工作流程 &#xff08;1&#xff09;zookeeper中存储的kafka信息 ​ 1&#xff09;启动 Zookeeper 客户端。 [zrclasshadoop102 zookeeper-3.5.7]$ bin/zkCli.sh ​ 2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2]…...

蠕动泵说明书_RDB

RDB_2T-S蠕 动 泵 概述 蠕动灌装泵是一种高性能、高质量的泵。采用先进的微处理技术及通讯方式做成的控制器和步进电机驱动器&#xff0c;配以诚合最新研制出的泵头&#xff0c;使产品在稳定性、先进性和性价比上达到一个新的高度。适用饮料、保健品、制药、精细化工等诸流量…...

浅谈react如何自定义hooks

react 自定义 hooks 简介 一句话&#xff1a;使用自定义hooks可以将某些组件逻辑提取到可重用的函数中。 自定义hooks是一个从use开始的调用其他hooks的Javascript函数。 下面以一个案例: 新闻发布操作&#xff0c;来简单说一下react 自定义 hooks。 不使用自定义hooks时 …...

如何优雅的写个try catch的方式!

软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&#xff0c;至少有一半以上的时间都是在处理各种异常情况&#xff0c;所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块&#xff0c;不仅有大量的冗余代码&#xff0c;而…...

海尔智家:智慧场景掌握「主动」权,用户体验才有话语权

2023年1月&#xff0c;《福布斯》AI专栏作家Rob Toews发布了年度AI发展预测&#xff0c;指出人工智能的发展将带来涉及各行业、跨学科领域的深远影响。变革将至&#xff0c;全球已掀起生成式AI热&#xff0c;以自然语言处理为代表的人工智能技术在快速进化&#xff0c;积极拥抱…...

基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…...

LVS的小总结

LVS的工作模式及其工作过程&#xff1a; LVS 有三种负载均衡的模式&#xff0c;分别是VS/NAT&#xff08;nat 模式&#xff09;、VS/DR&#xff08;路由模式&#xff09;、VS/TUN&#xff08;隧道模式&#xff09;。 1、NAT模式&#xff08;NAT模式&#xff09; 原理&#x…...

Spring依赖注入(DI配置)

Spring依赖注入 1. 依赖注入方式【重点】1.1 依赖注入的两种方式1.2 setter方式注入问题导入引用类型简单类型 1.3 构造方式注入问题导入引用类型简单类型参数适配【了解】 1.4 依赖注入方式选择 2. 依赖自动装配【理解】问题导入2.1 自动装配概念2.2 自动装配类型依赖自动装配…...

绘声绘影2023简体中文版新功能介绍

会声会影是一款专业的数字音频工作站软件,它提供强大的音频编辑和制作功能,被广泛应用于音乐创作、录音棚录制以及现场演出等领域。会声会影的最新版本会声会影2023将于2022年底发布,主要功能和新功能详述如下: 会声会影2023主要功能: 1. 直观易用的界面:会声会影采用简洁而不…...

一个好的前端开发人员必须掌握的前端代码整洁与开发技巧

前端代码整洁与开发技巧 ​ 为保证前端人员在团队项目开发过程中的规范化、统一化&#xff0c;特建立《前端代码整洁与开发技巧》文档&#xff0c;通过代码简洁推荐、开发技巧推荐等章节来帮助我们统一代码规范和编码风格&#xff0c;从而提升项目的可读性和可维护性。 目录 …...

【别再困扰于LeetCode接雨水问题了 | 从暴力法=>动态规划=>单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智酒业酒厂IP广播系统设计指南 由北京海特伟业任洪卓发布于2023年4月25日 一、酒厂酒业IP网络广播系统建设需求 随着中国经济的快速稳步发展&#xff0c;中国白酒行业也迎来了黄金时期&#xff0c;产品规模、销售业绩等…...

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…...

CentOS系统安装Intel E810 25G网卡驱动

因特尔网卡驱动给的都是二进制包&#xff0c;需要编译环境。 首先去Intel下载最新的驱动 E810驱动下载&#xff1a;https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html?wapkwe810 里面有三个驱…...

Java经典的String面试题

Java经典的Spring面试题 String是基本数据类型吗&#xff1f; String你是基本数据类型String是可变的话&#xff1f; String是final类型的&#xff0c;不可变怎么比较两个字符串的值一样&#xff0c;怎么比较两个字符串是否同一对象&#xff1f; 比较字符串的值是否相同用equa…...

c# 结构体与类区别

在 C# 中&#xff0c;结构体&#xff08;struct&#xff09;和类&#xff08;class&#xff09;都是用户自定义类型&#xff0c;它们具有一些共同的特性&#xff0c;比如可以定义字段、属性、方法等。但它们也有一些区别。 下面是一些结构体和类的区别&#xff1a; 定义方式不…...

使用 patch 命令打补丁

之前的这篇文章 git 导出差异 diff 文件 写了导出 diff 、patch 文件。 拿到 patch 文件&#xff0c;用 patch 命令可以快速的把修改内容合入&#xff0c;合入后在 git 上是已修改的状态&#xff0c;如需提交还要 add 、commit 。 patch 语法 patch --help 可以看到 Usage:…...

C++——类和对象[上]

目录 1.初识面向对象 2.类的引入 3.类的定义 4.成员变量的命名规则 5.类的实例化 6.类对象模型 7.this指针 1.初识面向对象 C语言是一门面向过程的语言&#xff0c;它关注的是完成任务所需要的过程&#xff1b;C是一门面向对象的语言&#xff0c;将一个任务分为多个对…...