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

C++-----------数组

1. 声明数组

在 C++ 中,数组是存储相同类型元素的集合。可以使用以下语法来声明数组:

#include <iostream>

int main() {
    // 声明一个包含 5 个元素的整型数组
    int myArray[5];
    // 声明一个包含 3 个元素的双精度浮点数数组
    double anotherArray[3];

    return 0;
}

在上述代码中:

  • int myArray[5]; 声明了一个名为 myArray 的整型数组,其长度为 5。
  • double anotherArray[3]; 声明了一个名为 anotherArray 的双精度浮点数数组,其长度为 3。

2. 数组元素的选择

使用下标运算符 [] 可以访问数组中的元素。数组的下标从 0 开始,最大下标为 数组长度 - 1。例如:

#include <iostream>

int main() {
    int myArray[5] = {10, 20, 30, 40, 50};

    // 访问数组元素
    std::cout << myArray[0] << std::endl; // 输出第一个元素,即 10
    std::cout << myArray[2] << std::endl; // 输出第三个元素,即 30

    // 修改数组元素
    myArray[1] = 25;
    std::cout << myArray[1] << std::endl; // 输出修改后的第二个元素,即 25

    return 0;
}

在这个示例中:

  • myArray[0] 表示数组的第一个元素。
  • myArray[2] 表示数组的第三个元素。
  • myArray[1] = 25; 修改了数组的第二个元素。

3. 数组的静态初始化

静态初始化允许在声明数组时为元素提供初始值。可以使用以下几种方式:

#include <iostream>

int main() {
    // 完全初始化
    int array1[3] = {1, 2, 3};

    // 部分初始化,未初始化的元素会被编译器初始化为 0
    int array2[5] = {4, 5};

    // 字符数组的初始化
    char charArray[] = "Hello";

    std::cout << array1[0] << " " << array1[1] << " " << array1[2] << std::endl;
    std::cout << array2[0] << " " << array2[1] << " " << array2[2] << " " << array2[3] << " " << array2[4] << std::endl;
    std::cout << charArray << std::endl;

    return 0;
}

在上述代码中:

  • int array1[3] = {1, 2, 3}; 对数组进行了完全初始化。
  • int array2[5] = {4, 5}; 进行了部分初始化,未初始化的元素(array2[2]array2[3]array2[4])将被初始化为 0。
  • char charArray[] = "Hello"; 字符数组可以直接使用字符串常量进行初始化,编译器会自动添加字符串结束符 '\0'

4. 有效容量和分配容量

  • 有效容量:是指数组中实际存储元素的数量。对于静态数组,其有效容量就是声明时指定的元素数量,例如 int myArray[5] 的有效容量是 5。
  • 分配容量:对于静态数组,分配容量与有效容量相同。

以下是一个使用 sizeof 运算符计算数组有效容量的示例:

#include <iostream>

int main() {
    int myArray[5] = {10, 20, 30, 40, 50};
    int size = sizeof(myArray) / sizeof(myArray[0]);
    std::cout << "有效容量: " << size << std::endl; // 输出有效容量,应为 5

    return 0;
}

在这个示例中,sizeof(myArray) 得到数组 myArray 占用的总字节数,sizeof(myArray[0]) 得到数组中一个元素占用的字节数,相除得到元素的数量。

5. 指针和数组的分配关系

在 C++ 中,数组名可以隐式转换为指向其第一个元素的指针。以下是指针和数组之间关系的一些示例:

#include <iostream>

int main() {
    int myArray[5] = {10, 20, 30, 40, 50};

    // 数组名转换为指针
    int* ptr = myArray;
    std::cout << *ptr << std::endl; // 输出第一个元素,即 10

    // 指针运算
    ptr++;
    std::cout << *ptr << std::endl; // 输出第二个元素,即 20

    // 另一种指针表示法
    std::cout << *(myArray + 2) << std::endl; // 输出第三个元素,即 30

    // 使用指针遍历数组
    for (int* p = myArray; p < myArray + 5; ++p) {
        std::cout << *p << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上述代码中:

  • int* ptr = myArray; 将数组名 myArray 转换为指向其第一个元素的指针。
  • ptr++; 使指针指向下一个元素,因为指针算术运算会根据元素的大小自动调整偏移量。
  • *(myArray + 2)myArray[2] 等价,使用指针算术运算访问数组元素。
  • 循环 for (int* p = myArray; p < myArray + 5; ++p) 使用指针遍历数组。

6. 动态数组

除了静态数组,C++ 还支持使用 newdelete[] 运算符创建动态数组:

#include <iostream>

int main() {
    // 动态分配数组
    int* dynamicArray = new int[5];

    // 初始化动态数组元素
    for (int i = 0; i < 5; ++i) {
        dynamicArray[i] = i * 10;
    }

    // 访问动态数组元素
    for (int i = 0; i < 5; ++i) {
        std::cout << dynamicArray[i] << " ";
    }
    std::cout << std::endl;

    // 释放动态数组内存
    delete[] dynamicArray;

    return 0;
}

在这个示例中:

  • int* dynamicArray = new int[5]; 使用 new 运算符在堆上分配了一个包含 5 个元素的整型数组。
  • 可以像操作静态数组一样使用 [] 运算符访问元素。
  • delete[] dynamicArray; 使用 delete[] 运算符释放动态分配的内存,防止内存泄漏。

需要注意的是,对于动态数组,使用完后必须使用 delete[] 释放内存,否则会导致内存泄漏。而静态数组由编译器自动管理内存,无需手动释放。

7. 多维数组

C++ 还支持多维数组,以下是一个二维数组的示例:

#include <iostream>

int main() {
    // 声明一个二维数组
    int twoDArray[3][4] = {{1, 2, 3, 4},
                       {5, 6, 7, 8},
                       {9, 10, 11, 12}};

    // 访问二维数组元素
    std::cout << twoDArray[1][2] << std::endl; // 输出第二行第三列元素,即 7

    // 使用指针遍历二维数组
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            std::cout << twoDArray[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

在上述代码中:

  • int twoDArray[3][4] 声明了一个 3 行 4 列的二维数组。
  • twoDArray[1][2] 访问第二行第三列的元素。

总结:

  • 数组是 C++ 中存储相同类型元素的重要数据结构。
  • 可以静态或动态声明数组,并使用下标运算符 [] 访问元素。
  • 数组名可以转换为指针,指针运算可用于数组元素的访问和遍历。
  • 对于动态数组,使用 new 分配内存,使用 delete[] 释放内存。
    在这里插入图片描述

http://www.kler.cn/a/452741.html

相关文章:

  • Linux复习2——管理文件系统1
  • 数据可视化期末复习-简答题
  • golang,多个proxy拉包的处理逻辑
  • MT6765核心板_MTK6765安卓核心板规格参数_联发科MTK模块开发
  • 结构化Prompt:让大模型更智能的秘诀
  • 保姆级教程Docker部署RabbitMQ镜像
  • 【Linux】如何对比两个文件数据不同的地方
  • python+reportlab创建PDF文件
  • Vulnhub之Cengbox 2靶机详细测试过程(利用不同的方法提权)
  • 数据结构之栈,队列,树
  • 从想法到实践:Excel 转 PPT 应用的诞生之旅
  • vscode+编程AI配置、使用说明
  • 【Spring 全家桶】 Spring IOC DI 保姆式教学, 教你不用new也能获取到对象的依赖注入方式, 建议收藏 . . .
  • BP分类-反向传播神经网络(Backpropagation Neural Network)
  • qt实现socketCAN
  • hive常用函数有哪些
  • HCIE-day9-OSPF
  • 亚远景-ISO 21434标准涵盖了哪些方面?
  • 基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境
  • 01.HTTPS的实现原理-HTTPS的概念