数组的概念
数组是存储一组相同类型元素的数据结构。
数组的分类
数组按照元素的个数是否可以发生变化,分为静态数组和动态数组。
静态数组
- 声明并初始化5个元素的数组
int number[5] = {1,2,3,4,5};
- 初始化部分元素
int number[5] = {1,2};
其他元素会默认初始化为0
数据在内存中如何存储
数组中的每个元素就占用一个空间,空间的大小取决于数据的类型,以上示例一共5个元素,每个元素都是int类型,所以公共占用sizeof(int) * 5;
数组的访问
int number[5] = {1,2,3,4,5};
cout << number[0] << endl;
cout << number[1] << endl;
cout << number[2] << endl;
cout << number[3] << endl;
cout << number[4] << endl;
数组的修改
number[0] = 2021;
多维数组
int main() {
int number[4][5] = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
cout << number[0][0] << endl;
cout << number[1][1] << endl;
cout << number[2][2] << endl;
cout << number[3][3] << endl;
number[0][0] = 2021;
cout << number[0][0] << endl;
return 0;
}
动态数组
动态数组是在运行时阶段根据需要增大动态数组。C++ 提供了 std::vector ,这是一种方便且易于使用的动态数组。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> DynArrNums(3);
DynArrNums[0] = 365;
DynArrNums[1] = -365;
DynArrNums[2] = 789;
cout << "Number of integers in array: " << DynArrNums.size() <<endl;
cout << "Enter another number for the array" << endl;
int AnotherNum = 0;
cin >> AnotherNum;
DynArrNums.push_back(AnotherNum);
cout << "Number of integers in array: " << DynArrNums.size() << endl;
cout << "Last element ina array: ";
cout << DynArrNums[DynArrNums.size()-1] << endl;
return 0;
}
Number of integers in array: 3
Enter another number for the array
10
Number of integers in array: 4
Last element ina array: 10
要使用动态数组类std::vector,需要包含头文件vector。这个后面我们会再详细讲解vector。
C风格字符串
什么是C风格字符串?常见的字符串字面量,都是C风格字符串,如下所示:
cout << "Hello World" << endl;
它与下面使用数组的方式等价:
char SayHello[] = {'H','e','l','l','o',' ','W','o','r','l','d','\0'};
cout << SayHello << endl;
cout << sizeof(SayHello) << endl;
注意:要想使得上面两种情况等价,数组的末尾需要添加字符串结束字符'\0',因为字符串字面量在编译的时候,编译器会负责在它们后面添加'\0'.'\0'相当于空字符或零。如果缺少'\0',则打印该数组时,Hello World后面将出现垃圾字符:
只所以会在字符数组的末尾添加'\0',是因为编译器遇到'\0'字符,就会停止输出。
char SayHello[] = {'H','e','l','l','o',' ','w','o','r','l','d','\0'};
cout << SayHello << endl;
cout << "Size of array: " << sizeof(SayHello) << endl;
cout << "Replacing space with null" << endl;
SayHello[5] = '\0';
cout << SayHello << endl;
cout << "Size of array: " << sizeof(SayHello) << endl;
return 0;
Hello world
Size of array: 12
Replacing space with null
Hello
Size of array: 12
C++字符串:使用std::string
从上一节我们可以看到,采用C字符串作为输入,还是蛮危险的,因为如果没有在字符数组的末尾添加'\0',很有可能出现越界的情况。而C++字符串还具有动态的特点,需要存储更多数据时其容量将增大。
cout << "Enter a line of text: " << endl;
string FirstLine;
cin >> FirstLine;
cout << FirstLine << endl;
return 0;
asdfghjklkjhgfdsa
asdfghjklkjhgfdsa
std::string它可以完整的打印你输入的内容。另外在处理文本输入,拼接字符串等方面,使用std::string效率更高。
你问我答
- 计算字符串长度时,包括末尾的空字符吗? 答:不包括。字符串"Hello World"的长度为11,这包括其中的空格,但不包括末尾的空字符。
- 如果要用char数组标识C风格字符串,应将数组声明为多长? 答:这是C风格字符串最复杂的地方之一。数组的长度应比它可能包含的最长字符串长1,以便在末尾包含空字符。如果char数组可能存储的最长字符串为"Hello World",则应将数组的长度声明为12(11+1)。
总结
这篇文章讲解了一维数组和多维数组是什么以及如何声明和使用,以及静态数组和动态数组的区别,还讲解了C字符串、C++字符串以及C字符串和C++字符串之间的区别。