数组是c语言的重要数据类型,我们前面讲的变量,都是一个一个的去声明,我们可不可以声明一个数据类型的集合呢?我们今天讲的数组就可以办到。
数组可以连续存放相同数据类型(这里注意连续存放,是指内存中开辟的空间是连续的)。我们来看看如何声明:
int a[5];//声明数组
这段代码就是声明一个5个元素的a数组,数组元素的类型是整型。a是数组的名字,和变量的名字一样。我们如何对数组元素进行赋值呢?有几种方式。
1.声明的时候就赋值。
int a[5]={1,2,3,4,5};
声明的时候就初始化,有些人可能想问如果我后面没有5个数(int a[5]={1,2,3};)会怎样?编译器会将后面的元素全部置为0。如果我多一个数呢?(int a[5]={1,2,3,4,5,6};),很抱歉这样做是错误的,编译器会报错。
2.单独赋值。
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
这里需要注意数组的元素可以通过下标来调用,但是下标是从零开始的。当我们声明int a[5]的时候我们的下标是从0-4,而不是1-5。我们才学了循环所以上面的代码可以写成:
int i;
for(i=0;i<5;i++)
{
a[i]=i+1;
}
数组的元素如果没有赋值,编译器会随机给一个值(上面那种是赋值不完全的情况,这种是完全没有赋值的情况)。
我们也可以自己来输入数组元素的值。
int i;
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
这里都是之前的基本操作,新的东西就是这个数组元素。大家一定要记得取地址符号因为数组元素也是一个变量,所以它和变量没有什么区别。
输出数组和输入数组差不多,这里就不讲了,大家自己试试。
数组在声明的时候就必须给出长度,那么我们能不能不给长度呢?当然可以,但是是有条件的。唯一的方法如下:
int a[]={1,2,3,4,5,6};
编译器自动计算出这个数组的元素为6个。
上面举例的时候用的都是int,大家可以试试double等等这些数据类型。当然字符型也是可以的,字符型数组每个元素存储一个字符。下面举个字符数组的例子:
char b[]={'h','e','l','l','o'};
上面的初始化大家肯定觉得很麻烦,C语言标准中给出了另一种方式:
char b[]="hello";
是不是要简单的多?注意这里是双引号而不是单引号哦,其实有点基础的人都知道双引号代表字符串,单引号代表字符。c语言对字符的处理并不像有些语言那么灵活,关于字符串的东西我们后面学了指针过后会专门一章来讲。
二维数组
上面讲的是一维数组类似一个表格的一行多列(多个元素)。二维数组类似多行多列的表格。看下面看具体语法:
int a[2][3];
上面表示一个二维数组,有2行3列,六个元素。
我们先对它进行赋值,再说其他的问题。
int a[2][3]={{1,2,3},{4,5,6}};
和一维数组类似,但是这里需要将每行都用大括号括起来。
我们看下面的图可能更好的理解二维数组
aij | 0 | 1 | 2 |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
这样来看可能更加直观一些,类似矩阵。和一维数组一样,二维数组的下标也是从零开始的。(例如,a12代表第二行第三个元素)
赋值方式也类似上面的一维数组。我们来看看用循环实现赋值。
int a[2][3];
int i,j,k=1;
for(i=0;i<2;i++)//循环两次
{
for(j=0;j<3;j++)//每次循环三次
{
a[i][j]=k++;
}
}
上面这个程序实现数组a[2][3]的赋值,我们这里第一次用到for循环的嵌套,大家要好好理解这段嵌套循环的代码。
除了二维数组以外还有三维,四维。。。想多少维就多少维数组,但是它们都和二维数组类似,理解就好。而且我们一般也不会用到那么高维的数组。
上面的代码我都给的是核心的一部分,希望大家自己去敲出完整的代码,然后在编译器里面运行一下。
注:
我们可不可以写一个数组长度不确定,让用户自己确定长度的数组呢?
int n;
scanf("%d",&n);
int a[n];
像上面这样做可以吗?答案是要看编译器,c89的编译器标准肯定不可以,c99以后的都是可以的。再看看下面的代码:
int n;
int a[n];
scanf("%d",&n);
这段代码编译是没有问题的,但是大家小心为妙,我并不知道编译器是怎样处理这段代码的。
总结
数组是c语言重要的数据类型,需要好好掌握对它的声明,赋值等基本语法。
练习
1.编写一个程序,手动输入一个3行4列的二维数组,并像表格一样排列打印出来