1. 概述
- 所谓的数组,就是一个里面存放了相通类型的元素的集合
数组时由连续的内存位置组成的
2. 一维数组
2.1 一维数组的定义
-
有三种方式
-
1.数据类型 数组名[数组长度];如: int a[10]; a[0] = 1; a[1] = 2; ...
-
2.数据类型 数组名[数组长度]={值1,值2,...};如://未定义的值默认为0 int a[10] = {1,2,3,}; 也可以循环输入: for (i = 0; i < 10; i++) { cin << a[i]; }
-
3.数据类型 数组名[] = {值1,值2,...};如://该数组长度取决于给予的值个数 int a[] = {1,2,3};//该数组长度为3
-
-
数组中下表时从0开始的,如:
-
int a[3] = {1,2,3}; /*其中: a[0] = 1; a[1] = 2; a[2] = 3; */
-
2.2 一维数组的输出
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//可以逐个单独输出:
cout << a[0] << endl;
cout << a[1] << endl;
......
//也可以循环输出
for (i = 0; i < 10; i++)
{
cout << a[i] << endl;
}
2.3 一维数组的数组名
-
数组名的命名规范与变量名命名规范一致,不要和变量重名
-
数组名的用途:
int main() { //1.获取整个数组占用内存空间大小 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;//结果为40 cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;//结果为4 cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;//结果为10 //2、可以通过数组名获取到数组首地址 cout << "数组首地址为: " << arr << endl;//结果为0x70fde0 cout << "数组中第一个元素地址为: " << &arr[0] << endl;//结果也为0x70fde0,说明一位数组的首地址和第一个元素的地址相同 cout << "数组中第二个元素地址为: " << &arr[1] << endl;//结果为0x70fde4,说明两个元素之间确实相差空间4 system("pause"); return 0; }
数组名是常量,不可以赋值
3. 冒泡排序
-
最常用的排序算法,对数组内元素进行排序
-
每次比较相邻,若第一个比第二个大,就交换,到最后一个后,又从第一个开始,如:
-
比较排序a[5] = {5,4,3,2,1};
-
轮数 a[0] a[1] a[2] a[3] a[4] 比较次数 1 5 4 3 2 1 0 1 4 5 3 2 1 1 1 4 3 5 2 1 2 1 4 3 2 5 1 3 1 4 3 2 1 5 4 2 3 4 2 1 5 1 2 3 2 4 1 5 2 2 3 2 1 4 5 3 3 2 3 1 4 5 1 3 2 1 3 4 5 2 4 1 2 3 4 5 1 由规律我们可以发现总共需要4轮(即数组长度减1),每轮比较的次数为数组长度减该轮数
-
代码如下:
int main() { int arr[5] = {5,4,3,2,1}; for (int i = 0; i < 5 - 1; i++)//因为数组是从0开始的 { for (int j = 0; j < 5 - 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 < 5; i++) { cout << arr[i] << endl; } system("pause"); return 0; }
-
4.二维数组
- 即在一位的基础上多了一个维度
4.1 二维数组的定义
-
有四种方式:
-
1.数组类型 数组名[行数][列数];如: int a[2][3]; a[0][0] = 1; a[0][1] = 2; ... 也可以循环输入: for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cin << arr[i][j] << " "; } }
-
2. 数据类型 数组名[行数][列数] = {{数据1,数据2},{数据3,数据4}};如: int arr2[2][3] = { {1,2,3}, {4,5,6} };
-
3.数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4 };如: int arr3[2][3] = { 1,2,3,4,5,6 };
-
4.数据类型 数组名[][列数] = { 数据1,数据2 ,数据3,数据4 };如: int arr4[][3] = { 1,2,3,4,5,6 };//实际这里的空格为2,如果初始化了数据,可以省略行数
四种相比较,第二种更直观,提高代码的可读性
-
5.2 二维数组的输出
同一维数组同理:
int a[10] = {1,2,3,4,5,6};
//可以逐个单独输出:
cout << a[0][0] << endl;
cout << a[0][1] << endl;
......
//也可以循环输出
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
5.3 二维数组的数组名
-
用途:
int main() { int arr[2][3] = { {1,2,3}, {4,5,6} }; //1.查看二维数组所占内存空间 cout << "二维数组大小: " << sizeof(arr) << endl;//结果为24 cout << "二维数组一行大小: " << sizeof(arr[0]) << endl;//结果为12 cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl;//结果为4 cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;//结果为2 cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;//结果为3 //2.获取二维数组首地址 cout << "二维数组首地址:" << arr << endl;//0x70fdf0 cout << "二维数组第一行地址:" << arr[0] << endl;//0x70fdf0 cout << "二维数组第二行地址:" << arr[1] << endl;//0x70fdfc cout << "二维数组第一个元素地址:" << &arr[0][0] << endl;//0x70fdf0 cout << "二维数组第二个元素地址:" << &arr[0][1] << endl; //0x70fdf4 //说明二维数组首地址、第一行地址和第一个地址相同 system("pause"); return 0; }