6.1概述

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

特点1:数组中每个元素都是相同的数据类型
特点2:数组是由连续的内存位置组成的


6.2一维数组

6.2.1 一维数组的定义方式

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

可以利用循环 输入输出数组中的数据

  1. 数据类型 数组名 [数组长度] = {值1,值2 ,,,}; ``如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据

微信截图_20210108215030.png
这个时候可以利用这种方法来创造(一定范围内的)数组长度未定的数组

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

![image.png](https://cdn.nlark.com/yuque/0/2020/png/2936491/1606629779573-8ee10d0f-e4ac-47d0-b580-b8068ca1caef.png#align=left&display=inline&height=271&margin=%5Bobject%20Object%5D&name=image.png&originHeight=542&originWidth=893&size=229777&status=done&style=none&width=446.5)
下标 从0开始
可以利用循环 输入输出数组中的数据

6.2.2 一维数组名称的用途

1.
(1)可以统计整个数组在内存中的长度 sizeof(数组名)
(2)可以统计数组中单个数据在内存中的长度 sizeof(数组名[下标])
(3)用数组的长度/单个数据的长度 可以得到数据的个数

2.
可以获取数组在内存中的首地址
可以直接输出数组的名称来得到首地址 `` cout<<数组名<<endl;
首地址一般是一个十六进制数

cout << ``(int)``数组名 << endl; `` 强制将地址转化为10进制

要查看数组中元素的地址
cout << (int)``&``arr[下标] << endl; `` (int)可不写

数组名是一个常量 不可修改

数组首地址是数组首元素的地址

案例1

image.png
image.png
image.png
image.png

案例2

image.png
image.png
image.png
image.png
image.png
image.png

6.2.3冒泡排序

作用:最常用的排序算法,对数组内元素进行排序
1. 比较相邻的元素,如果第一个比第二个大,就交换他们两个
2.对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值
3.重复上述步骤,每次比较次数减一,直到不需要比较

image.png
排序总轮数 = 元素个数 - 1 ;
每轮对比次数 = 元素个数 - 排序轮数 - 1 ;

image.png
image.png
image.png


6.3 二维数组

在一维数组上,多加了一个维度

6.3.1 二维数组的定义方式

  1. 数据类型 数组名[行数][列数];
    2. 数据类型 数组名[行数][列数] = { { 数据1,数据2 } , { 数据3 ,数据4 } }; 更加直观,可读性更强
    3. 数据类型 数组名[行数][列数] = { 数据1,数据2, 数据3,数据4 };
    4. 数据类型 数组名[ ][列数] = { 数据1,数据2, 数据3,数据4 };

在定义二维数组时,如果初始化了数据,可以省略行数

第一种定义方式
image.png image.png
image.png

第二种定义方式
image.png
image.png

第三种定义方式
image.png

第四种定义方式
image.png

6.3.2 二维数组数组名

  1. 查看二维数组所占内存空间

cout << sizeof(数组名) << endl;

  1. 查看二维数组 **第一行** 所占内存空间<br />`cout << sizeof(数组名`**`[0]`**`) << endl;`
  2. 查看二维数组** 第一个元素** 所占内存空间<br />`cout << sizeof(数组名`**`[0][0]`**`) << endl;`<br />**<br /> 查看二维数组**行数**<br />`cout << sizeof(数组名)/sizeof(数组名[0]) <<endl;`
  3. 查看二维数组**列数**<br /> `cout << sizeof(数组名[0])/sizeof(数组名[0][0]) <<endl;`<br />**<br />2.获取**二维数组首地址**<br />`cout << 数组名 <<endl;`

还可以转成十进制
cout <<(int)数组名 <<endl;

查看二维数组
第一行首地址
cout <<
(int)数组名[0]<<endl;

查看二维数组 第一个元素首地址
cout << (int)&数组名[0][0]<< endl;
**

案例

image.png
image.png
image.png
记得添加头文件 #include
image.png

数组与函数的关系

  • 数组元素只能作函数的实参
  • 整个数组作函数参数,数组可以作形参,形参和实参 类型要一样,二维数组的话,列要一致 实参数组就写数组名

如何创建未知元素个数的数组—动态内存分配

c语言

int arraysize;//元素个数
printf("请输入数组的大小:");
scanf("%d",&arraysize);
int *array;//用指针指向一个数组
array=(int *)malloc(arraysize *sizeof(int));//动态内存分配
....
free(array);//最后要释放这个空间,用完了,当然要还给系统
malloc()函数在内存堆区中寻找未被使用的内存,找够所需的字节数后返回该内存的起始地址。
所需字节数通过参数知道,在本例中arraysize元素个数,乘以每一个元素的字节数,等于总的字节数;
每一个元素的字节数通过测字节sizeof()运算符得到,元素的数据类型为int,所以测int类型需要多少字节。
malloc()函数并不知道用这些内存干什么,所以返回一个没有类型的指针,但对于整型指针array来说,malloc()函数得返回值必须显式转换成整型指针才能被接受。所以前面加了一个(int *)。

c++

在c++中就可以不用malloc()函数和free()函数了。
int arraysize;//元素个数
cout<<"请输入数组的大小:";
cin>>arraysize;
`<br />int *array;//用指针指向一个数组<br />array=new int[arraysize]; //动态内存分配<br />….<br />delete []array;//最后要释放这个空间,是一组空间所以加了[]。`

array=new int[arraysize];
new表示申请空间;什么类型?int;多大?arraysize
返回该内存的起始地址存到array指针中