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

C++基础(5) - 复合类型(上)

文章目录

  • 数组
    • 1、什么是数组
    • 2、数组的声明
    • 3、数组的初始化
    • 4、数组的访问
    • 5、二维数组
    • 6、`memset` —— 给数组中每一个元素赋同样的值
  • 字符串(字符数组)
    • 1、`string.h` 头文件
      • 1.1 `strlen()`
      • 1.2 `strcmp()`
      • 1.3 `strcpy()`
      • 1.4 `strcat()`
  • string 类简介
    • 1、C++11 字符串初始化
    • 2、赋值、拼接和附加
    • 3、`string` 头文件
      • 3.1 `string` 中内容的访问
      • 3.2 `string` 的比较
      • 3.3 `length()/size()`
      • 3.4 `insert()`
      • 3.5 `erase()`
      • 3.6 `clear()`
      • 3.7 `substr()`
      • 3.8 `string::npos`
      • 3.9 `find()`
      • 3.10 `replace()`
  • 结构体
    • 1、结构体的定义和使用
    • 2、结构体变量的初始化
    • 3、结构体数组
  • 共用体
    • 1、什么是共用体
    • 2、共用体的用途
  • 枚举
    • 1、枚举的定义
    • 2、枚举的使用
    • 3、设置枚举量的值
    • 4、枚举的取值范围

数组

1、什么是数组

数组是一种数据格式,能够存储多个同类型的值。

数组的特点:

  1. 数组中的元素按线性方式排列,可以通过编号来访问数组中的每个元素;
  2. 每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素;

 

2、数组的声明

要创建数组,可使用声明语句。数组声明应指出以下三点:

  1. 存储在每个元素中的值的类型;
  2. 数组名;
  3. 数组中的元素个数;

格式为:数据类型 数组名[数组大小];

注意:数组大小必须是整数常量,不可以是变量。

 

3、数组的初始化

  • C++ 允许在声明语句中初始化数组元素,只需提供一个用逗号分隔的值列表(初始化列表),并将它们用花括号括起来,可省略等号(=);

    int arr[4] = {3, 6, 8, 10};
    int arr[4] {3, 6, 8, 10};	// C++11 新增
    
  • 只有在定义数组时才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组;

    int arr[4] = {3, 6, 8, 10};	// 正确int hand[4];
    hand[4] = {3, 6, 8, 10};	// 错误
    hand = arr;	// 错误
    
  • 初始化数组时,提供的值可以少于数组的元素数目。如果对数组的一部分进行初始化,则编译器将把其他元素设置成0。若想初始化数组为0,则只需要显式将第一个元素初始化为0即可;

    int arr[4] = {3, 6};	// 第1个元素3,第2个元素6,其他元素为0
    int arr[4] = {0};	// 所有元素初始化为0
    int arr[4] = {};	// C++11新增,所有元素初始化为0
    
  • 如果初始化数组时方括号内([])为空,C++ 编译器将计算元素个数;

    int arr[] = {3, 6, 8, 10};	// 编译器会自动识别元素个数为4
    
  • 列表初始化禁止缩窄转换;

    long plifs[] = {25, 92, 3.0};	// 错误,浮点数转换为整型是缩窄操作
    char slifs[4] = {'h', 'i', 1122011, '\0'};	// 错误,1122011超过了char变量的取值范围
    char tlifs[4] = {'h', 'i', 112, '\0'};	// 正确,虽然112是一个int值,但在char类型的取值范围
    

 

4、数组的访问

int arr[indx];

其中 indx 为数组的索引(下标),范围为 0 ~ length-1;数组长度 length = sizeof(arr) / sizeof(int)。这里的 sizeof 之前的文章介绍过,它返回变量或数据类型的字节个数。因为 arrint 型数组,里面每一个元素都是 int 类型,所以 sizeof(arr) 表示所有元素的字节数,sizeof(int) 表示一个元素的字节数,两者之商就是元素的个数。

注意:如果数组大小较大(大概 10610^6106 级别),则需要将其定义在主函数外面,否则会使程序异常退出。因为函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。

 

5、二维数组

  1. 声明二维数组

数据类型 数组名[m][n];

m 表示二维数组有多少个一维数组,n 表示每个一维数组的元素个数。

二维数组

  1. 二维数组初始化

    创建二维数组时,可以初始化其所有元素,二维数组初始化是建立在一维数组初始化技术的基础之上:提供由逗号分隔的用花括号括起的值列表。

    int scores[3][4] = {{},{},{}
    };
    

    注意:二维数组的行数个数必须全部用大括号指定,不能省略,否则编译出错!【例如上面的 scores 数组,我省略三个大括号中的一个是不行的】

     

6、memset —— 给数组中每一个元素赋同样的值

给数组中每一个元素赋相同的值有两种方法:memsetfill

memset 函数的格式为:memset(数组名, 值, sizeof(数组名));。需要引入 string.h 头文件。

只建议初学者为数组赋 0-1。因为 memset 使用的是按字节赋值,并不是按元素赋值,很容易出错。如果想按元素赋值,可以使用 fill 函数,此时需要引入 algorithm 头文件。

 
 

字符串(字符数组)

  • 字符串是存储在内存连续字节中的一系列字符,又可以称为字符数组;

  • C++ 处理字符串有两种方式,一种是 C 语言风格,另一种是基于 string 类;

  • 可以将字符串存储在 char 数组中,每个字符都位于自己的数组元素中;

  • C 语言风格的字符串是以空字符结尾(空字符被写作 \0,ASCII 码为 0),用来标记字符串的结尾。处理字符串的函数都是根据空字符的位置,而不是数组长度来进行处理;

    存储字符串 “Kitty” 的情况为:char name[6] = {'K', 'i', 't', 't', 'y', '\0'};

  • 字符数组初始化为字符串,可以使用双引号("")将字符串内容括起来【仅限于初始化,程序其他位置不允许这样直接赋值整个字符串】;

    char name[16] = "Hello Kitty";
    char name[] = "Kitty";
    
  • 注意字符常量和字符串常量的区别;

    'S' 是字符常量,"S" 是字符串常量,存储的是 ['S', '\0']

 

1、string.h 头文件

1.1 strlen()

strlen(字符数组):获得字符数组中第一个 \0 之前的字符个数。

1.2 strcmp()

strcmp(字符数组1, 字符数组2):返回两个字符串大小的比较结果,比较规则是字典序。

  1. 字符数组1 < 字符数组2:返回一个负整数;
  2. 字符数组1 < 字符数组2:返回一个正整数;
  3. 字符数组1 < 字符数组2:返回0;

1.3 strcpy()

strcpy(字符数组1, 字符数组2):把字符数组2复制到字符数组1,覆盖复制,这里的复制还包括结束符 \0

1.4 strcat()

strcat(字符数组1, 字符数组2):把字符数组2拼接到字符数组1后面,两者之间的结束符会被覆盖。

 
 

string 类简介

除了使用字符数组之外,还可以使用 string 来存储字符串,而且 string 使用起来会比字符数组要简单。

要使用 string,必须包含头文件 string

 

1、C++11 字符串初始化

C++11 允许将列表初始化用于 C 风格字符串和 string 对象:

char first_data[] = {"Hello World"};
char second_data[] = {"The Elegant Plate"};
string third_data = {"Hello World"};
string third_data {"Hello World"};string str = {'h', 'e', 'l', 'l', 'o'};
string str = "hello world";

 

2、赋值、拼接和附加

  • 不能将一个数组直接赋给另一个数组,但是可以将一个 string 对象直接赋给另一个 string 对象;

    char ch[20] = "hello";
    string str = "world";char ch1[20];
    ch1 = ch;	// 错误!!
    string str1;
    str1 = str;	// 正确!!
    
  • string 简化了合并操作,可以使用运算符 + 来将两个 string 对象合并起来,还可以使用 += 运算符。

    string str2 = str + str2;
    string str += str2;
    

 

3、string 头文件

虽然 string 类也可以使用 C 中的头文件 string.h,但是 C++ 为了更好地使用 string,也提供了自己的 string 操作函数。

3.1 string 中内容的访问

  1. 直接像数组那样通过下标访问 string;

    string str = "abc";
    cout << str[0] << endl;	// 要读入或输出整个字符串,只能使用 cin 和 cout// 还可以用 c_str() 将 string 类型转换为字符数组,然后用 printf 输出
    printf("%s\n", str.c_str());
    
  2. 通过迭代器访问;

    string str = "abc";
    string::iterator it = str.begin();
    // 上一句为了简便,还可以写成:
    auto it = str.begin();
    

3.2 string 的比较

两个 string 类型可以直接使用 关系运算符 进行比较,比较规则是字典序!

3.3 length()/size()

str.length()/str.size():返回字符串 str 的长度,即存放的字符数;

3.4 insert()

  1. str.insert(pos, string):在字符串 strpos 号位置插入字符串 string
  2. str.insert(it, it1, it2)it 为原字符串欲插入的位置,it1it2 为待插字符串的首尾迭代器,用来表示子串 [it1, it2) 将被插入到 it 的位置上;

3.5 erase()

  1. str.erase(it):删除迭代器 it 所在位置的元素;
  2. str.erase(begin, end):删除一个区间 [begin, end) 内的所有元素;
  3. str.erase(pos, length)pos 为开始删除的其实位置,length 为删除的字符个数;

3.6 clear()

str.clear():清空 string 中的数据;

3.7 substr()

str.substr(pos, length):返回从 pos 号位开始、长度为 length 的子串;

3.8 string::npos

一个常数,其本身的值为 -1,但由于是 unsigned_int 类型,因此实际上也可以被认为是 unsigned_int 类型的最大值。string::npos 用来作为 find 函数失配时的返回值。

3.9 find()

  1. str.find(str1):当 str1str 的子串时,返回其在 str 中第一次出现的位置;如果不是,则返回 string::npos
  2. str.find(str1, pos):从 strpos 号位开始匹配 str1,返回值与上相同;

3.10 replace()

  1. str.replace(pos, length, str1):把 strpos 号位开始、长度为 length 的子串转换为 str1
  2. str.replace(it1, it2, str1):把 str 的迭代器 [it1, it2) 范围的子串替换为 str1

 
 

结构体

结构体是由一批不同类型数据组合而成的一种新的数据类型,组成结构体数据的每个数据称为结构体的“成员”(域、元素),通常用来表示类型不同但是又相关的若干数据。

 

1、结构体的定义和使用

struct 结构体名字 {char name[20];	// 一些基本的数据结构或者自定的数据类型int age;...
}[结构体变量1, 结构体变量2, ...];	// [] 中的是可选项

结构体里面可以定义除了自己之外的任何数据类型,因为定义自己本身会引起循环定义的问题,但是可以定义自身类型的指针变量。

  • 假设结构体名字为 student,依次创建结构体类型的变量:

    struct student stu, *stup;	// stu 为结构体变量,stup 为结构体指针变量,两者访问变量方式不同
    student stu;
    
  • 访问结构体类型变量成员:

    cout << stu.name;	// 普通变量的访问方式
    cout << stup->name;	// 指针变量的访问方式
    

 

2、结构体变量的初始化

使用逗号分隔值列表,并将这些值用花括号括起来,值之间用逗号分开:

student stu = {"cat", 19};
student stu {"dog", 18};
student stu {};

 

3、结构体数组

  • 可以创建元素为结构体的数组,方法和创建基本类型数组完全相同:

    student stus[20];
    cin >> stus[0].name;
    cout << stus[19].age << endl;
    
  • 结构体数组初始化:

    student stus[2] = {{"cat", 19},{"dog", 18}
    };
    

 
 

共用体

1、什么是共用体

共用体(联合体)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。例如一个共用体中定义了 intdouble 类型的变量,存储了 int 型数据之后,再存储 double 型数据,此时 int 型数据会丢失。

union one4two{int id_int;long id_long;};one4two pail;pail.id_int = 3;cout << pail.id_int << endl;	// 3pail.id_long = 3000;cout << pail.id_long << endl;	// 3000cout << pail.id_int << endl;	// 3000

共用体的句法与结构体相似,但是含义不同,共用体的长度为其最大成员的长度:

union one4all
{char char_val;short short_val;int int_val;	// one4all 的长度就是 int 类型的长度
};

 

2、共用体的用途

共用体的用途之一是,当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。

假设管理一个小商品目录,其中有一些商品的ID为整数,而另外一些的ID为字符串:

struct widget
{char brand[20];int type;union id{long id_num;char id_char[20];} id_val;
};
...
widget prize;
...
if (prize.type == 1) {cin >> prize.id_val.id_num;
} else {cin << prize.id_val.id_char;
}

匿名共用体(anonymous union)没有名称,其成员将成为位于相同地址处的变量。显然,每次只有一个成员是当前的成员:

struct widget
{char brand[20];int type;union{long id_num;char id_char[20];};
};
...
widget prize;
...
if (prize.type == 1) {cin >> prize.id_num;
} else {cin >> prize.id_char;
}

由于共用体是匿名的,因此 id_numid_char 被视为 prize 的两个成员,它们的地址相同,所以不需要用中间标识符 id_val 。程序员负责确定当前哪个成员是活动的。

共用体常用于(但并非只能用于)节省内存。

 
 

枚举

前文提到过符号常量,使用 const#define 进行定义。C++ 的枚举类型 enum 提供了另一种创建符号常量的方式,可以代替 const,它还允许定义新类型。

 

1、枚举的定义

enum 枚举名 {枚举量1, 枚举量2, ...};// 例子如下:red为0,依此类推,数值加1。即 orange 为1,yellow 为2,...
enum colors {red, orange, yellow, green, blue, purple};

 

2、枚举的使用

// 使用枚举名声明该类型的变量
colors band;// 只能将定义枚举时使用的枚举量赋值给这种枚举的变量
band = red;
// band = 5;	// 错误!!// 可以通过强制类型转换,将有效的 int 值转换成枚举量
band = colors(4);// 枚举量是整型,可被提升为 int 类型,但 int 类型不能自动转换为枚举类型
int col = blue;
col = 3 + red;

 

3、设置枚举量的值

  • 可以使用赋值运算符来显式地设置枚举量地值,指定地值必须是整数:

    enum bits{one = 1, two = 2, four = 4, eight = 8};
    
  • 也可以只显式地定义其中一些枚举量的值:

    enum bigstep{first, second = 100, third};	// first 为0,third 为101
    

    first 默认情况下为0,后面没有初始化的枚举量的值比其前面的枚举量大1,third 的值为 101

  • 可以创建多个值相同的枚举量:

    enum{zero, null = 0, one, numero_uno = 1};	// 这里 zero 也为0,one 也为1
    

     

4、枚举的取值范围

  • 每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数赋值给枚举变量,即使这个值不是枚举值:

    enum bits{one = 1, two = 2, four = 4, eight = 8};
    bits myflag = bits(6);
    
  • 枚举取值范围:

    • 上限:寻找第一个大于枚举量最大值的2的幂次方,上限就是这个值减1;

      例如最大枚举量为 101,第一个大于它的是 27=1282^7 = 12827=128,所以上限就是 128−1=127128 - 1 = 1271281=127

    • 下限:枚举量最小值为0,则下限为0;否则寻找第一个小于它的2的幂次方,加上1;

      例如最小枚举量为 -6,第一小于它的是 −23=−8-2^3 = -823=8,因此下限为 −8+1=−7-8 + 1 = -78+1=7

相关文章:

C++基础(5) - 复合类型(上)

文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串&#xff08;字符数组&#xff09;1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…...

java重写(@Override)介绍及实例说明

1.概述方法的重写&#xff08;override&#xff09;是封装的特性之一。在子类中可以根据需要对基类中继承来的方法进行重写。重载和重写没有任何关系。作用&#xff1a;通过重写&#xff0c;子类既可以继承父类的东西&#xff0c;又可以灵活的扩充。1.override注解是告诉编译器…...

基于STM32的虚拟示波器

仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeGUI使用 截图说明见wiki 最新版Releases Introduction 用最少的硬件成本&#xff0c;做一个实用的虚拟示波器。 这是硬件部分&#xff0c;基于STM32最小…...

搭建云端vscode-server,使用web ide进行远程开发

使用乌班图系统&#xff0c;搭建自己的网页vs code开发环境github地址&#xff1a;GitHub - coder/code-server: VS Code in the browser安装脚本curl -fsSL https://code-server.dev/install.sh | sh出现deb package has been installed.表示已经正确安装。测试启动2.1修改配置…...

Linux clock子系统及驱动实例

文章目录基本概念CLK子系统时钟API的使用clock驱动实例1、时钟树2、设备树3、驱动实现fixed_clk固定时钟实现factor_clk分频时钟实现gate_clk门控时钟实现基本概念 晶振&#xff1a;晶源振荡器 PLL&#xff1a;Phase lock loop&#xff0c;锁相环。用于提升频率 OSC&#xff1a…...

GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)

文章目录前言一、坐标系1.地球坐标 (WGS84)2.国测局坐标系(GCJ-02、火星坐标系)3.百度坐标(BD-09)4.国家大地2000坐标系(CGCS2000)二、百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换1.核心代码2.转换验证百度地图高德地图腾讯地图三、火星坐标系 (GCJ-02) 与百度坐标系 (BD-09…...

流媒体传输系列文章汇总

流媒体传输系列文章汇总 文章目录流媒体传输系列文章汇总引言流媒体交互协议详解视频封装协议详解流媒体环境搭建其他引言 从去年开始编写有关流媒体传输相关知识的文章&#xff0c;已发表文章22篇&#xff0c;阅读量也超过了10万&#xff0c;为了方便各位阅读&#xff0c;本文…...

“万字“ Java I/O流讲解

Java I/O流讲解 每博一文案 谁让你读了这么多书&#xff0c;又知道了双水村以外还有一个大世界&#xff0c;如果从小你就在这个天地里&#xff0c;日出而作&#xff0c;日落而息。 那你现在就会和众乡亲抱同一理想&#xff1a;经过几年的辛劳&#xff0c;像大哥一样娶个满意的…...

数据库(Spring)事务的四种隔离级别

文章目录Spring&#xff08;数据库&#xff09;事务隔离级别分为四种&#xff08;级别递减&#xff09;1、Serializable&#xff08;串行化&#xff09;2、REPEATABLE READ&#xff08;可重复读&#xff09;3、READ COMMITTED&#xff08;读以提交&#xff09;4、Read Uncommit…...

RabbitMQ详解(一):RabbitMQ相关概念

RabbitMQ是目前非常热门的一款消息中间件&#xff0c;不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者&#xff0c;有必要对RabbitMQ有所了解&#xff0c;本系列是RabbitMQ快速入门文章&#xff0c;主要内容包括RabbitMQ是什么、RabbitMQ核心概念、五种消息模…...

​ICLR 2023 | GReTo:以同异配关系重新审视动态时空图聚合

©PaperWeekly 原创 作者 | 周正阳单位 | 中国科学技术大学论文简介动态时空图数据结构在多种不同的学科中均普遍存在&#xff0c;如交通流、空气质量观测、社交网络等&#xff0c;这些观测往往会随着时间而变化&#xff0c;进而引发节点间关联的动态时变特性。本文的主要…...

线程池分享总结

线程池介绍 可以复用线程池的每一个资源 控制资源的总量 为什么要使用线程池 问题一&#xff1a;反复创建线程开销大 问题二&#xff1a;过多的线程会占用太多内存 解决以上两个问题的思路 • 用少量的线程——避免内存占用过多 • 让这部分线程都保持工作&#xff0c;且可…...

AOSP Android11系统源码和内核源码

推荐阅读 商务合作 安全产品 安全服务 2023年招聘 安全培训服务 软件定制服务 Android系统定制服务 安全/软件开发的课程列表 1.下载repo工具 (1).创建bin&#xff0c;并加入到PATH中 mkdir ~/binPATH~/bin:$PATH (2).安装依赖库 sudo apt-get install bison g-mult…...

layui框架学习(6:基础菜单)

菜单是应用系统的必备元素&#xff0c;虽然网页中的导航也能作为菜单使用&#xff0c;但菜单和导航的样式和用途有所不同&#xff08;不同之处详见参考文献5&#xff09;。Layui中用不同的预设类定义菜单和导航的样式&#xff0c;同时二者依赖的模块也不一样。本文主要学习和记…...

第十三届蓝桥杯 C++ B组省赛 C 题——刷题统计(AC)

1.刷题统计 1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 aaa 道题目, 周六和周日每天做 bbb 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 nnn 题? 2.输入格式 输入一行包含三个整数 a,ba,ba,b 和 nnn. 3.输出…...

C++中的多态

【1】表现形式&#xff1a;同样的调用语句有多种不同的表现形态 【2】分类&#xff1a;静态联编和动态联编 静态联编有函数重载(运算符重载是特殊的函数重载),模板 【3】重点说下动态联编 【3.1】动态联编的实现需要以下步骤&#xff1a; 有继承关系、父类函数有virtual关…...

Swift如何保证线程安全

Swift可以通过以下几种方式来保证线程安全 使用互斥锁&#xff08;Mutex&#xff09;&#xff1a;使用互斥锁可以防止多个线程同时访问共享数据&#xff0c;保证线程安全。 使用OSAtomic操作&#xff1a;OSAtomic操作可以在多线程环境中安全地执行原子操作。 使用DispatchQue…...

整型提升+算术转换——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是之前操作符那篇博客中没有讲完的内容&#xff0c;整型提升这个小知识点也非常重要&#xff0c;那现在&#xff0c;就让我们进入操作符的世界吧 隐式类型转换 算术转换 操作符的属性 隐式类型转换 表达式求值的顺序一部…...

Freemarker介绍

2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它基于模板来生成文本输出。FreeMarker与 Web 容器无关&#xff0c;即在 Web 运行时&#xff0c;它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术&#xff0c;而且还可以用于生成 XML…...

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...