【高级语言程序设计(一)】第 8 章:结构体类型和自定义类型

目录

前言

一、结构体类型定义

(1)结构体类型定义的一般形式

(2)结构体类型定义的说明

二、结构体类型变量

(1)结构体类型变量的定义和初始化

① 先定义结构体类型、后定义结构体类型的变量(间接定义法)

② 在定义结构体类型的同时,定义结构体类型变量(直接定义法)

③ 省略结构体类型名,直接定义结构体类型变量

(2)结构体变量的引用

① 结构体类型变量成员的引用方法

②  结构体类型变量成员地址的引用方法

③ 结构体类型变量地址的引用方法

三、结构体类型数组

(1)结构体类型数组的定义和初始化

① 先定义结构体类型,再定义结构体类型数组并初始化

② 定义结构体类型的同时定义结构体类型数组并初始化

③ 定义无名称的结构体类型的同时定义结构体类型数组并初始化

(2)结构体类型数组的引用

① 结构体类型数组元素成员的引用方法

② 结构体类型数组元素成员地址的引用方法

四、结构体类型指针

(1)指针变量的指向

① 指针变量指向结构体类型变量

② 指针变量指向结构体类型数组元素

③ 指针变量指向结构体类型数组

(2)结构体类型数据的传递

① 利用全局变量传递结构体类型数据

② 利用返回值传递结构体类型数据

③ 利用形参和实参结合传递结构体类型数据

五、自定义类型

(1)基本数据类型符的自定义

(2)数组类型的自定义

(3)结构体类型的自定义

(4)指针型的自定义

(5)附录:ASC Ⅱ 码表



前言

C 语言提供了一种构造类型,即允许用户根据需要利用已有的数据类型自定义的一种数据类型,它由若干个数据类型相同或不同的数据项组合而成。为了存放类型不同的相关数据项,C 语言提供了另一种构造类型,即结构体类型。


一、结构体类型定义

(1)结构体类型定义的一般形式

struct 结构体类型名  /* struct是结构体类型的关键字 */
{
  数据类型符 成员名1;
  数据类型符 成员名2;
  …
  数据类型符 成员名n;
};  /* 此行分号不能缺少 */
  • “结构体类型名” 是用户命名的标识符
  • “数据类型符” 可以是基本数据类型说明符,也可以是已定义的某种结构体类型
  • “成员名” 可以是标识符、标识符[长度]、 *标识符  

(2)结构体类型定义的说明

  1. struct 是结构体类型的关键字, “结构体类型名” 是由用户自行命名,应遵循标识符的命名规则。
  2. 一对花括号括起来的部分是结构体类型的成员说明表,一个结构体类型可以包含任意个成员,这些成员可以是任何类型,包括各种基本数据类型和构造类型。
  3. 分号是结构体类型定义语句的结束标志,不能省略。
  4. 结构体类型定义的位置一般在程序开头,所有函数之前,此时所有函数都可以利用它来定义变量;若结构体类型定义在函数内部,则只能在本函数内部使用。
  5. 结构体类型仅是一种数据类型,系统不会为其成员分配内存。


二、结构体类型变量

(1)结构体类型变量的定义和初始化

用户自定义的结构体类型,与系统定义的基本数据类型(如 int、char 等)一样,可用来定义
该类型的变量。

定义结构体类型变量的 3 种方法:

  1. 先定义结构体类型、后定义结构体类型的变量(间接定义法)
  2. 在定义结构体类型的同时,定义结构体类型变量(直接定义法)
  3. 省略结构体类型名,直接定义结构体类型变量

① 先定义结构体类型、后定义结构体类型的变量(间接定义法)

/* 示例:定义结构体类型变量 */
struct std_info
{
  int no;
  char name[10];
  char sex;
  int score[3];
};
...
struct std_info a, b;   /* 定义结构体类型的变量a和b */

② 在定义结构体类型的同时,定义结构体类型变量(直接定义法)

【一般格式】

结构体类型变量初始化的格式与一维数组相似。
结构体类型变量={初值表};

struct [结构体类型名]
{ 
  ...
}结构体类型变量表;

【示例】

/* 示例:定义结构体类型的同时定义结构体类型变量并赋初值 */
struct std_info
{
  int no;
  char name[10];
  char sex;
  int score[3];
}a={1, "ZhangYi", 'F', {80,78,88}};   /* 定义结构体类型的同时定义结构体类型的变量并赋初值 */
...
struct std_info b={2, "LiYang", 'M', { 89,91,85}};   /* 该语句是正确的,因为前面已定义了结构体类型 std_info */

③ 省略结构体类型名,直接定义结构体类型变量

【一般格式】

结构体类型变量初始化的格式与一维数组相似。
结构体类型变量={初值表};

struct [结构体类型名]
{ 
  ...
}结构体类型变量表;

/* 一般格式 */
struct 结构体名
{ 
  类型标识符 成员名;
  类型标识符 成员名;
  ...
}变量名表列;


/* 格式简化如下 */
struct
{ 
  ...
}a,b;

【说明】

  • 声明结构体类型同时定义结构体变量
  • 结构体成员名与程序中变量名可相同,两者不代表同一个对象

【注意】只有在定义了结构体变量后系统才为分配内存

【示例一】声明结构体类型同时定义结构体变量

struct student
{ 
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
}stu1, stu2;

【示例二】结构体成员名与程序中变量名可相同,两者不代表同一个对象

struct student
{ 
  int num;
  char name[20];
  float score;
}stu;
int num;

(2)结构体变量的引用

【引用规则】

  • 结构体变量不能整体引用只能引用变量成员

【一般格式】结构体变量名.成员名

  • 成员(分量)运算符
  • 优先级1
  • 结合性从左向右

【示例】

struct student
{ 
  int num;
  char name[20];
  char sex;
  int age;
  float score;
  char addr[30];
}stu1, stu2;
main()
{
  struct student
  { 
     int No;
     float score;
  }stu1, stu2;

  scanf("%d,%f", &stu1);                  /* 错误写法 */
  scanf("%d,%f",&stu1.No, &stu1.score);   /* 正确写法 */

  printf("%d,%f",stu1);                   /* 错误写法 */
  printf("%d,%f", stu1.No, stu1.score);   /* 正确写法 */

  stu2=stu1;                              /* 正确写法 */
}

① 结构体类型变量成员方法

结构体类型变量是通过成员运算符 “.” 逐一访问其成员:

【一般形式】结构体类型变量名.成员名

【说明】

  1. “.” 是成员运算符,它是双目运算符,前面的运算对象必须是结构体类型的变量名(或结构体类型数组元素),后面的运算对象是该结构体类型的成员名。
  2. 成员运算符 “.” 的优先级最高,与圆括号运算符() 、下标运算符[] 的优先级相同,结合性是从左至右。
  3. C 语言规定不能对一个结构体类型变量整体地进行输入和输出操作,只能对结构体类型变量的成员进行输入和输出操作。
  4. 结构体类型变量的成员可以像普通变量一样进行赋值和运算。
  5. 相同类型的结构体类型变量之间可以互相赋值。
  6. 两个结构体类型变量不能用关系运算符 “ == ” 或 “!= ” 进行比较操作。

②  结构体类型变量成员地址方法

【一般形式】

  • &结构体类型变量名.成员名                      /* 成员是变量形式的变量地址 */
  • 结构体类型变量名.成员名                         /* 成员是数组形式的数组首地址 */
  • &结构体类型变量名.成员数组[下标]          /* 成员是数组,其数组元素的地址 */

【注意】

  • 存放结构体类型变量成员地址的指针变量的数据类型必须与该成员的数据类型相同

③ 结构体类型变量地址方法

【一般形式】&结构体类型变量名

【注意】

  • 存放结构体类型变量地址的指针变量必须是相同类型的结构体类型指针变量


三、结构体类型数组

(1)结构体类型数组的定义和初始化

定义结构体类型数组的三种方法:
  1. 先定义结构体类型,再定义结构体类型数组并初始化
  2. 定义结构体类型的同时定义结构体类型数组并初始化
  3. 定义无名称的结构体类型的同时定义结构体类型数组并初始化

【一般格式】 struct 结构体类型名 结构体类型数组名[数组长度];

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

【初始化格式】结构体类型数组名[n]={{初值表1},{初值表2},…,{初值表n}};

  • 与普通数组一样,结构体类型数组也可以在定义时进行初始化

① 先定义结构体类型,再定义结构体类型数组并初始化

/* 示例「方法一」:定义结构体类型数组并初始化 */

/* 先定义结构体类型 */
struct std_info 
{
  int no;
  char name[10];
  char sex;
};
...
/* 后定义一个结构体类型数组 s ,共有三个元素,即 s[0]~s[2] ,每个数组元素都是结构体类型,即每个数组元素都包括结构体类型 std_info 的三个成员 */
struct std info s[3]={{100, "ZhangYi", 'f'}, {101, "WangHong", 'm'}, {102, "LiSan", 'f'}};

② 定义结构体类型的同时定义结构体类型数组并初始化

/* 示例「方法二」:定义结构体类型数组并初始化 */

/* 定义结构体类型的同时定义结构体类型数组 s 并赋初值 */
struct std_info 
{
  int no;
  char name[10];
  char sex;
}s[3]={{100, "ZhangYi", 'f'}, {101, "WangHong", 'm'}, {102, "LiSan", 'f'}};

定义无名称的结构体类型的同时定义结构体类型数组并初始化

/* 示例「方法三」:定义结构体类型数组并初始化 */

/* 定义无名称的结构体类型的同时定义结构体类型数组 s 并赋初值 */
struct
{
  int no;
  char name[10];
  char sex;
}s[3]={{100, "ZhangYi", 'f'}, {101, "WangHong", 'm'}, {102, "LiSan", 'f'}};

(2)结构体类型数组的引用

① 结构体类型数组元素成员引用方法

【一般形式】结构体类型数组名[下标].成员名

【示例】

/* 示例:结构体类型数组元素成员的引用 */
#include <stdio.h>
/* 定义结构体类型数组car,同时进行初始化 */
struct s
{
  int num;
  char color;
  char type;
}car[]={{101, 'G', 'c'},
        {210, 'Y', 'm'},
        {105, 'R', 'l'},
        {222, 'B', 's'},
        {308, 'P', 'b'}
       }; 

int main(void)
{
  int i;
  printf("number color type\n");
  for(i=0; i<5; i++)
      /* 依次输出结构体类型数组的每个元素 car[i] 的各个成员值 */
      printf("%-9d%-6c%c\n", car[i].num, car[i].color, car[i].type); 
  return 0;
}



/* 运行结果 */
number color type
101 G c
201 Y m
105 R l
222 B s
308 P b

② 结构体类型数组元素成员地址引用方法

【一般形式】&结构体类型数组名[下标].成员名

【注意】

  • 存放结构体类型数组元素成员地址的指针变量的数据类型必须与结构体类型中该成员的数据类型相同

【示例】

/* 结构体类型数组元素成员地址的引用 */
#include <stdio.h>
#define NAMESIZE 20
/* 定义结构体类型数组s */
struct std_info
{
  char name[NAMESIZE];
  int age;
  char sex;
}s[10];

int main(void)
{
  int i;
  printf("Please input student data\n");
  i=0;
  /* 从键盘输入四个学生的信息分别存入结构体类型数组s */
  while(i<4)
    {
      printf("name: age: sex: ");
      scanf("%s", s[i].name);
      scanf("%d", &s[i].age);
      getchar();
      scanf("%c", &s[i].sex);
      i=i+1;
     } 
  return 0;
}



/* 运行结果 */
Please input student data
name: age: sex: David 23 M
name: age: sex: Elliott 22 M
name: age: sex: Evan 23 M
name: age: sex: Dennis 21 F


四、结构体类型指针

(1)指针变量的指向

① 指针变量指向结构体类型变量

定义指向结构体类型变量的指针变量和定义结构体类型变量的方法基本相同,区别是在结构体类型指针变量名的前面加一个 “*” 。
一般地,如果指针变量 pointer 已指向结构体类型变量 var ,则以下三种形式等价:
  • 方式一:var.成员
  • 方式二:pointer->成员
  • 方式三:(*pointer).成员         /* “*pointer” 外面的一对圆括号不能省略 */
需要注意以下几点:
  1. 方式一中,成员运算符 “.” 左侧的运算对象只能是结构体类型变量。
  2. 方式二中的 “->” 称为指向成员运算符或简称为指向运算符。该运算符是双目运算符,其左侧的运算对象必须是结构体类型变量(或数组元素)的地址,也可以是已指向结构体类型变量(或数组元素)的指针变量,否则会出错;右侧的运算对象必须是该结构体类型的成员名。指向运算符的优先级和 “()” “[]” “.” 是同级的,结合性是从左至右。
  3. 方式三中的 “*指针变量” 代表了它所指向的结构体类型变量,利用成员运算符 “.” 来引用,等价于 “结构体类型变量.成员名” 。
  4. “*指针变量” 必须用圆括号括起来,因为运算符 “*” 的优先级低于运算符 “.” ,若没有圆括号则优先处理运算符 “.” ,将出现 “指针变量. 成员名” 会造成语法错误。

② 指针变量指向结构体类型数组元素

如果一个结构体类型数组元素的地址已赋予相同结构体类型的指针变量(即指针变量指向结构体类型数组元素),可以使用以下两种方式引用该元素的成员,其作用完全相同。
  • 方式一:(*指针变量).成员名
  • 方式二:指针变量->成员名
这里的指针变量必须已经指向某一结构体类型数组元素。

③ 指针变量指向结构体类型数组

当一个结构体类型数组的首地址已经赋予相同结构体类型的指针变量(即该指针变量已经指向结构体类型数组),可以使用以下两种方式引用下标为i的数组元素的成员,其作用完全相同。
  • 方式一:(*(指针变量+i)).成员名
  • 方式二:(指针变量+i)->成员名
这里的指针变量必须已经指向某一结构体类型数组,则上述两种引用方式均等价于:
  • 数组名[i].成员名
说明:
  1. 如果指针变量 p 已经指向一个结构体类型数组,则 p+1 指向结构体类型数组的下一个元素,而不是当前元素的下一个成员。
  2. 如果指针变量 p 已经指向一个结构体类型变量(或结构体类型数组),则不能再使之指向结构体类型变量(或结构体类型数组元素)的某一成员。

(2)结构体类型数据的传递

① 利用全局变量传递结构体类型数据

利用全局变量传递结构体类型数据时,只要在程序的开头定义结构体类型及其变量或数组,则可以在其后面定义的函数间传递结构体类型数据。

② 利用返回值传递结构体类型数据

  1. 利用返回值传递结构体类型数据时,只能返回一个结构体类型数据,定义时函数的类型必须是已定义的结构体类型,利用语句 return(表达式); 返回的表达式值也必须是同一结构体类型的数据。
  2. 调用函数后的返回值必须用同一结构体类型变量或数组元素接收。

③ 利用形参和实参结合传递结构体类型数据

1. 地址传递方式

  • 地址传递方式中,形参可以是结构体类型数组或指针变量,对应的实参必须是同一结构体类型的变量地址、数组名、数组元素地址或已赋值的结构体类型的指针变量。
2. 值传递方式
  • 值传递方式中,形参为结构体类型变量,对应的实参必须是同一结构体类型的变量或数组元素。


五、自定义类型

typedef 定义类型别名的一般形式: 

【格式】 typedef  原类型符  新类型符;
【参数】
  • “原类型符” 可以是基本类型符,也可以是用户自定义的无名结构体类型。
  • “新类型符” 是用户自定义的一个标识符,通常采用大写字母。
【功能】将 “原类型符” 定义为用户自定义的 “新类型符”,以后可以使用 “新类型符” 定义相应数据类型的变量、数组、指针变量、结构体类型和函数。
【说明】
  1. typedef 只能定义类型名,不能定义变量名,即定义类型名的别名,并不能创造一个新的类型。
  2. typedef 与宏定义 #define 具有相似之处,但二者是不同的。前者是在编译时完成的;后者是在编译预处理时完成的,且只能进行简单的字符串替换。

(1)基本数据类型符的自定义

【格式】 typedef  基本数据类型符  用户类型符;
【功能】将 “基本数据类型符” 定义为 “用户类型符”
【示例】为实型 float 定义一个别名 REAL 的过程如下
  1. 按照定义实型变量的方法,写出定义体,即 floatf;
  2. 将变量名换成别名,即 floatREAL;
  3. 在定义体最前面加上 typedef ,即 typedeffloatREAL;
  4. 已定义完新类型名,可用此新类型名定义变量,即 REALx,y;

(2)数组类型的自定义

【格式】 typedef  基本数据类型符  用户类型符[数组长度];
【功能】 以后可以使用 “用户类型符” 定义 “基本数据类型符” 的数组,其长度 为定义时确定的数组长度。
【示例】ARRAY 是长度为10的整型数组,可以用 ARRAY 定义多个相同类型和长度的数组
typedef  int  ARRAY[10];   /* 定义 ARRAY 为整型、长度为10的数组的用户类型符 */
ARRAY a,b,c;               /* 等价于 inta[10],b[10],c[10]; */

(3)结构体类型的自定义

【格式】
typedef struct
{
  数据类型符 成员名1;
  数据类型符 成员名2; 
  ...
  数据类型符 成员名n;
}用户类型符;

【功能】以后可以使用“用户类型符”定义含有n个成员的结构体类型变量、数组和指针变量等。

【示例】为结构体类型 date 定义一个别名 DATE

struct date
{ int year,month,day; };
  1. 按照定义结构体类型变量的方法,写出定义体,即 struct date{…}d;
  2. 将变量名换成别名,即 struct date{…}DATE;
  3. 在定义体最前面加上 typedef,即 typedef struct date{…}DATE;
  4. 已定义完新类型名,可用此新类型名定义变量,即 DATE s1,s2;

(4)指针型的自定义

【格式】 typedef  基本数据类型符  *用户类型符;
【功能】 以后可以使用“用户类型符”定义“基本数据类型符”类型的指针变量 或数组等。
【示例】
/* 示例:自定义指针类型 */ 
typedef int *P_I;      /* 定义 P_I 为整型指针的用户类型符 */
typedef char *P_C[5];  /* 定义 P_C 为长度是 5 的字符型指针数组的用户类型符 */
int main(void)
{
  P_I, p1, p2;         /* 等价于 int *pl, *p2; */
  P_C, p3, p4;         /* 等价于 char *p3[5], *p4[5]; */
  ...
}

(5)附录:ASC Ⅱ 码表

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

84.Rem和max-width如何工作

max-width 首先我们先看普通的width是什么样的效果&#xff01; 首先给个测试的div <div class"test">TEST</div>● 然后CSS给定一个宽度 .test {width: 1000px;background-color: red;padding: 100px; }如上图&#xff0c;不管你的浏览器窗口如何改变…

HTMLCSS中的树形结构图

我们可以只使用 html 和 css 创建树视图(可折叠列表) &#xff0c;而不需要 JavaScript。可访问性软件将看到树形视图作为列表嵌套在披露窗口小部件中&#xff0c;并且自动支持标准键盘交互。 1、HTML 我们就从简单嵌套列表的 html 开始: <ul><li>Giant planets&…

Hbase操作

(1) 启动 启动顺序&#xff1a;Hadoop--zookeeper—hbase 主进程&#xff1a;HMaster 从进程&#xff1a;HRegionServer 确认进程是否正常 (2) 进入终端 [rootmaster ~]# hbase shell (3) 查看状态 命令&#xff1a;status 表示有3台机器&#xff0c;0台down掉&…

位操作集锦

位操作集锦 异或运算两两交换数据签名检测两个数是否拥有不同的符号&#xff0c;即一个正数&#xff0c;一个负数寻找只出现一次的一个数字1寻找只出现两次的一个数字寻找只出现一次的一个数字2寻找只出现一次的两个数字 与和位移运算判断奇偶数二进制数中1的个数二进制数中最右…

MFC 给对话框添加图片背景

在windows开发当中做界面的主要技术之一就是使用MFC&#xff0c;通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。今天我们来说一下如何用MFC美化对话框&#xff0c;默认情况下&#xff0c;对话框的背景如下&#xff1a; 那么&#xff0c;我们如何将它的背景变…

C++服务器框架开发3——协程与线程的简单理解/并发与并行

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发2——头文件memory/typedef C服务器框架开发3——协程与线程的简单理解/并发与并行 目前进度协程与线程的简…

json-server的基本使用

1、mock是什么&#xff1f; mockjs 作用&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求 目的&#xff1a;很多时候前端开发页面的过程中&#xff0c;后端的接口并没有写好&#xff0c;这个时候需要前端自己定义接口及接口的返回数据的结构体&#xff0c;这个时候就需要…

ReactRouterDom-v5v6用法与异同

本文作者系360奇舞团前端开发工程师 简介&#xff1a; React Router Dom是React.js中用于实现路由功能的常用库。在React应用中&#xff0c;路由可以帮助我们管理页面之间的导航和状态&#xff0c;并实现动态加载组件。本文将深入探讨React Router Dom的两个主要版本&#xff1…

【微电网】含风、光、储联合发电的微电网优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Jupyter程序安装和使用指南【操作示例】

Jupyter Notebook(简称Jupyter)是一个交互式编辑器&#xff0c;它支持运行40多种编程语言&#xff0c;便于创建和共享文档。Jupyter本质上是一个Web应用程序&#xff0c;与其他编辑器相比&#xff0c;它具有小巧、灵活、支持实时代码、方便图表展示等优点。下面分别为大家演示如…

辅助生成: 低延迟文本生成的新方向

大型语言模型如今风靡一时&#xff0c;许多公司投入大量资源来扩展它们规模并解锁新功能。然而&#xff0c;作为注意力持续时间不断缩短的人类&#xff0c;我们并不喜欢大模型缓慢的响应时间。由于延迟对于良好的用户体验至关重要&#xff0c;人们通常使用较小的模型来完成任务…

EnjoyVIID部署

1、下载 git clone https://gitee.com/tsingeye/EnjoyVIID.git 2、导入数据库 创建表enjoyviid 导入数据库(修改数据库文件里的编码) EnjoyVIID/sql/tsingeye-viid.sql 3、修改配置 vim EnjoyVIID/tsingeye-admin/src/main/resources/application-dev.yml 修改数据库连接、re…

接口测试--apipost接口断言详解

在做接口测试的时候&#xff0c;会对接口进行断言&#xff0c;一个完整的接口测试&#xff0c;包括&#xff1a;请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言&#xff1a; apt.asser…

Linux-0.11 kernel目录进程管理asm.s详解

Linux-0.11 kernel目录进程管理asm.s详解 模块简介 该模块和CPU异常处理相关&#xff0c;在代码结构上asm.s和traps.c强相关。 CPU探测到异常时&#xff0c;主要分为两种处理方式&#xff0c;一种是有错误码&#xff0c;另一种是没有错误码&#xff0c;对应的方法就是error_c…

URP自定义屏幕后处理

回到目录 大家好&#xff0c;我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果&#xff0c;还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果&#xff0c;方法很简单&#xff0c;和Unity内置渲染管线的PostProcessing后处理很…

任务7 课程信息管理系统

系列文章 任务7 课程信息管理系统 已知课程的信息包括&#xff1a;课程编号&#xff0c;课程名称&#xff0c;课程性质&#xff08;必修、选修&#xff09;&#xff0c;课时&#xff0c;学分&#xff0c;考核方式&#xff08;考试、考查课&#xff09;&#xff0c;开课学期&a…

Ubuntu22.04安装MySQL8

在 Ubuntu 22.04 上安装 MySQL 8&#xff0c;可以按照以下步骤进行&#xff1a; 安装MySQL需要在root用户下 sudo su -更新软件包列表&#xff1a; sudo apt update安装 MySQL 8&#xff1a; sudo apt install mysql-server安装过程中会提示设置 MySQL root 用户的密码。 确认…

(学习日记)AD学习 #4

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

波奇学C++:模板和STL

什么是模板&#xff1f;为什么我们需要模板&#xff1f; 先假设一个场景&#xff0c;我们要编写一个函数交换a,b两个数的值 void swap(int& a,int& b) {int cmpa;ab;ba; } swap函数可以帮我们交换两个int型的值&#xff0c;那如果要交换的类型是float&#xff0c;do…

【linux解压和打包文件】

TOC 打包成zip文件 指令 zip zip -r -q -o html.zip html/ -r 参数表示递归打包包含子目录的全部内容&#xff0c;-q 参数表示为安静模式&#xff0c;即不向屏幕输出信息&#xff0c;-o 表示输出文件&#xff0c;需在其后紧跟打包输出文件名。解压zip文件 1.unzip -q …