C语言回顾-数组
今天我们来复习一下数组,这是一个特殊的数据结构。当我们有很多相同的数据,如果每个数据都要有个定义的话就很麻烦,数组就是包含多个相同类型数据值的数据结构。这些数据值称为元素,可以跟所在数组的位置一个个选出来。
-
一维数组
最简单的数组就是一维数组,他们在内存中连续排列,比如当一个名字为a的数组他的排列方式为
a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 声明数组的时候,需要定义数组的类型和数组的长度,比如我们声明数组a有十个整型变量,要用:
int a[10];
然后我们要学习一下数组的用法,最重要的是数组下标,就是[]内的数字,数组的名字一个地址,指向数组的第一个元素,而且数组内元素依次排列,并且字节大小相等,那么每次给数组首地址移动它这么大小的单位就可以实现访问数组,但是在数组里,第一个元素为a[0],他是从0开始排列的,也就是第十个元素其实是a[9],这点需要重点记忆。并且这里a[9]的意思其实是*(a+9),*是与&对应的寻址符,而a是一个地址,
然后还有数组的初始化,可以再定义的时候初始化,int a[5]={1,2,3,4,5};也可以先定义后面在定义,下面我们用上次新学的scanf来输入一个数组并打印,代码如下:
#include<stdio.h> int main() { int i,a[10]; for(i=0;i<10;i++)//让i冲0到9循环十次 { scanf("%d",&a[i]);//每次对a[i]进行赋值 } for(i=0;i<10;i++) { printf("%d ",a[i]);//这里我们用一个循环打印出数组内的数据 } getchar(); getchar();//这里我们讲过,一个getchar 已经暂停不了了 return 0; }
我们依次录入数据并回车确认,程序运行结果如下:
但是还有一点,我们讲过a是数组第一个元素的地址,其实a[9]数组下标实际上和*(a+9)表达式一样,两个等价,*是是和&对应的寻址运算符。但是第二个更能说明a是一个地址,关于地址和指针我们会在后面学到。现在只要知道a是一个地址,a+n是在a的地址上加上一个单位的a的类型的内存,他是int类型的,也就是4字节,那么一次将移动四个单位,来实现数组遍历,那么也很容易理解,数组的内存怎么计算呢?应该是每个数据的大小乘以数组元素的数量。
-
多维数组
有时候我们想要保存一个二维表格式的数据,一维数组显然不够用了,我们就要用到二维数组,他的定义和一维数组很像,比如我们想定义一个整形的3*3的表格内容,需要代码:int a[3][3];,这样就是一个三行三列的数组,同样可以用下标来询问数据,他在内存;里这样排列:
也就是a还是第一个元素的地址,然后如果是三列的数组,(a+3)就到了第”一“行的首元素,然后再用第二个[]来下标取值,第二行第三个元素应该表示为a[1][2](再从注意,数组是从0开始计算顺序的)。
最后,我们用二维数组做一个程序,求一个数组中元素的最大值,代码如下:
#include<stdio.h>
int main()
{
int i,j,MAX=0,a[3][3]={1,2,3,4,5,6,7,8,9};//定义变量和一个整形二维数组
for(i=0;i<3;i++)//先用i作为数组的行,从0到2循环三次
{
for(j=0;j<3;j++)//再次嵌套一个for循环,用来循环列
{
printf("%d ",a[i][j]);//这里我们把数组元素打印出来
if(a[i][j]>=MAX)MAX=a[i][j];//这里做一个判断,如果这个是数比MAX大,
//就把他赋给MAX,那么最后MAX一定是最大的
}
putchar('\n');//这里用putchar打印换行符进行换行
}
printf("\nMAX=%d",MAX);//打印MAX的值
getchar();
return 0;
}
他的运行结果是这样的:
这里复杂一点,也是多记忆多理解吧。
15 : 50