一、 数组的概念
数组是若干个相同类型的变量在内存中有序存储的集合
概念理解:
数组用于存储一组数据
数组里面存储的数据类型必须是相同的
数组在内存中会开辟一块连续的空间
int a[10];//定义了一个整型的数组 a,a是数组的名字,数组中有 10 个元素,每个元素的类型都是 int类型,而且在内存中连续存储。
这十个元素分别是 a[0] a[1]...a[9]
a[0]~a[9]在内存中连续的顺序存储
二、数组的分类
2.1 按元素的类型分类
1) 字符数组
即若干个字符变量的集合,数组中的每个元素都是字符型的变量 char s[10]; s[0],s[1]....s[9];
2) 短整型的数组
short int a[10]; a[0] ,a[9]; a[0]=4; a[9]=8;
3) 整型的数组
int a[10]; a[0] a[9]; a[0]=3; a[0]=6;
4)长整型的数组
lont int a[5];
5)浮点型的数组(单、双)
float a[6]; a[4]=3.14f;
double a[8]; a[7]=3.115926;
6)指针数组
char *a[10]int *a[10];
7)结构体数组
struct stu boy[10];
2.2 按维数分类
一维数组
int a[30];
类似于一排平房
二维数组
int a[2][30];
可以看成一栋楼房 有多层,每层有多个房间,也类似于数学中的矩阵二维数组可以看成由多个一维数组构成的。有行,有列,
多维数组
int a[4][2][10];
三维数组是由多个相同的二维数组构成的
int a[5][4][2][10];
三、数组的定义
3.1 一维数组的定义
格式:
数据类型 数组名[数组元素个数]
例:
int a[10];//定义了一个名为a的数组,数组中每一个元素都是int类型,一共有10个元素,每一个元素都保存在一个变量中,每一个变量都是由数组名和数组下标组成的,并且是从0开始,分别是a[0] a[1] a[2]......a[9]
注意:数组元素的个数在定义的时候也可以不写,但是如果不写,必须初始化(定义的时候赋值)
#include<stdio.h>
int main()
{
//定义一个一维数组
int a[10];
printf("sizeof(a)=%d\n",sizeof(a));
int b[]={10,20,30};
printf("sizeof(b)=%d\n",sizeof(b));
return 0;
}
3.2 二维数组的定义
格式:
数据类型 数组名[行的个数][列的个数];
例:
int a[2][4];
定义一个名为a的二维数组,每一个元素都是int类型,这个二维数组中包含两行四列的元素,一共有8个元素二维数组也是连续开辟空间
访问元素时行和列都是从0开始,a[0][0]、a[0][1]、a[1][0]
#include<stdio.h>
int main()
{
//定义一个二维数组
int c[2][4];
printf("sizeof(c)=%d\n",sizeof(c));//32
return 0;
}
注意:二维数组的行数可以省略,但是列数不能省略,在初始化时可以这样操作
四、定义并初始化
4.1 一维数组的初始化
全部初始化
int a[5]={2,4.7,8,5};
代表的意思: a[0]=2; a[1]=4;a[2]=7;a[3]= 8;a[4]=5;
部分初始化
int a[5]={2,4,3};初始化赋值不够后面补 0
a[0]=2; a[1]=4;a[2]=3;a[3]=0;a[4]=0;
注意:只能省略后面元素,可以不初始化,不能中间的不初始化
#include<stdio.h>
int main()
{
//全部初始化
int a[4]={10,20,30,40};
printf("%d\n",a[0]);
printf("%d\n",a[1]);
printf("%d\n",a[2]);
printf("%d\n",a[3]);
printf("------------------------------\n");
//部分初始化
int b[4]={10,20};
printf("%d\n",b[0]);
printf("%d\n",b[1]);
printf("%d\n",b[2]);
printf("%d\n",b[3]);
}
4.2 二维数组的初始化
按行初始化
全部初始化
int a[2][2]={{1,2},{4,5}};
a[0][0] =1; a[0][1]= 2; a[1][0]= 4,a[1][1]=5;
部分初始化
int a[3][3]={{1,2},{1}};
a[0][0]= 1;a[0][2]=0;
逐个初始化
全部初始化
int a [2][3]={2,5,4,2,3,4}
部分初始化
int a[2][3]={3,5,6,8}
#include<stdio.h>
int main()
{
//按行初始化
//全部初始化
int a[2][3]={{10,20,30},{40,50,60}};
printf("%d\n",a[0][0]);
printf("%d\n",a[0][1]);
printf("%d\n",a[0][2]);
printf("%d\n",a[1][0]);
printf("%d\n",a[1][1]);
printf("%d\n",a[1][2]);
printf("----------------------\n");
//部分初始化
int b[2][3]={{10,20},{50}};
printf("%d\n",b[0][0]);
printf("%d\n",b[0][1]);
printf("%d\n",b[0][2]);
printf("%d\n",b[1][0]);
printf("%d\n",b[1][1]);
printf("%d\n",b[1][2]);
return 0;
}
#include<stdio.h>
int main()
{
//逐个初始化
//全部初始化
int a[2][3]={10,20,30,40,50,60};
printf("%d\n",a[0][0]);
printf("%d\n",a[0][1]);
printf("%d\n",a[0][2]);
printf("%d\n",a[1][0]);
printf("%d\n",a[1][1]);
printf("%d\n",a[1][2]);
printf("----------------------\n");
//部分初始化
int b[2][3]={10,20,50};
printf("%d\n",b[0][0]);
printf("%d\n",b[0][1]);
printf("%d\n",b[0][2]);
printf("%d\n",b[1][0]);
printf("%d\n",b[1][1]);
printf("%d\n",b[1][2]);
return 0;
}
五、数组元素的引用方法
5.1 一维数组元素的引用方法
数组名[下标];//下标代表数组元素在数组中的位置,注意从0开始
int a[10];
a[2];
#include<stdio.h>
//一维数组
int main()
{
int a[5]={1,2,3,4,5};
int i;
int b=sizeof(a)/sizeof(a[0]);
//一维数组的遍历
for(i=0;i<b;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
5.2 二维数组元素的引用方法
数组名[行下标][列下标];
int a[3][4];
a[1][2]
#include<stdio.h>
//二维数组
int main()
{
int b[2][4]={1,2,3,4,5,6,7,8};
int m,n;
for(m=0;m<2;m++)
{
for(n=0;n<4;n++)
{
printf("%4d",b[m][n]);
}
printf("\n");
}
return 0;
}
六、字符数组的定义和初始化
char c1[] ={'c', ,'p','r,o','g'};
char c2[] = “c prog”;
char a[][5]= {
{'B','A','S','T','C'},
{'d','B','A','S','E’}
char a[][6]= {"hello","world”};
字符数组的引用
1.用字符串方式赋值比用字符逐个赋值要多占 1个字节,用于存放字符串结束标志'0’;
2.上面的数组 c2 在内存中的实际存放情况为:
注:‘\0'是由C编译系统自动加上的
3.由于采用了'\0'标志,字符数组的输入输出将
变得简单方便
#include<stdio.h>
int main()
{
char ch[32]="";
scanf("%s",ch);
printf("ch=%s\n",ch);
return 0;
}
注意:在QT中如果要使用scanf函数这样的从终端输入函数,需要通过命令终端输入输出点击左边工具栏中的“项目”, 点击“build&run"下方的“run”,然后再右侧点击,再“run in terminal”"前打对勾