一:一维数组
(1).数组的创建
定义:数组是一组相同类型元素的集合
******创建方式:(重要)
(注意:数组名是数组首元素的地址)
如:
int arr[8];//表示数组内的元素为整形,arr表示数组名,放了8个元素
float arr3[2+3];//2+3是一个常量表达式
double arr4[5] = 10;//浮点数在内存中无法精确保存
int arr5[n];//这种 将变量放在[]中 在C99语法中才是支持的。VS2019是不支持变长数组(数组的大小是变量),平时别这样做
(2)数组的初始化(在创建数组的基础上给数组一些合理的初始值)
A:整形数组
1.完全初始化:int arr[10] = {1,2,3,4,5,6,7,8,9,10};//像这种给予初始值个数与数组大小相同
2. 不完全初始化:int arr[10] = {1,2,3,4};//像这种只对部分元素赋值,剩下的默认为0
3.int arr[] = { 1,2,3,4 };//像这种没有指定大小的,会根据初始化的内容来确定它的个数相当于int arr[4] = { 1,2,3,4 };
B:字符数组:
a: 1. char ch1[3] = {'b','i','t'}
2. char ch2[5] = {'b','i','t'}
3. char ch3[] = {'b','i','t'};默认3个字符
b:字符串形式(字符串中自带一个 )
char ch1[5] = "bit";//b i t 0 5个元素
char ch2[] = "bit";//b i t 4个元素
注意:数组长度与字符串长度是两个东西
当用strlen求长度时ch1为3,ch2也为3
(3).一维数组的使用
数组的使用中会用到下标引用操作符 [] 。它其实就是数组访问的操作符。
注意: 数组是使用下表来访问的
数组的下表都是从0开始的
进行数组的访问时[]内可以是变量,数组创建时必须为常量
数组的大小可以通过计算得到
举例: arr[4] = 5;//将数组中下表为4的数赋值为5
(4).一维数组在内存中的存储
接下来我们来探讨数组在内存中的存储
可以得出一字节给一个地址,而一个整形占4个字节
所以:一维数组在内存中是连续存放的
随着数组下标的增长,地址是由低到高变化的
二、二维数组
1.二维数组的创建(数组创建中前面的[]表示行,后面的[]表示列)
int arr[3][4];//整形 三行四列
char arr[3][4];//字符 三行四列
2.二维数组的初始化()
完全初始化:
不完全初始化:int arr1[3][4] = {1,2,3,4,5};//5后面补0
注意这种形式: int arr2[3][4] = {{1,2},{3,4},{5,6}};
注:数组如果有初始化,行可以省略,列不能省略
int arr[][4] = {{1,2},{3,4},{5,6}};//几行可以通过初始化来确定,嵌套的{}有几个代表有几行
3.二维数组的使用
进行数组的访问时与一维数组相似,行间从0开始,列间也是从0开始
4.二维数组在内存中的存储
与一维数组一样,先进行地址的打印,得出每一个元素的地址
在图中可以看出前4个地址是以4逐渐递增的,而第四个与第五个之间也是相差4.
由此得出:二维数组在内存中也是连续存储的
一行内部连续,跨行也是连续的
三.数组作为函数参数
首先我们举个实例:将一组降序数弄成升序数 如:9,8,7,6,5,4,3,2,1,0
当一个数组传参的时候,传递过去的形参部分的数组在函数内部是无法计算它的元素个数的,所以我们一般放在主函数中计算。
注意:数组名是什么?
数组名是数组首元素的地址
但是有两个例外:
1.sizeof(数组名)
这个时候的数组名表示整个数组 , 计算的是整个数组的大小 , 单位是字节
2.&数组名
这里的数组名表示整个数组 , 取出的是整个数组的地址
在图中,我们可以看到3中不同方式下地址却是一样的
首先后两种是取的是首元素的地址是没问题的,但是由上头的特例知道第一个应该是(整个)数组的地址,这是为什么呢?
其实数组的地址就是首元素的地址,虽然值相同,但是意义不一样
&arr取得是整体的地址,只是打印时显示首元素的地址