数组知识学习
1.什么是数组
数组的声明:<数据类型>+<数组名>+[数字],其中这个数字表示的是数组中元素的数量,数组声明时一定要有数据类型,而引用其中的元素时,不需要使用数据类型,例:<数组名>+[下标] 这样就表示一个元素,下标我们也叫索引,这个值必须要小于声明中的数字,并且下标是从0开始。下标我们通常用index这个英文。
我们需要注意:元素也是变量,元素中储存有数据,这个数据才是常量。
我们在声明数组的时候,[]中的数字一般都是采用宏定义的方法,这样比较方便。
2.不同类型的数组
按照数据类型划分,数组有整数型数组、浮点型数组、char类型数组(我们称为字符串数组),c字符串数组具有特殊性,整数型数组和浮点型数组差别不大。
一、整数型数组和浮点型数组
//探究整数型数组和浮点型数组
运行结果如下:
我们来研究这两类数组的地址: dates的地址:000000000062FE00 mounths的地址:000000000062FDD0 dates的地址:0000000000000000 mounths的地址:00000000004024C9
通过上面的代码我们可以发现,对于整数型数组和浮点型数组,数组名表示数组的地址,也就是数组中首元素的地址,而数组名加数字(并不是加下标)什么也不表示,在这两种数组中是没有意义的。
二、字符串数组
//研究字符串数组
这个代码的运行结果如下:
times[0]=I times[1]= times[2]=L times[3]=o times[4]=v times[5]=e times[6]= times[7]=M times[8]=I times[9]=C times[10]=E times[11]= times[12]=v times[13]=e times[14]=r times[15]=y times[16]= times[17]=m times[18]=u times[19]=c times[20]=h times[21]=! times[22]= times[23]= times[24]= times[25]= times[26]= times[27]= times[28]= times[29]= times[30]= times[31]= times[32]= times[33]= times[34]= times[35]= times[36]= times[37]= times[38]= times[39]= 字符串数组的地址:000000000062FDF0 字符串数组的地址:0000000000000001 I Love MICE very much!
我们可以发现,times[SIZE]在字符串数组中依旧什么都不表示,它既不能正确显示地址,也不能正确打印字符串,因此这是错误用法。
*重点:数组元素作为参数的写法:必须有一个int型变量作为下标,常用index,times[index]就可以整体作为参数使用。
三、数组的初始化
数组的初始化的本质:首先,计算机会将进行初始化的数据储存在内存中,也就是他们有一个内存位置,然后,由计算机再把这些数据拷贝一份,放在这个数组中,所以数组中每个元素的地址和这些数据本身所在的地址不一样。(所含的值因为设置数组就相当于给他在计算机中找了内存,并且每个元素都有内存,因为每个元素都是变量,所以都有地址)
如果指针指向的是数组中的元素储存的值,那么指针所储存的地址和数组中元素的地址是相同的;
//利用指针探究数组初始化的地址
对于整型或者浮点型数组的初始化:
1)int dates[8]={1,2,3,4,5,6,7,8};
使用花括号进行初始化,需要注意的是:
1.如果花括号中的数据个数多于数组中元素的个数,那么系统会报错
2.如果花括号中数据的个数少于数组中元素的个数,那么有多少个数据就会按顺序初始化多少个元素,剩下的全部初始化为0;
2)集成初始化:int dates[8]={0};
如果对初始化的值没有要求的话,我们一般是用集成初始化,也就是把数组中的所有元素都初始化为0;其实本质就是上面的有多少个数据就初始化多少个,我现在只有一个0,也就是把第一个元素初始化成0,后面的全部初始化为0。
3)指定初始化:int dates[8]={3,2,[5]=33,7,8};
我们来分析一下:首先我们发现初始化的花括号中只有五个值,因此符合规则
然后,第一个元素也就是dates[0]=3 第二个元素dates[1]=2
但是紧接着的却是指定dates[5]=33,因此跳过的[2] [3] [4]都被初始化为0,
我们指定了[5]因此后面的数据会按顺序初始化给[6] [7] 因此dates[6]=7 dates[7]=8
4)未知元素个数的初始化
通过这个方法,我们其实应该了解,只有当一组数据储存在了内存中,那么计算机才能够获取这组数据中数据的数量。(因为我们初始化首先就是将这些数据储存在计算机的内存中,然后再复制一份到数组中去)
有时候我们会遇到一堆数据,我们需要把他们放进一个数组中,但是我们不想数他们到底有多少个,那么我们可以采用这种初始化的办法。
int dates[]={1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99};
我们如果想知道这个数组中元素的个数,可以通过sizeof()这个求字节运算符,sizeof(dates)表示的是整个数组所占的字节数,sizeof(0)表示的是第一个元素所占的字节数,由于数组中每个元素的数据类型相同,因此可以用sizeof(dates)/sizeof(0)表示元素个数。
//数组未知元素个数进行初始化
对于字符串数组的初始化:
1)char times[8]="ABCEDFD"
注意,对字符串数组初始化,其中的字符个数一定要小于声明时的数字,因为计算机会自动在字符串后面加上一个空字符\0,(对于所有的字符串,计算机都会在其后面加上空字符\0)
初始化的时候一定要放在双引号中。
如果双引号中的字符数量加上空字符达不到所设定的数组的元素个数,那么剩下的部分依旧存在,只不过被初始化成\0空字符。
//字符串数组初始化
这个程序的运行结果:
times[1]= times[2]=L times[3]=o times[4]=v times[5]=e times[6]= times[7]=M times[8]=I times[9]=C times[10]=E times[11]= times[12]=v times[13]=e times[14]=r times[15]=y times[16]= times[17]=m times[18]=u times[19]=c times[20]=h times[21]=! times[22]= times[23]= times[24]= 32 0
虽然空字符打印出来好像是空格符,但是很明显可以看到,空字符ASCII码中对应0,空格符ASCII码中对应32.
2)集成初始化和指定初始化
字符串数组几乎不用这两种办法进行初始化。
3)未知元素个数的初始化
这是字符串数组最常用的初始化方式:
char times[]="kjkjsdjkkc lkjdkljlkbdjkhjksd llkj";
因为不需要知道字符串到底需要多大的内存空间,计算机会自动为其分配空间(这个空间包括空字符\0),如果想知道的这个字符串的长度也就是元素个数,可以直接使用strlen()函数,只不过这个strlen()函数所求出来的长度不包括\0。
4.多维数组
举个例子:假设我想统计近五年个月降水量,那么我会用到多维数组,原因是
我们需要对60个数据进行操作,为了方便起见,我把这60个元素按照年份分成五个一维数组,每一年构建一个一维数组,每个一维数组中有12个元素,并且最后把这5个一维数组合并成一个二维数组。
*重点:在二维数组中,第一个数组的下标是0,第一个元素的下标也是0。
例:
//定义二维数组
//利用二维数组来统计五年来个月的降水量
5.二维数组的初始化
掌握二维数组的初始化
写法:
//如何去初始化一个二维数组

浙公网安备 33010602011771号