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、什么是数组
数组是一种数据格式,能够存储多个同类型的值。
数组的特点:
- 数组中的元素按线性方式排列,可以通过编号来访问数组中的每个元素;
- 每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素;
2、数组的声明
要创建数组,可使用声明语句。数组声明应指出以下三点:
- 存储在每个元素中的值的类型;
- 数组名;
- 数组中的元素个数;
格式为:数据类型 数组名[数组大小];
注意:数组大小必须是整数常量,不可以是变量。
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
之前的文章介绍过,它返回变量或数据类型的字节个数。因为 arr
为 int
型数组,里面每一个元素都是 int
类型,所以 sizeof(arr)
表示所有元素的字节数,sizeof(int)
表示一个元素的字节数,两者之商就是元素的个数。
注意:如果数组大小较大(大概 10610^6106 级别),则需要将其定义在主函数外面,否则会使程序异常退出。因为函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
5、二维数组
- 声明二维数组
数据类型 数组名[m][n];
m
表示二维数组有多少个一维数组,n
表示每个一维数组的元素个数。
-
二维数组初始化
创建二维数组时,可以初始化其所有元素,二维数组初始化是建立在一维数组初始化技术的基础之上:提供由逗号分隔的用花括号括起的值列表。
int scores[3][4] = {{},{},{} };
注意:二维数组的行数个数必须全部用大括号指定,不能省略,否则编译出错!【例如上面的
scores
数组,我省略三个大括号中的一个是不行的】
6、memset
—— 给数组中每一个元素赋同样的值
给数组中每一个元素赋相同的值有两种方法:memset
和 fill
;
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 < 字符数组2:返回一个负整数;
- 字符数组1 < 字符数组2:返回一个正整数;
- 字符数组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
中内容的访问
-
直接像数组那样通过下标访问 string;
string str = "abc"; cout << str[0] << endl; // 要读入或输出整个字符串,只能使用 cin 和 cout// 还可以用 c_str() 将 string 类型转换为字符数组,然后用 printf 输出 printf("%s\n", str.c_str());
-
通过迭代器访问;
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()
str.insert(pos, string)
:在字符串str
的pos
号位置插入字符串string
;str.insert(it, it1, it2)
:it
为原字符串欲插入的位置,it1
和it2
为待插字符串的首尾迭代器,用来表示子串[it1, it2)
将被插入到it
的位置上;
3.5 erase()
str.erase(it)
:删除迭代器it
所在位置的元素;str.erase(begin, end)
:删除一个区间[begin, end)
内的所有元素;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()
str.find(str1)
:当str1
是str
的子串时,返回其在str
中第一次出现的位置;如果不是,则返回string::npos
;str.find(str1, pos)
:从str
的pos
号位开始匹配str1
,返回值与上相同;
3.10 replace()
str.replace(pos, length, str1)
:把str
从pos
号位开始、长度为length
的子串转换为str1
;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、什么是共用体
共用体(联合体)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。例如一个共用体中定义了 int
和 double
类型的变量,存储了 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_num
和 id_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 = 127128−1=127。 -
下限:枚举量最小值为0,则下限为0;否则寻找第一个小于它的2的幂次方,加上1;
例如最小枚举量为
-6
,第一小于它的是 −23=−8-2^3 = -8−23=−8,因此下限为 −8+1=−7-8 + 1 = -7−8+1=−7。
-
相关文章:

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、C11 字符串初始化…...
java重写(@Override)介绍及实例说明
1.概述方法的重写(override)是封装的特性之一。在子类中可以根据需要对基类中继承来的方法进行重写。重载和重写没有任何关系。作用:通过重写,子类既可以继承父类的东西,又可以灵活的扩充。1.override注解是告诉编译器…...

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

搭建云端vscode-server,使用web ide进行远程开发
使用乌班图系统,搭建自己的网页vs code开发环境github地址: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门控时钟实现基本概念 晶振:晶源振荡器 PLL:Phase lock loop,锁相环。用于提升频率 OSC:…...

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

“万字“ Java I/O流讲解
Java I/O流讲解 每博一文案 谁让你读了这么多书,又知道了双水村以外还有一个大世界,如果从小你就在这个天地里,日出而作,日落而息。 那你现在就会和众乡亲抱同一理想:经过几年的辛劳,像大哥一样娶个满意的…...
数据库(Spring)事务的四种隔离级别
文章目录Spring(数据库)事务隔离级别分为四种(级别递减)1、Serializable(串行化)2、REPEATABLE READ(可重复读)3、READ COMMITTED(读以提交)4、Read Uncommit…...

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

ICLR 2023 | GReTo:以同异配关系重新审视动态时空图聚合
©PaperWeekly 原创 作者 | 周正阳单位 | 中国科学技术大学论文简介动态时空图数据结构在多种不同的学科中均普遍存在,如交通流、空气质量观测、社交网络等,这些观测往往会随着时间而变化,进而引发节点间关联的动态时变特性。本文的主要…...
线程池分享总结
线程池介绍 可以复用线程池的每一个资源 控制资源的总量 为什么要使用线程池 问题一:反复创建线程开销大 问题二:过多的线程会占用太多内存 解决以上两个问题的思路 • 用少量的线程——避免内存占用过多 • 让这部分线程都保持工作,且可…...

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

layui框架学习(6:基础菜单)
菜单是应用系统的必备元素,虽然网页中的导航也能作为菜单使用,但菜单和导航的样式和用途有所不同(不同之处详见参考文献5)。Layui中用不同的预设类定义菜单和导航的样式,同时二者依赖的模块也不一样。本文主要学习和记…...
第十三届蓝桥杯 C++ B组省赛 C 题——刷题统计(AC)
1.刷题统计 1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 aaa 道题目, 周六和周日每天做 bbb 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 nnn 题? 2.输入格式 输入一行包含三个整数 a,ba,ba,b 和 nnn. 3.输出…...

C++中的多态
【1】表现形式:同样的调用语句有多种不同的表现形态 【2】分类:静态联编和动态联编 静态联编有函数重载(运算符重载是特殊的函数重载),模板 【3】重点说下动态联编 【3.1】动态联编的实现需要以下步骤: 有继承关系、父类函数有virtual关…...
Swift如何保证线程安全
Swift可以通过以下几种方式来保证线程安全 使用互斥锁(Mutex):使用互斥锁可以防止多个线程同时访问共享数据,保证线程安全。 使用OSAtomic操作:OSAtomic操作可以在多线程环境中安全地执行原子操作。 使用DispatchQue…...

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

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

【软件测试开发】Junit5单元测试框架
目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序,通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...