第五章数组

一  数组的概念

1.概念:数组是由一组相同类型的元素的集合(数组内的元素的类型必须相同,数组的元素可以为多个或者一个,但不能为0个)

二  一维数组的创建和初始化

1.创建:类型(元素的类型)数组名 [常量/常量表达式]

2.元素:存放数组中的数 

3.初始化:初始化会定义其类型和大小

(1)完全初始化:一一对应赋值

(2)不完全初始化:有给值的给对应值,没有给值的默认初始化为0

注:

(1)如果有进行初始化的话可以不写数组的大小,其会根据你所赋的值来决定其大小

(2)初始化值的个数不能超过其大小

4.数组的类型:元素类型+[大小]

例如:int [5]

三  一维数组的使用

1。使用[]下标引用操作符进行访问 (第n个元素对应下标为n-1)

例如:arr[5]=9;

此时arr和5是操作数,[]是下标引用操作符

四  一维数组的存储

1.一维数组在内存中是连续存放的、

2.随着下标的增大,内存地址由低地址到高地址

3.补充:使用vs2022时

x64:64位程序,打印地址长

x86:32位程序,打印地址短

五  sizeof计算元素大小

1.原理:利用sizeof(数组名)得到的是数组所有元素所占字节的大小总和,而数组内的每一个元素都是同一种元素,所以计算元素大小只需要总和去除以单个元素的大小即可(一般用于被除的单个元素都是arr[0],因为一个数组至少有一个元素

2.借助这个方法,以后数组元素个数就不用写死了,借助这个公式去灵活变化,赋予变量中(用于之后需要元素大小时,不用对应去不断改,借助这个公式统一算即可)

六  二维数组的创建

1.概念:二维数组是以一维数组作为元素的数组(同理三维数组是以二维数组作为元素的数组)

(二维数组及以上的数组统称为多维数组)

2.创建:元素类型 数组名[行][列]

七  二维数组的初始化

1.初始化:

完全初始化:大小刚好等于其所赋的值,先放完行,在接着放列

不完全初始化:给的值小于其大小,还是按照先把行放满,其余的放0

按照行初始化:利用{ {},{},{} },借助此括起来,{}代表一行内的值

2.二维数组可以省略行,但不可以省略列(由于二维数组的元素是一维数组,而一维数组的类型是元素类型+[大小],列其实代表着一维数组的大小,故可以认为数组的大小可以省略,但是其数组的类型不可省略

八  二维数组的使用

1.仍然是使用下标引用操作符:两个[][],数组名和内部加的数字都为其操作数

2.打印:使用两层for循环,先锁定行,同一行一列列轮流打印,然后再进行换行

九  二维数组在内存中的存储

1.二维数组在内存中连续存放,一行放完接着一行放,连在一起放

(由于二维数组是以一维数组作为元素的,所以会以arr[0],arr[1]等作为其每一行对应一维数组的数组名)

十  C99中的变长数组

1.C99标准前,数组的大小只能用常量或常量表达式来表示,但是C99标准出了之后就允许使用变量来定义数组大小

2.特点:

(1)本质特征:直到运行起来才知道数组的大小

所以变长数组不能进行初始化

(2)其变长的意思是说其大小可以由变量来决定,可以决定数组的元素个数,但是一旦其运行起来,其数组的大小就不再发生变化了

例如:arr[n]其大小由运行到此n的值来决定,一旦确定下来其数组大小就定下来了,即使后面n的值会不断变化,其数组的大小也不会再变

3.好处:使数组可以灵活变化,不会过大或过小

4.使用情况:在vs2022中不支持 但在clang或gcc等编译器中是支持的

十一  数组练习

1.多个字符从两端动,向中间汇集

知识点:

(1)求字符数组个数(不包括\0):

(i)其可以用sizeof()/sizeof()按照上面的方法得到字符数组的个数,但是要-1,因为sizeof是会计入\0的大小的

(ii)strlen()其可以计字符串的大小,其遇到\0就会停止计数(即不计入\0),所以用其算字符个数时不用-1(注意strlen使用时要引用头文件

(2)Sleep休眠函数:

(i)可以借助此进行程序的暂停

(ii)()括号内放的是其休眠的时间,单位为毫秒

(iii)使用时要引用

(3)清楚程序的屏幕:使用命令提示符cls

(i)其为系统指令使用时要使用system("")

(ii)并且要引用头文件

2.二分查找:

(1)原理:利用对半查找的原理,每次都找到其中间元素,与所以要查找的元素进行对比

(2)前提:其所要找的元素必须为一个有序数组

(3)实现的步骤:

(i)先输入一个想要找的数

(ii)分别设置其最右的元素(求出元素个数后-1,因为下标从0开始)和最左的元素

(iii)求出其中间元素的下标并访问,与所要求的元素进行对比,进行条件判断后对最右边或最左边元素进行调整,然后再继续进行,直到找到时对其进行跳出

(iv)此时需要运用到我之前说的标记法,因为其循环结束时会有两种情况,一种是前面找到了然后跳出来了,一种是已经找不到不符合循环条件跳出来了,所以此时利用flag变量先令flag==1,假设其找不到,等到找到后再立刻flag==0,然后进行条件判断就知道其找不找得到了

(4)优化:

(i)问题:其在求其中间元素时,是利用(left+right)/2,如果left和right的值很大,那么可能会出现溢出的现象(即二者加起来会大于整形所能存储的范围

(ii)改善:可以利用条形状的原理,将right多的那部分对半砍补到left上

例:left+right/2

注:以后要求两个数为了防止溢出都可以用此方式防止溢出

你可能感兴趣的:(1024程序员节)