文章目录
数组
一, 数组
C++数组是一种复合式的数据类型,用于存储连续的相同类型的数据。数组可以使用所有的 C++数据类型,如 int、 float、 double、 char、 struct等,包括类对象在内。所有的数据都存储在连续的内存空间中,位置基本固定,这使得可以方便的使用索引形式快速的访问到元素。
特点:
- 数组中所有的数据元素的类型是一致的。
- 数组所占的内存地址空间是连续的。
可将数组看成是存放相同数据的集合。数组根据维度可划分为一维,二维,三维…。
二, 一维数组
2.1 一维定义方式与初始化
C++中一维的语法定义如下:(有三种一维数组的定义方式)。
// 1,
Date_Type ArrayName[length];
// 2.
Date_Type ArrayName[length] = {value1, value2, value3....}
// 3.
Date_Type ArrayName[] = {value1, value2, value3...};
无需把定义数组等等诸如此类的,作为教条类型的定义方法,定义数组只需catch三个要点:
- 指明类型 2. 编译器知道划分数组的长度 3. 命名符合规范
// 1. 定义
int arr[10];
// 初始化
for (int i = 0; i < size(arr); i++)
{
arr[i] = i;
}
//
// 2
int arr[4] = {1, 2, 3, 4};
// 3
int arr[] = {1, 2, 3, 4};
2.2 常见类型的数组
int arr[4]; // 定义了4个整型数据的数组
int arr[4] = {}; // 定义了4个整型数组,且初值赋值为0
int *arr[4]; //arr是含有4个整型指针的数组
int arr[] = {1,2,3}; //arr是含有3个整型的数组
int arr[5] = {1,2,3}; //等价于int arr[5] = {1,2,3,0,0}
string arr[3] = {"hello","world"}; //等价于 string arr[3] = {"hello","world",""};
char arr[6] = "hello"; //这里不能声明维度为5,因为字符串末尾还有一个空字符('\0'),所以应该是"hello\0"
char arr[6] = {'h','e','l','l','o','\0'}; //等价于 char arr[] = "hello";
char arr[6] = {'h','e','l','l','o'}; //这条语句和上面一条语句是一样的。默认字符初始化值是'\0'
如果在定义了整型类型的数组后,并没有对内存进行初始化的话,那么里面会存放以前的垃圾值。用字符串字面值初始化字符数组时,一定要注意字符串字面值的末尾还有一个空字符。
2.3 数组名的应用
通过数组名可以获取数组在内存中的地址。由于数组名可以获取数组在内存中的地址,这可以和指针结合起来,对数组进行操作。后续指针博文会介绍。
//数组名用途
//1、可以获取整个数组占用内存空间大小
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;
//2、可以通过数组名获取到数组首地址
cout << "数组首地址为: " << (int)arr << endl;
cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;
cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;
//arr = 100; 错误,数组名是常量,因此不可以赋值
注意: 数组名是常量,不可以赋值。 对数组名进行sizeof,可以获取整个数组占内存空间的大小
三,二维数组
3.1 二维数组定义方式与初始化
1. Date_Type ArrayName[ row ][ col ];
2. Date_Type ArrayName[ row ][ col ] = { {value1,value2 } ,{value3,value4 } };
3. Date_Type ArrayName[ row ][ col ] = { value1,value2,value3,value4};
4. Date_Type ArrayName[ ][ col ] = { value1,value2,value3,数value4};
二维数组就是在一维数组上,多加一个维度。
二维数组的定义方式:
1. Date_Type ArrayName[ row ][ col ];
2. Date_Type ArrayName[ row ][ col ] = { {value1,value2 } ,{value3,value4 } };
3. Date_Type ArrayName[ row ][ col ] = { value1,value2,value3,value4};
4. Date_Type ArrayName[ ][ col ] = { value1,value2,value3,value4};
第一种定义方式为例:
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
for (int i = 0; i < size(arr); i++)
{
for (int j = 0; j < size(arr[i]); j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
在定义二维数组的时候,也需要思考编译器是否能正确的计算出二维的行和列,如果不能,那就是你定义数组的时候,缺省了一部分。
类似于方式四,即使缺少了row,编译器可根据全部的元素计算出row,所以在定义二维数组时,如果初始化了数据,可以省略行数。
3.2二维数组名
由于二维数组可以理解为是一位数组的数组,所以二维数的数组名既可以代表是整个二维数组的首地址,也可以代表第一个元素的首地址,同时也可以代表是二维数组第一个行的地址。具体验证代码如下:
//二维数组数组名
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
cout << "二维数组大小: " << sizeof(arr) << endl;
cout << "二维数组一行大小: " << sizeof(arr[0]) << endl;
cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl;
cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;
cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
//地址
cout << "二维数组首地址:" << arr << endl;
cout << "二维数组第一行地址:" << arr[0] << endl;
cout << "二维数组第二行地址:" << arr[1] << endl;
cout << "二维数组第一个元素地址:" << &arr[0][0] << endl;
cout << "二维数组第二个元素地址:" << &arr[0][1] << endl;
四,案例
4.1 一维数组案例
【冒泡排序法】
步骤:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
3. 重复以上的步骤,每次比较次数-1,直到不需要比较
int arr[9] = { 3,1,6,23,5,23,5,8,89 };
for (int i = 0; i < 9 - 1; i++)
{
for (int j = 0; j < 9 - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < 9; i++)
{
cout << arr[i] << endl;
}
4.2 二维数组案例
案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
**
语文 | 数学 | 英语 | |
---|---|---|---|
张三 | 100 | 100 | 100 |
李四 | 90 | 50 | 100 |
王五 | 60 | 70 | 80 |
int scores[3][3] =
{
{100,100,100},
{90,50,100},
{60,70,80},
};
string names[3] = { "张三","李四","王五" };
for (int i = 0; i < 3; i++)
{
int sum = 0;
for (int j = 0; j < 3; j++)
{
sum += scores[i][j];
}
cout << names[i] << "同学总成绩为: " << sum << endl;
}