C++数组和字符串

364 阅读2分钟

数组的概念

数组是存储一组相同类型元素的数据结构。

数组的分类

数组按照元素的个数是否可以发生变化,分为静态数组和动态数组。

静态数组

  • 声明并初始化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后面将出现垃圾字符:

image.png

只所以会在字符数组的末尾添加'\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效率更高。

你问我答

  1. 计算字符串长度时,包括末尾的空字符吗? 答:不包括。字符串"Hello World"的长度为11,这包括其中的空格,但不包括末尾的空字符。
  2. 如果要用char数组标识C风格字符串,应将数组声明为多长? 答:这是C风格字符串最复杂的地方之一。数组的长度应比它可能包含的最长字符串长1,以便在末尾包含空字符。如果char数组可能存储的最长字符串为"Hello World",则应将数组的长度声明为12(11+1)。

总结

这篇文章讲解了一维数组和多维数组是什么以及如何声明和使用,以及静态数组和动态数组的区别,还讲解了C字符串、C++字符串以及C字符串和C++字符串之间的区别。