• 【C++】C++基础知识(五)---数组


    1. 一维数组

    数组就是一个集合,里面存放了相同类型的数据元素。

    特点:
    1、数组中每个元素的数据类型都是一样的;
    2、数组是由连续的内存位置组成的,最低的地址对应第一个元素,最高的位置对应最后一个元素;
    3、C++中数组元素的下标是从0开始索引的与Python一样。

    1.1 定义方式

    1. 数据类型 数组名[数组长度]

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	//1、数据类型 数组名[数组长度]
    	int arr1[5];
    	for (int i = 0; i < 5; i++) 
    	{
    		arr1[i] = i + 1;
    		cout << arr1[i] << " ";
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 输出结果
      在这里插入图片描述

    2. 数据类型 数组名[数组长度] = {值1,值2,…,值n}

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    	//2、数据类型 数组名[数组长度] = {值1、值2、...、值n} 告诉数组长度的定义方式可以不说明每一值,未说明的值将会用0代替。
    	int arr2[5] = {1, 2, 3};
    	for (int j = 0; j < 5; j++) 
    	{
    		cout << arr2[j] << " ";
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 输出结果
      在这里插入图片描述

    3. 数据类型 数组名[ ] = {值1,值2,…,值n}

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    	//3、数据类型 数组名[] = {值1、值2、...、值n} 未告诉数组长度的定义方式必须说明每一个值,不然就无法知道数组的长度
    	int arr3[] = { 5, 4, 3, 2, 1 };
    	for (int k = 0; k < 5; k++)
    	{
    		cout << arr3[k] << " ";
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 输出结果
      在这里插入图片描述

    1.2 数组名用途

    1. 统计整个数组在内存中的长度
    2. 获取数组在内存中的首地址

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	int arr1[10];
    	for (int i = 0; i < 10; i++)
    	{
    		arr1[i] = i + 1;
    		cout << arr1[i] << " ";
    	}
    	cout << endl;
    
    	//1、统计整个数组在内存中的长度
    	cout << "整个数组在内存中的长度为:" << sizeof(arr1) << endl;
    	cout << "每个元素在内存中的长度为:" << sizeof(arr1[0]) << endl;
    	cout << "统计数组中元素的个数为:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
    
    	//2、获取数组在内存中的首地址
    	cout << "数组在内存中的首地址为:" << (int)arr1 << endl;
    	cout << "数组中第1个元素的地址为:" << (int) &arr1[0] << endl;
    	cout << "数组中第2个元素的地址为:" << (int) &arr1[1] << endl;
    	cout << "数组中最后一个元素的地址为:" << (int) &arr1[9] << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 输出结果
      在这里插入图片描述

    注意:
    (int)arr1、(int)&arr1[0]
    采用了一个类型强制转换,本身地址应该是指针类型的数据(16进制的),但是在此将其强制转化为了整型数据(10进制),便于我们直观的理解。
    在使用类型强制转换时,将会出现警告

    1.3 案例分析

    1. 找5个数中的最大值

    • 案例描述

    一个一维数组int arr[ ] = {188, 290, 555, 493, 618};
    输出数组中最大的数

    • 思路分析

    访问数组中的每个元素,设定一个初始最大值,让数组中的每一个元素与当前最大值比较,如果大于当前最大值则更新最大值,否则继续往后比较,直到找到整个数组中的最大值

    • 代码实现
    #include 
    using namespace std;
    
    int main() {
    
    	int arr1[] = {188, 290, 555, 493, 618};
    	int max = 0;
    	for (int i = 0; i < 5; i++)
    	{
    		if (arr1[i] > max)
    		{
    			max = arr1[i];
    		}
    	}
    	cout << "五个数中最大的数为:" << max << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 输出结果
      在这里插入图片描述

    2. 数组元素逆置

    • 案例描述

    一个一维数组int arr[ ] = {3, 5, 2, 4, 1, 6};
    将数组中的元素进行逆置,再输出

    • 思路分析

    1、记录起始位置下标start;
    2、记录末尾位置下标end;
    3、起始位置与末尾位置进行互换temp = start;start = end;end = temp;
    4、更新起始与末尾位置元素,start++;end- -;
    5、进行循环更新,直到start >= end;

    • 代码实现
    #include 
    using namespace std;
    
    int main() {
    
    	int arr1[] = {3, 5, 2, 4, 1, 6}; //初始化数组
    	int lon = sizeof(arr1) / sizeof(arr1[0]); //得到数组的长度
    	//打印逆置前的数组
    	cout << "逆置前数组为:" << endl;
    	for (int i = 0; i < lon; i++)
    	{
    		cout << arr1[i] << " ";
    	}
    	cout << endl;
    
    	//对数组进行逆置
    	for (int start = 0; start < lon; start++)
    	{
    		int end = lon - start - 1;
    		if (end > start)
    		{
    			int temp = arr1[start];
    			arr1[start] = arr1[end];
    			arr1[end] = temp;
    		}
    	}
    
    	//打印逆置后的数组
    	cout << "逆置后数组为:" << endl;
    	for (int k = 0; k < lon; k++)
    	{
    		cout << arr1[k] << " ";
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 输出结果
      在这里插入图片描述

    3. 冒泡排序
    最常用的排序算法,对数组内元素进行排序

    • 案例描述

    一个一维数组int arr[ ] = {4, 2, 8, 0, 5, 7, 1, 3, 9, 6};
    将数组中的元素进行从小到大的顺序依次排序

    • 思路分析

    1、比较两个相邻元素,若第一个大于第二个,则交换它们两个的位置;
    2、对每一对相邻元素做相同的工作,执行完毕后,找到第一个最大值;
    3、重复以上的步骤,每次比较次数减1,直到不需要再进行比较;
    在这里插入图片描述

    • 代码实现
    #include 
    using namespace std;
    
    int main() {
    
    	int arr1[] = {4, 2, 8, 0, 5, 7, 1, 3, 9, 6}; //初始化数组
    	int lon = sizeof(arr1) / sizeof(arr1[0]) - 1; //得到数组末尾元素的下标
    	//打印排序前的数组
    	cout << "冒泡排序前数组为:" << endl;
    	for (int i = 0; i <= lon; i++)
    	{
    		cout << arr1[i] << " ";
    	}
    	cout << endl;
    
    	//对数组进行冒泡排序
    	for (int m = 0; m <= lon - 1; m++) //比较轮数 = 数组长度-1
    	{
    		for (int n = 0; n <= lon - m - 1; n++) //每一轮比较次数 = 数组长度-当前比较轮数-1
    		{
    			if (arr1[n] > arr1[n + 1]) //第一个元素大于第二个元素则进行位置交换
    			{
    				int temp = arr1[n];
    				arr1[n] = arr1[n + 1];
    				arr1[n + 1] = temp;
    			}
    		}
    	}
    
    	//打印冒泡排序后的数组
    	cout << "冒泡排序后数组为:" << endl;
    	for (int j = 0; j <= lon; j++)
    	{
    		cout << arr1[j] << " ";
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 输出结果
      在这里插入图片描述

    2. 二维数组

    2.1 定义方式

    1. 数据类型 数组名[行数][列数]

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	//1、数据类型 数组名[行数][列数];
    	int arr1[2][3];
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 3; j++)
    		{
    			arr1[i][j] = j + 1;
    			cout << arr1[i][j] << " ";
    		}
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 输出结果
      在这里插入图片描述

    2. 数据类型 数组名[行数][列数] = {{数据1,数据2,…,数据n},{数据1,数据2,…,数据n},…,{数据1,数据2,…,数据n}}

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	//2、数据类型 数组名[行数][列数] = {{数据1,数据2,...,数据n},{数据1,数据2,...,数据n},...,{数据1,数据2,...,数据n}};
    	int arr2[2][3] =
    	{
    		{1,2,3},
    		{4,5,6}
    	};
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 3; j++)
    		{
    			cout << arr2[i][j] << " ";
    		}
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 输出结果
      在这里插入图片描述

    3. 数据类型 数组名[行数][列数] = {数据1,数据2,…,数据n}

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	//3、数据类型 数组名[行数][列数] = {数据1,数据2,...,数据n};
    	int arr3[2][3] = { 5,5,5,5,5,5 };
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 3; j++)
    		{
    			cout << arr3[i][j] << " ";
    		}
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 输出结果
      在这里插入图片描述

    4. 数据类型 数组名[ ][列数] = {数据1,数据2,…,数据n}

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	//4、数据类型 数组名[][列数] = { 数据1,数据2,...,数据n };
    	int arr4[][3] = {6,6,6,6,6,6};
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 3; j++)
    		{
    			cout << arr4[i][j] << " ";
    		}
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 输出结果
      在这里插入图片描述

    2.2 数组名用途

    1. 统计整个数组在内存中的长度
    2. 获取数组在内存中的首地址

    • 代码演示
    #include 
    using namespace std;
    
    int main() {
    
    	int arr1[2][4] = 
    	{
    		{2,0,2,2},
    		{1,9,9,8}
    	};
    	for (int i = 0; i < 2; i++)
    	{
    		for (int j = 0; j < 4; j++)
    		{
    			cout << arr1[i][j] << " ";
    		}
    		cout << endl;
    	}
    	
    
    	//1、统计整个数组在内存中的长度
    	cout << "整个二维数组在内存中的长度为:" << sizeof(arr1) << endl;
    	cout << "二维数组某一行在内存中的长度为:" << sizeof(arr1[0]) << endl;
    	cout << "二维数组每一个元素在内存中的长度为:" << sizeof(arr1[0][0]) << endl;
    	cout << "统计二维数组中行的数目为:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
    	cout << "统计二维数组中列的数目为:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;
    	cout << "统计二维数组中元素的数目为:" << sizeof(arr1) / sizeof(arr1[0][0]) << endl;
    
    	//2、获取数组在内存中的首地址
    	cout << "数组在内存中的首地址为:" << arr1 << endl;
    	cout << "数组中第1行元素的地址为:" << arr1[0] << endl;
    	cout << "数组中第2行元素的地址为:" << arr1[1] << endl;
    	cout << "数组中第1个元素的地址为:" << &arr1[0][0] << endl;
    	cout << "数组中第2个元素的地址为:" << &arr1[0][1] << endl;
    	cout << "数组中最后一个元素的地址为:" << &arr1[1][3] << endl;
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 输出结果
      在这里插入图片描述

    注意:为了方便更好的查看内存地址,只需要进行一个类型强制转换,将其从16进制转化为10进制数,如操作:(int)arr1、(int)&arr1[0][0]、(int)arr1[0]

    2.3 案例分析

    • 案例描述

    某班级三位学生甲乙丙,他们的语数外分数分别为:[100,100,100],[98,88,92],[77,98,87]
    求甲乙丙三者的总分,并在屏幕上输出

    • 代码实现
    #include 
    using namespace std;
    #include 
    
    int main() {
    
    	int arr1[3][3] =
    	{
    		{100,100,100},
    		{98,88,92},
    		{77,98,87}
    	};
    	string arr2[3] = { "甲", "乙", "丙" };
    	for (int i = 0; i < 3; i++)
    	{
    		int scores_sum = 0;
    		for (int j = 0; j < 3; j++)
    		{
    			scores_sum += arr1[i][j];
    		}
    		cout << arr2[i] << "的语数外总分为: " << scores_sum << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 输出结果
      在这里插入图片描述

    3. 多维数组

    在二维数组的基础上进行推广

  • 相关阅读:
    elasticsearch安装 及 启动异常解决
    Netbeans介绍
    146. LRU 缓存
    B_QuRT_User_Guide(27)
    前端基础建设与架构04 横向对比主流构建工具,了解构建工具的设计考量
    存在重复元素(简单)
    编程大杂烩(四)
    【SpringMVC】JSR 303与拦截器注解使用
    1.1.3 基于centos的lamp
    第542题 01矩阵+第994题 腐烂的橘子
  • 原文地址:https://blog.csdn.net/qq_43723025/article/details/127866435