目录
数组和字符串
(一)数组(在 C++ 中)
1.一维数组
2.二维数组
(二)C - style 字符串
(三)C++ string 类
数组和字符串
(一)数组(在 C++ 中)
1.一维数组
- 定义:
格式为数据类型 数组名[数组大小];
,例如int arr[5];
就定义了一个名为arr
,能存放 5 个int
类型元素的一维数组。数组大小必须是常量表达式,在编译时就能确定其值。 - 初始化:
可以在定义时进行初始化,像int arr[5] = {1, 2, 3, 4, 5};
这种方式是完全初始化,也可以部分初始化,比如int arr[5] = {1, 2};
,此时未被初始化的元素会被自动初始化为对应数据类型的默认值(对于int
类型就是 0)。还能省略数组大小让编译器自动根据初始化元素个数来确定,如int arr[] = {1, 2, 3};
,编译器会将数组arr
的大小确定为 3。 - 访问:
通过下标来访问数组元素,下标从 0 开始。例如上面定义的arr
数组,arr[0]
表示访问第一个元素(值为 1),arr[4]
表示访问第五个元素。要注意访问时不能超出数组定义的下标范围,否则会导致越界访问,引发程序错误,比如访问arr[5]
就是越界了(因为合法下标是 0 到 4)。#include <iostream> using namespace std; int main() { int arr[3] = {11,22,33}; for (int i = 0;i < 3;i++) { std::cout << arr[i] << std::endl; } return 0; }
2.二维数组
- 概念:
二维数组可以理解为是一种 “数组的数组”,它的逻辑结构类似表格,有行和列。定义格式如数据类型 数组名[行数][列数];
,例如int matrix[3][4];
定义了一个 3 行 4 列的二维数组,用来存放int
类型的数据。 - 初始化:
可以按行初始化,例如int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
,每一对大括号内对应一行元素的值。也可以整体初始化,像int matrix[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
,编译器会按顺序依次给元素赋值,不过按行初始化的方式可读性更好。同样可以省略第一维的大小让编译器根据初始化情况确定,前提是对第二维大小有明确指定,比如int matrix[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8} };
,编译器能判断出这里是 2 行 4 列的二维数组。 - 访问:
使用两个下标来访问元素,第一个下标表示行,第二个下标表示列,都是从 0 开始计数。例如对于上面定义的matrix
数组,matrix[1][2]
表示访问第二行第三列的元素(值为 7)。
#include <iostream>
using namespace std;
int main() {
int arr[][3] = {{11, 22},33};
for (int i = 0;i < 2;i++) {
for (int j = 0; j < 3; ++j) {
std::cout << arr[i][j] << std::endl;
}
}
return 0;
}
(二)C - style 字符串
- 本质:
是以'\0'
(空字符,ASCII 值为 0)结尾的字符数组。例如char str[] = "hello";
,实际上在内存中存储的是{'h', 'e', 'l', 'l', 'o', '\0'}
,这个'\0'
用于标识字符串的结束位置,这样在处理字符串相关操作时,函数就能通过检测'\0'
来确定字符串的长度等信息。 - 常用字符串处理函数:
- strcpy:用于将一个字符串复制到另一个字符数组中。例如
char dest[20]; char src[] = "source"; strcpy(dest, src);
,会把src
字符串(包括结尾的'\0'
)复制到dest
字符数组中。需要注意的是,dest
数组要有足够的空间来存放要复制的字符串,不然会导致缓冲区溢出等错误。 - strcat:用于把一个字符串连接到另一个字符串的末尾。比如
char str1[20] = "hello"; char str2[] = " world"; strcat(str1, str2);
,执行后str1
的内容就变成了"hello world"
,同样要保证str1
有足够空间来容纳连接后的结果。 - strcmp:用来比较两个字符串的大小关系。它按字符的 ASCII 值逐个比较两个字符串对应位置的字符,直到遇到不同字符或者到达
'\0'
结束。如果两个字符串相等返回 0,如果第一个字符串大于第二个字符串返回一个正值,如果第一个字符串小于第二个字符串返回一个负值。例如char str1[] = "abc"; char str2[] = "abd"; int result = strcmp(str1, str2);
,这里result
的值就小于 0,因为'c'
的 ASCII 值小于'd'
。
- strcpy:用于将一个字符串复制到另一个字符数组中。例如
int main() {
char dest[20] = {'0'};
char src[] = "source";
std::cout << dest << std::endl;
strcpy(dest, src);
std::cout << src << std::endl;
std::cout << dest << std::endl;
return 0;
}
int main() {
char str1[20] = "hello";
char str2[] = " world";
strcat(str1, str2);
std::cout << str1 << std::endl;
return 0;
}
int main() {
char str1[] = "abc";
char str2[] = "abd";
int result = strcmp(str1, str2);
std::cout << result << std::endl;
return 0;
}
(三)C++ string 类
- 定义与初始化:
可以直接用字符串字面量来初始化,如string str = "Hello";
,也可以通过构造函数等其他方式初始化,比如string str1(5, 'a');
会初始化出一个包含 5 个'a'
字符的字符串。 - 基本操作:
- 字符串拼接:可以使用
+
运算符方便地进行字符串拼接,例如string str1 = "Hello"; string str2 = " world"; string result = str1 + str2;
,result
的内容就是"Hello world"
。而且还能和字符串字面量拼接,像string str = "Hello"; str = str + " C++";
。 - 字符访问:通过
[]
运算符来访问字符串中的单个字符,例如string str = "abc"; char ch = str[1];
,这里ch
的值就是'b'
,不过要注意访问时不能超出字符串的有效范围(下标不能小于 0 且不能大于等于字符串长度)。 - 获取长度:使用
length()
或者size()
函数可以获取字符串的长度,例如string str = "abc"; int len = str.length();
,这里len
的值就是 3。 - 其他操作:还有很多实用的函数,比如
find()
函数用于查找子字符串在字符串中的位置,substr()
函数可以提取字符串中的一部分内容等。
- 字符串拼接:可以使用
int main() {
string str = "Hello";
str = str + " C++";
std::cout << str << std::endl;
string strq = "abc";
char ch = strq[1];
std::cout << ch << std::endl;
std::cout << str.length() << std::endl;
std::cout << str.size() << std::endl;
return 0;
}
总的来说,C - style 字符串在 C++ 中依然可以使用,但 string
类提供了更方便、更安全且功能更丰富的字符串操作方式,在实际的 C++ 编程中被广泛应用。 而数组无论是一维还是二维,都是存储一组相同类型数据的有效方式,方便对批量数据进行处理。