9. 数组
9.1 概述
数组是存储同一种数据类型多个元素的集合
数组的特点:
- 数组中每个数据元素都是相同的数据类型
- 数组是由连续的内存位置组成的
9.2 一维数组
9.2.1 一维数组 定义方式
- 数据类型 数组名[数组长度];
- 数据类型 数组名[数组长度]={值1,值2,…};
- 数据类型 数组名[ ]={值1,值2,…};
//1.数据类型 数组名[数组长度];
int arr[20];
//利用下标赋值
arr[0]=100;
//利用下标输出
cout<<arr[0]<<endl;
//2.数据类型 数组名[数组长度]={值1,值2,...}; 如果{}内不足5个数据,剩余用0补全
int arr[5]={1,2,3,4,5};
//3.数据类型 数组名[ ]={值1,值2,...};
int arr[]={1,2,3,4,5};
– 数组名的命名规范与变量名命名规范一致
– 数组中的下标是从0开始索引
arrayName[index];
arrayName[0];
arrayName[length-1];
– index是数组的索引(下标),从0开始
int arr[5]={10,21,35,80};
int arr[5]{10,21,35,80};//C++ 11新增
– 只有在定义数组时才能使用初始化,此后就不能使用了,也不能将一个数组赋值给另一个数组
– 初始化数组时,提供的值可以少于数组的元素数目。如果对数组的一部分进行初始化,则编译器将其他元素设置为0;
– 如果初始化数组时 [] 内为空,c++编译器将计算元素个数;
– 列表初始化禁止缩窄转换;
9.2.2 一维数组 数组名
一维数组名的用途:
- 可以统计整个数组在内存中的长度
sizeof(arr)
- 可以获取数组在内存中的首地址
(int)arr
- 数组中第一个元素地址为:
(int)&arr[0]
9.2.3 遍历数组
//获取数组长度
int arr[4]={1,2,3,4};
int len=sizeof(arr)/sizeof(int);
//for循环
for(int i=0;i<len;i++){
cout<<arr[i]<<endl;
}
//基于范围的for循环(c++ 11)
for(int i:arr){
cout << i<< endl;
}
9.2.4 获取数组最值
获取数组中的最大值或最小值
int main(){
int arr[5]={20,5,80,101,99};
int max=arr[0];
for(int i=1;i<sizeof(arr)/sizeof(int);i++){
if(arr[i]>max){
max=arr[i];
}
}
cout<<max<<endl;
return 0;
}
9.2.5 C++数组元素反转
将数组中的元素进行反转存储
eg:将[18,5,24,55,76],反转后[76,55,24,5,18]
int main(){
int arr[5]={18,5,24,55,76};
int len=sizeof(arr)/sizeof(int);
int i=0;
int j=len-1;
-----------------------
while(i<j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
------------------------
//或者for循环
for(int i=0,j=len-1;i<j;i++,j--){
}
return 0;
}
9.2.6 C++数组元素查找
查找指定元素第一次在数组中出现的索引[18,5,24,55,76]
int main(){
int arr[5] = { 18,5,24,55,76 };
int len = sizeof(arr) / sizeof(int);
int x = 10;
int index = -1;
for (int i = 0; i < len; i++) {
if (arr[i] == x) {
index = i;
break;
}
else {
continue;
}
}
if (index == -1) {
cout << "没找到" << endl;
}
else {
cout << index << endl;
}
return 0;
}
9.2.7 冒泡排序
#include<iostream>
using namespace std;
int main() {
int arr[9] = { 4,2,8,0,5,7,1,3,9 };
int len = sizeof(arr)/sizeof(int);
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
cout << "[";
for (int i = 0; i < len-1; i++) {
cout << arr[i] << ",";
}
cout <<arr[8] << "]" << endl;
return 0;
}
9.2.8 二分查找
int main() {
int arr[10] = { 10,20,30,40,50,60,70,80,90,100 };
int index = -1;
int low = 0;
int high = sizeof(arr) / sizeof(arr[0]);
int key = 40;
while (low < high) {
int mid = (low + high) / 2;
if (arr[mid] < key) {
low = mid + 1;
}
else if (arr[mid] > key) {
high = mid - 1;
}
else {
index = mid;
break;
}
}
if (index == -1) {
cout << "没找到" << endl;
}
else {
cout << index << endl;
}
return 0;
}
9.3 二维数组
9.3.1 声明二维数组
- 数据类型 数组名[行][列];
- 数据类型 数组名[行][列]={{数据1,数据2},{数据3,数据4}};
- 数据类型 数组名[行][列]={数据1,数据2,数据3,数据4};
- 数据类型 数组名[ ][列]={数据1,数据2,数据3,数据4};
第二种方式更加直观,提高代码的可读性
数据类型 数组名[m][n]
m 表示二维数组有多少个一维数组,n表示每一个一维数组的元素个数
int scores[3][4]={
{98,100,62,70},
{99,97,100,70},
{67,89,52,88},
};
9.3.2 二维数组数组名
查看二维数组所占内存空间: sizeof(arr)
查看二维数组行数: sizeof(arr)/sizeof(arr[0])
------------------列数:sizeof(arr[0])/sizeof(arr[0][0])
获取二维数组首地址:arr
#include<iostream>
using namespace std;
int main() {
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;
return 0;
}
案例:考试成绩统计
有三名同学(张三,李四,王五),在一次考试中的成绩分别如下:请分别输出三名同学的总成绩
#include<iostream>
using namespace std;
int main() {
int arr[3][3] = { {100,100,100},{90,50,100},{60,70,80} };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
int score = 0;
for (int j = 0; j < sizeof(arr[i]) / sizeof(arr[i][0]); j++) {
score += arr[i][j];
}
cout << score << endl;
}
return 0;
}