C++学习之数组

简介: C++学习之数组

数组介绍

C++中的数组是一种存储相同类型数据的数据结构。它是一个固定大小的连续内存块,其中的每个元素都可以通过索引访问。

以下是一些关于C++数组的重要特点和用法:

  1. 数组声明:在使用数组之前,需要先声明数组的类型和大小。例如,int numbers[5]; 声明了一个包含5个整数的数组。
  2. 元素访问:通过指定索引号来访问数组元素。数组的索引从0开始,最后一个元素的索引为数组大小减一。例如,numbers[0] = 10; 将数组的第一个元素赋值为10。
  3. 数组初始化:可以使用初始化列表或循环语句初始化数组的元素。例如,int numbers[] = {1, 2, 3, 4, 5}; 使用初始化列表初始化了一个包含5个整数的数组。如果未指定数组大小,则根据初始化列表中元素的数量自动确定大小。
  4. 数组长度:可以使用sizeof运算符获取数组的大小(以字节为单位)。例如,int size = sizeof(numbers) / sizeof(numbers[0]); 计算了数组的元素数量。
  5. 多维数组:C++还支持多维数组。可以使用类似于二维表格的方式来声明和访问多维数组。例如,int matrix[3][3]; 声明了一个3x3的整数矩阵。
  6. 数组作为函数参数:可以将数组作为函数的参数进行传递。通常情况下,数组作为指针传递给函数,因为数组名会转换为指向数组首元素的指针。
  7. 数组注意事项:需要注意数组的边界问题,避免越界访问数组。确保数组的大小足够容纳需要存储的元素。数组长度在声明时必须是一个常量表达式。

C++的数组提供了一种便捷的方式来存储和处理具有相同类型的数据。掌握数组的用法对于编写C++程序非常重要。

C++数组的各种声明方式

在C++中,有多种声明数组的方式。以下是几种常见的数组声明方式:

声明并指定大小

int numbers[5]; // 声明一个包含5个整数的数组

声明并初始化

int numbers[] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的数组

使用动态内存分配

int* numbers = new int[5]; // 动态分配一个包含5个整数的数组

在使用完后,需要使用delete[]释放内存:delete[] numbers;

多维数组的声明

int matrix[3][3]; // 声明一个3x3的整数矩阵

使用typedef来定义数组类型

typedef int NumberArray[5]; // 使用typedef定义包含5个整数的数组类型
NumberArray numbers; // 使用定义好的数组类型声明数组

使用模板数组

#include <array>
std::array<int, 5> numbers; // 使用模板数组声明一个包含5个整数的数组

以上只是一些常见的声明方式,根据实际需求和使用场景,可以选择适合的数组声明方式。并且,在选择声明方式时,要考虑数组的大小、生命周期和内存管理的需求。

C++数组的元素访问

在C++中,可以通过使用索引来访问数组的元素。数组的索引从0开始,表示第一个元素,依次递增。

假设有一个名为numbers的整数数组,以下是一些常见的数组元素访问方式:

通过索引单独访问元素

int numbers[5] = {10, 20, 30, 40, 50};
int firstElement = numbers[0]; // 访问第一个元素,值为10
int secondElement = numbers[1]; // 访问第二个元素,值为20

通过循环遍历数组中的所有元素

int numbers[5] = {10, 20, 30, 40, 50};
for(int i = 0; i < 5; i++) {
    cout << numbers[i] << " "; // 输出每个元素的值
}
// 输出: 10 20 30 40 50

使用指针访问数组元素

int numbers[5] = {10, 20, 30, 40, 50};
int* ptr = numbers; // 数组名实际上是指向第一个元素的指针
int firstElement = *ptr; // 这里的*ptr相当于numbers[0],值为10
int thirdElement = *(ptr + 2); // 这里的*(ptr+2)相当于numbers[2],值为30

需要注意的是,数组索引越界会导致不可预料的结果或未定义的行为。确保在访问数组元素时,始终在有效的索引范围内进行操作。

对于多维数组,可以使用类似于二维表格的方式来访问元素。例如,对于一个matrix二维数组:

int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int element = matrix[1][2]; // 访问第二行第三列的元素,值为6

以上示例展示了一些常见的数组元素访问方式,你可以根据需要选择适合的方法。

C++数组初始化

C++中有几种不同的方式来声明和初始化数组。以下是一些常见的数组声明和初始化的方式:

声明并初始化固定大小的数组

int numbers[5]; // 声明一个包含5个整数的数组
int numbers[] = {1, 2, 3, 4, 5}; // 自动根据初始化列表确定数组大小

动态分配数组,并初始化它的元素

int size = 5;
int* dynamicArray = new int[size]; // 动态分配包含5个整数的数组
for (int i = 0; i < size; i++) { // 初始化数组元素
    dynamicArray[i] = i + 1;
}

在使用完动态数组后,别忘了使用delete[]释放内存:

delete[] dynamicArray;

声明和初始化多维数组

int matrix[3][3]; // 声明一个3x3的整数矩阵
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 声明并初始化整数矩阵

使用循环来初始化数组的元素

int length = 5;
int numbers[length];
for (int i = 0; i < length; i++) {
    numbers[i] = i + 1; // 初始化数组元素
}

使用std::array容器类来声明和初始化数组(需要包含 <array> 头文件)

#include <array>
std::array<int, 5> numbers = {1, 2, 3, 4, 5}; // 数组大小为5

C++数组长度

在C++中,数组的长度可以通过以下几种方式获取:

使用sizeof运算符

可以使用sizeof运算符获取数组的字节大小,然后将其除以单个元素的字节数,即可得到数组的长度。例如:

int numbers[5];
int size = sizeof(numbers) / sizeof(numbers[0]); // 获取数组长度为5

使用C++标准库函数std::extent

C++的标准库中提供了std::extent函数,可以用于获取数组的长度。该函数接受数组类型和维度作为参数,并返回数组在指定维度上的长度。例如:

int numbers[5];
int size = std::extent<decltype(numbers)>::value; // 获取数组长度为5

使用常量表达式

如果在声明数组时使用了常量表达式作为数组大小,那么可以直接使用该常量表达式作为数组的长度。例如:

const int length = 5;
int numbers[length]; // 获取数组长度为5

需要注意的是,在使用以上方法时,数组的大小必须是一个编译时可知的常量。如果数组的大小是在运行时确定的,这些方法是无法得到数组长度的。

C++多维数组

C++中的多维数组是一个具有多个维度(行和列)的数组。我们可以将其想象为一个表格或矩阵。

以下是在C++中声明和使用多维数组的示例:

// 声明一个二维数组
int matrix[3][3];
// 初始化一个二维数组
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
// 访问二维数组中的元素
int element = matrix[0][1];  // 访问第一行第二列中的元素
// 修改二维数组中的元素
matrix[1][1] = 10;
// 声明一个三维数组
int cube[2][3][4];
// 初始化一个三维数组
int cube[2][3][4] = {
    {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
    {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
};
// 访问三维数组中的元素
int element = cube[0][1][2];  // 访问第一层第二行第三列中的元素
// 修改三维数组中的元素
cube[1][2][3] = 30;

以上示例展示了如何声明、初始化、访问和修改二维和三维数组。在声明多维数组时,需要指定每个维度的大小,以便分配适当的内存空间。要访问特定的数组元素,请使用方括号运算符[]和相应的索引值,其中第一个索引表示行(或层数),第二个索引表示列(或行数),以此类推。注意数组的索引从0开始。

记住,在处理多维数组时,必须谨慎处理边界问题,确保不会越界。另外,多维数组的维度和大小可以根据需求灵活调整。

数组作为函数参数

在C++中,数组作为函数参数可以通过以下几种方式进行传递:

  1. 传递数组的指针:数组名在函数中被解释为一个指向数组首元素的指针。函数接受一个指针参数来接收数组,并用指针访问数组元素。
void printArray(int* arr, int size) {
    for(int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
}
  1. 使用指针和数组大小:将数组的指针和数组的大小作为函数的参数进行传递。
void printArray(int* arr, int size) {
    for(int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
}
  1. 使用引用:通过将数组作为引用传递给函数,可以直接在函数中操作原始数组。
void printArray(int (&arr)[5]) {
    for(int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
}
  1. 使用模板:使用模板来根据数组的类型和大小生成函数。
template <typename T, int size>
void printArray(T (&arr)[size]) {
    for(int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
}

以上是一些常见的将数组作为函数参数的方式。需要注意的是,C++中传递的数组不会进行任何副本操作,即传递的实际上是指向数组的指针或引用。因此,在函数内对数组的修改会影响到原始数组。

#include <iostream>
int main() {
    std::cout << "数组和指针的关系 !" << std::endl;
    return 0;
}

关注我,不迷路,共学习,同进步

关注我,不迷路,同学习,同进步

相关文章
|
1天前
|
算法 数据处理 C++
|
23小时前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
1天前
|
算法 C++ 容器
|
1天前
|
存储 调度 C++
|
1天前
|
存储 安全 C++
|
1天前
|
C++ 索引 容器
|
1天前
|
存储 算法 数据处理