数组
- 一维数组
- 二维数组
数组的特点:
- 放在一块连续的内存空间中
- 数组中的每个元素都具有相同的数据类型
一维数组
一维数组的定义及初始化:
int arr[3] = {1, 2, 3}; // 定义了一个数组arr,包含1、2、3三个元素int arr[3]; // 定义了一个数组arr,还未初始化;若数组未进行初始化,则一定要给定数组长度
arr[0] = 1; // 给数组的第一个元素赋值(初始化)
arr[1] = 2; // 给数组的第二个元素赋值
arr[2] = 3; // 给数组的第三个元素赋值int arr[] = {1, 2, 3}; // 定义了一个数组arr,包含1、2、3三个元素,编译器会自动计算数组元素个数;即若数组进行了初始化,可以不给定数组长度int arr[3] = {1}; // 定义了一个数组arr,第一个元素为1,其他元素默认为0int arr[3] = {}; // 定义了一个数组arr,所有元素默认为0int arr[3] = {1.89, 2, 3}; // 定义了一个数组arr,包含1、2、3三个元素;1.89会变成1;最新的一些版本支持此操作int arr[3] {1, 2, 3}; // 定义了一个数组arr,包含1、2、3三个元素;最新的一些版本可以这么使用arr[3] = {1, 2, 3}; // 错误,没有定义数组类型array = arr; // 错误,静态数组不能赋值给另一个变量
在通常情况下,C++将数组名解释为数组第一个元素的地址:
#include <iostream>
using namespace std;int main(){int arr[3] = {1, 2, 3};cout << arr[0] << endl;cout << arr[1] << endl;cout << arr[2] << endl;cout << arr << endl;system("pause");return 0;
}
---------
1
2
3
00000084716FF7F8
一维数组名的作用:
- 可以通过数组名统计整个数组占用的内存空间大小
- 可以通过数组名查看数组的首地址
#include <iostream>
using namespace std;int main(){int arr[5] = {1, 2, 3, 4, 5};cout << "整个数组占用的内存空间大小为:" << sizeof(arr) << endl; // 20cout << "单个元素占用的内存空间大小为:" << sizeof(arr[0]) << endl; // 4cout << "数组的元素个数为:" << sizeof(arr) / sizeof(arr[0]) << endl; // 5cout << "数组的首地址为:" << int(arr) << endl; // 地址一般用十六进制数表示,可以使用int()将其转为十进制数cout << "数组中第一个元素的地址为:" << int(&arr[0]) << endl; // 可以使用取地址符&来获取数据的地址cout << "数组中第二个元素的地址为:" << int(&arr[1]) << endl;cout << "数组中第三个元素的地址为:" << int(&arr[2]) << endl;system("pause");return 0;
}
---------
整个数组占用的内存空间大小为:20
单个元素占用的内存空间大小为:4
数组的元素个数为:5
数组的首地址为:419231544
数组中第一个元素的地址为:419231544
数组中第二个元素的地址为:419231548
数组中第三个元素的地址为:419231552
C++中,有两种强制转换类型的格式:
- (type)value – 这种格式继承自C语言
- type(value) – 这种是纯粹的C++格式,目的是让强制类型转换看起来像是函数调用一样,便于用户使用
数组名是常量,不能用来赋值。
一维数组案例,获取一维数组中的最大值:
#include <iostream>
using namespace std;int main() {int arr[] = { 200, 350, 300, 400, 100 };int max = 0;for (int i = 0; i < 5; i++) {if (arr[i] > max) {max = arr[i];}}cout << "最大值为:" << max << endl;system("pause");return 0;
}
---------
最大值为:400
一维数组案例,数组元素逆置:
#include <iostream>
using namespace std;int main() {int arr[] = { 1, 3, 2, 5, 4 };int start = 0;int end = sizeof(arr) / sizeof(arr[0]) - 1;int temp;while (start < end) {temp = arr[start];arr[start] = arr[end];arr[end] = temp;start++;end--;}for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {cout << arr[i] << " ";}system("pause");return 0;
}
---------
4 5 2 3 1
一维数组案例,冒泡排序:
/*
冒泡排序是最常用的排序算法,对数组内元素进行排序,主要步骤如下:
1. 比较相邻的元素,如果第一个元素比第二个元素大,就交换它们
2. 对每一对相邻元素做同样的比较工作,一轮执行完毕后,最后一个就是最大值
3. 删掉最后的最大值,重复以上步骤,每次比较次数-1,直到不需要比较
*/#include <iostream>
using namespace std;int main() {int arr[] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };for (int i = 0; i < sizeof(arr) / sizeof(arr[0]) - 1; i++) {for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - 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 < sizeof(arr) / sizeof(arr[0]); i++) {cout << arr[i] << " ";}system("pause");return 0;
}
---------
0 1 2 3 4 5 7 8 9
二维数组
二维数组的定义和使用:
/*
数据类型 数组名[行数][列数] = {{ele1, ele2}, {ele3, ele4}}; // 最直观,可读性最好
数据类型 数组名[行数][列数] = {ele1, ele2, ele3, ele4};
数据类型 数组名[行数][] = {{ele1, ele2}, {ele3, ele4}};
数据类型 数组名[][列数] = {{ele1, ele2}, {ele3, ele4}};
*/#include <iostream>
using namespace std;int main(){int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};cout << arr[0][0] << endl;cout << arr[0][1] << endl;cout << arr[0][2] << endl;cout << arr[1][0] << endl;cout << arr[1][1] << endl;cout << arr[1][2] << endl;system("pause");return 0;
}
---------
1
2
3
4
5
6
二维数组名的作用:
- 查看二维数组所占的内存空间大小
- 获取二维数组的首地址
#include <iostream>
using namespace std;int main(){int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};cout << "整个二维数组占用的内存空间大小为:" << sizeof(arr) << endl; // 24cout << "二维数组中一行占用的内存空间大小为:" << sizeof(arr[0]) << endl; // 12cout << "二维数组中单个元素占用的内存空间大小为:" << sizeof(arr[0][0]) << endl; // 4cout << "二维数组的行数为:" << sizeof(arr) / sizeof(arr[0]) << endl; // 2cout << "二维数组的列数为:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl; // 3cout << "二维数组的元素个数为:" << sizeof(arr) / sizeof(arr[0][0]) << endl; // 6cout << "二维数组的首地址为:" << int(arr) << endl; // 获取数组的首地址cout << "二维数组中第一行的首地址为:" << int(arr[0]) << endl; // 获取一行的首地址cout << "二维数组中第一个元素的地址为:" << int(&arr[0][0]) << endl; // 使用取地址符&来获取数据的地址system("pause");return 0;
}
---------
整个二维数组占用的内存空间大小为:24
二维数组中一行占用的内存空间大小为:12
二维数组中单个元素占用的内存空间大小为:4
二维数组的行数为:2
二维数组的列数为:3
数组的元素个数为:6
二维数组的首地址为:1483732280
二维数组中第一行的首地址为:1483732280
二维数组中第一个元素的地址为:1483732280
二维数组的案例,输出各位同学的总成绩:
/*语文 数学 英语
张三 100 100 100
李四 90 50 100
王五 60 70 80
*/#include <iostream>int main(){int arr[3][3] = {{100, 100, 100},{90, 50, 100},{60, 70, 80}};int count = 0;for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){int total_score = 0;for(int j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]); j++){total_score += arr[i][j];}count++;if(count == 1){std::cout << "张三的总成绩为:" << total_score << std::endl;}if(count == 2){std::cout << "李四的总成绩为:" << total_score << std::endl;}if(count == 3){std::cout << "王五的总成绩为:" << total_score << std::endl;}}system("pause");return 0;
}
---------
张三的总成绩为:300
李四的总成绩为:240
王五的总成绩为:210
C风格字符串:
char cat[9] = {'m', 'i', 'n', ' ', 'a', 'p', 'p', 'l', 'e'}; // 这不是一个字符串
char cats[10] = {'m', 'i', 'n',' ', 'a', 'p', 'p', 'l', 'e', '\0'}; // 这是一个字符串
C风格字符串具有一种特殊的性质,以空字符结尾,即\0,其ASCII码为0,用来标记字符串的结尾。
为了简化以上数组初始化为字符串,可以用以下方法,用引号括起的字符串隐式地包括结尾的空字符:
char cats[10] = "min apple"; // \0被默认添加
char fish[] = "Bubbles"; // 编译器自动计数