数组知识学习

1.什么是数组

数组是由一系列相同类型的元素组成。

数组的声明:<数据类型>+<数组名>+[数字],其中这个数字表示的是数组中元素的数量,数组声明时一定要有数据类型,而引用其中的元素时,不需要使用数据类型,例:<数组名>+[下标] 这样就表示一个元素,下标我们也叫索引,这个值必须要小于声明中的数字,并且下标是从0开始。下标我们通常用index这个英文。

我们需要注意:元素也是变量,元素中储存有数据,这个数据才是常量。

我们在声明数组的时候,[]中的数字一般都是采用宏定义的方法,这样比较方便。

2.不同类型的数组

按照数据类型划分,数组有整数型数组、浮点型数组、char类型数组(我们称为字符串数组),c字符串数组具有特殊性,整数型数组和浮点型数组差别不大。

一、整数型数组和浮点型数组
//探究整数型数组和浮点型数组
#include <stdio.h>
#define SIZE 5
int main(void)
{
int dates[SIZE]={0};
double mounths[SIZE]={0.0};//整数型数组和浮点型数组初始化是在花括号内进行初始化

printf("我们来研究这两类数组的地址:\n");
printf("dates的地址:%p\nmounths的地址:%p\n",dates,mounths);
//换另一种方式表示数组的地址
printf("dates的地址:%p\nmounths的地址:%p\n",dates[SIZE],mounths[SIZE]);

return 0;
}

运行结果如下:

我们来研究这两类数组的地址: dates的地址:000000000062FE00 mounths的地址:000000000062FDD0 dates的地址:0000000000000000 mounths的地址:00000000004024C9

通过上面的代码我们可以发现,对于整数型数组和浮点型数组,数组名表示数组的地址,也就是数组中首元素的地址,而数组名加数字(并不是加下标)什么也不表示,在这两种数组中是没有意义的。

二、字符串数组
//研究字符串数组
#include <stdio.h>
#define SIZE 40
int main(void)
{
char times[SIZE]="I Love MICE very much!";//首先,对于字符串数组,初始化必须在双引号中进行

//现在来打印这个数组中的某个元素
int index;
for (index=0;index<SIZE;index++)
{
printf("times[%d]=%c\n",index,times[index]);
}
//打印字符串数组的地址
printf("字符串数组的地址:%p\n",times);
printf("字符串数组的地址:%p\n",times[SIZE]);
printf("%s\n",times);
printf("%s\n",times[SIZE]);
return 0;
}

这个代码的运行结果如下:

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]就可以整体作为参数使用。

三、数组的初始化

数组的初始化的本质:首先,计算机会将进行初始化的数据储存在内存中,也就是他们有一个内存位置,然后,由计算机再把这些数据拷贝一份,放在这个数组中,所以数组中每个元素的地址和这些数据本身所在的地址不一样。(所含的值因为设置数组就相当于给他在计算机中找了内存,并且每个元素都有内存,因为每个元素都是变量,所以都有地址)

如果指针指向的是数组中的元素储存的值,那么指针所储存的地址和数组中元素的地址是相同的;

//利用指针探究数组初始化的地址
#include <stdio.h>

int main(void)
{
int dates[8]={1,2,3,4,5,6,7,8};
int *ptint;//这个指针表示的是指向这个数组的指针,因此他的地址一定和数组中第一个元素的地址相同。

char times[8]="ABCESS";
char *ptchar=times;//这个指针表示的是指向这个数组的指针,因此他的地址一定和数组中第一个元素的地址相同。
printf("打印数组中第一个元素的地址:%p\n打印指针所表示的地址:%p\n",dates,ptint);
printf("打印数组中第一个元素的地址:%p\n打印指针所表示的地址:%p\n",times,ptchar);

return 0;
}
对于整型或者浮点型数组的初始化:
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)表示元素个数。

//数组未知元素个数进行初始化
#include <stdio.h>

int main(void)
{
int dates[]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,0};
int index;

for (index=0;index<(sizeof(dates)/sizeof(dates[0]));index++)
{
printf("dates[%d]=%d\n",index,dates[index]);//数组作为参数的方法,需要设置一个下标变量,数字名加下标变量就可以作为实参来传递数据
}
return 0;
}
对于字符串数组的初始化:
1)char times[8]="ABCEDFD"

注意,对字符串数组初始化,其中的字符个数一定要小于声明时的数字,因为计算机会自动在字符串后面加上一个空字符\0,(对于所有的字符串,计算机都会在其后面加上空字符\0)

初始化的时候一定要放在双引号中。

如果双引号中的字符数量加上空字符达不到所设定的数组的元素个数,那么剩下的部分依旧存在,只不过被初始化成\0空字符。

//字符串数组初始化
#include <stdio.h>
#define SIZE 25
int main(void)
{
char times[SIZE]="I Love MICE very much!";

int index;
for (index=0;index<SIZE;index++)
{
printf("times[%d]=%c\n",index,times[index]);
}
printf("%d\n",times[16]);
printf("%d\n",times[23]);
return 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。

例:

//定义二维数组
//利用二维数组来统计五年来个月的降水量
#include <stdio.h>
#define YEARS 5
#define MOUNTHS 12//首先我先定义两个宏,一个是数组中的年份5,一个是数组中的月份12

int main(void)
{
const double mounth_rain[YEARS][MOUNTHS]=//由于这个数组不需要更改数据,所以我们写成常量数组
{
{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
{8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
{9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
{7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
{7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}
};//如何来理解二维数组:
//二维数组的本质就是有几个一维数组组成的,在本例中,二维数组mounth_rain是由5个一维数组组成,这五个一维数组的数组名分别是:
//mounth_rain[0] mounth_rain[1] mounth_rain[2] mounth_rain[3] mounth_rain[4] ,其次每个一维数组里面有12个元素,总共有60个元素。



//对于二维数组的打印 ,我们需要内嵌一个for循环
int years;
int mounths;
double total_year;
double total_sum;
for (total_sum=0.0,years=0;years<YEARS;years++)
{
for (total_year=0.0,mounths=0;mounths<MOUNTHS;mounths++)
{
printf("第%d年的第%d月的降水量是%.2f\n",years+1,mounths+1,mounth_rain[years][mounths]);
total_year+=mounth_rain[years][mounths];
}
total_sum+=total_year;
printf("第%d年的总降水量是:%.4f\n",years+1,total_year);
}
printf("这五年的总降水量是:%.4f\n",total_sum);

return 0;
}

5.二维数组的初始化

掌握二维数组的初始化

写法:

//如何去初始化一个二维数组
#include <stdio.h>

int main(void)
{
int dates[8][3]=//对于这种含有多个一维数组的,采用分行写。
{
{1,2,3},
{4,5,6},
{7,8,9},
{11,22,3},
{12,3,5},
{33,4,7},
{4,7,0},
{1,4,8}
};

int times[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};//对于这种一维数组较少的,写在一行即可。

return 0;
}

 

posted @ 2021-12-17 16:19  OldSword-JY  阅读(60)  评论(0)    收藏  举报