为什么要引入数组?
变量只能存储一个单独的数据,如果涉及到储存很多个同类数据,比如一个班级的学生的数学考试成绩,用变量就要定义一个班的人数个,这样显然是很麻烦的。
数组是用于储存多个同类型的数据的,相当于把多个同类变量划分在一起,统一起名字,并且使得这些变量的物理地址连续排列,便于代码的维护。
1、一维数组
一维数组的定义:
格式:数据类型 数组名[同类型数据的个数];
例如:float score[20]; 数据类型:float 个数:20
int age[5];数据类型:int 个数:5
char ch[10];数据类型:char 个数:10
int *a[5];数据类型:int * 个数:5
以数组age[5]为例,数组内一共有5个int型数据,分别是age[0]、age[1]、age[2]、age[3]、age[4],数组的下标从0开始,到4结束,一共5个。
一维数组的初始化:
有如下几种方式:
int b[5] = {1,2,3,4,5};
int b[] = {1,2,3,4,5};
一维数组的读与写:
数组在读写时,只能通过下标一个个进行赋值,不能一次对整个数组赋值。
错误例子:b[5]={1,2,3,4,5}; 这样子赋值是不可以的
对数组score进行读写操作:
#include<stdio.h>
int main()
{
int i;
float score[5];
for(i=0;i<5;i++)
{
scanf("%f",&score[i]);
}
for(i=0;i<5;i++)
{
printf("%.2f ",score[i]);
}
return 0;
}
字符数组与字符串:
char name[10] = {'a','b','c','d','e','f','g','h','i','j'}; // 字符数组
char name1[5] = {'a','b'}; // {'a','b','\0','\0','\0'} // 字符数组或者字符串
字符串要用字符数组来存,字符数组的末尾至少要有一个‘\0’空字符作为结尾。中文字符占用两个字节,在分配数组空间时候需要留意。
字符串在存入数组时,可以通过以下方式输入输出:
#include<stdio.h>
int main()
{
char a[15]="abcdefg"; //直接初始化
char b[15];
scanf("%s",b); //键盘一次全部输入
printf("a:%s\nb:%s",a,b); //使用%s可以一次性输入输出字符串
return 0;
}
2、二维数组
结构类似套娃,相当于定义一个二维数组里面存入一些同类型的一维数组
定义格式:数据类型 数组名[行数][列数]; 行数列数用于方便理解,实际在地址空间中,这些数组的地址是线性排列的。
例如:创建一个2行3列的数组,输入数据,并输出
#include<stdio.h>
int main()
{
int a[2][3];
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",a[i][j]);
}
}
return 0;
}
3、数组使用时候的注意事项
数组只能在初始化的时候整体赋值:
int b[5] = {1,2,3,4,5}; 这样写,可以
int b[5];
b[5] = {1,2,3,4,5}; 这样写不行
int c[5];
c = {1,2,3,4,5}; 这样子也不行
数组名是数组首元素的地址:
定义数组b,编译器会为数组b分配地址和空间,此时虽然数组内部没有数据,但是有分配的地址,可以通过%p来读取地址并打印
#include<stdio.h>
int main()
{
int b[5];
printf("%p %p %p %p %p\n",&b[0],&b[1],&b[2],&b[3],&b[4]);
printf("%p %p\n",b,&b[0]);
return 0;
}
可以看到b和&b[0]输出的是同样的地址,所以数组名就是数组中第一个元素的地址