1、数组概念
数组就是存储多个相同数据类型的数据。
比如:存储26个字母,存储一个班级的学生成绩。
2、数组使用
数组要遵循先定义再使用
2.1、数组定义的格式
存储数据---空间 ---- 数据类型
多少个 --- 数据个数
>> 数据类型 数组名[数据个数];
标识符: 数字 字母 _ $
不能以数字开头
不能和关键字重复
例:
a、 存储班级的平均分--班级有20个人
存储数据 -- 成绩 --- float
数据个数:20
float scores[20];
b、定义一个数组用来存放班级同学的年龄,班级有5个同学
int a[5];
2.2、数组的下标
定义数组后,数组会为空间进行编号,从0开始,到数据个数-1 ---- 规定
用数组的时候切记不要超标
2.3、数组空间访问
数组名[下标]
------------------------------------------------------------------------------------------
| // 数组定义 -[总个数] | // 数组使用 --- [下标] |
------------------------------------------------------------------------------------------
| int a[5]; | // a[0] a[1] a[2] a[3] a[4] ---- int |
------------------------------------------------------------------------------------------
练习:
需求:定义一个存放5个int型数据的数组,对空间进行赋值操作,然后将数据从空间里面读取出来。
#include<stdio.h>
int main(void)
{
int a[5];
a[0] = 10;
a[1] = 20;
a[2] = 90;
a[3] = 45;
a[4] = 5;
// 把数组中的所有数据输出一下
printf("%d ",a[0]);
printf("%d ",a[1]);
printf("%d ",a[2]);
printf("%d ",a[3]);
printf("%d ",a[4]);
return 0;
}
改进1:对数组里面的数据进行求和。
#include<stdio.h>
int main(void)
{
int a[5];
a[0] = 10;
a[1] = 20;
a[2] = 90;
a[3] = 45;
a[4] = 5;
// 把数组中的所有数据输出一下
printf("%d ",a[0]);
printf("%d ",a[1]);
printf("%d ",a[2]);
printf("%d ",a[3]);
printf("%d ",a[4]);
int res;
res = a[0] + a[1] + a[2] + a[3] + a[4];
printf("数据之和为:%d\n",res);
return 0;
}
改进2:使用循环对数组的数据访问进行从挨揍,下标是连续的
#include<stdio.h>
int main(void)
{
int a[5];
a[0] = 10;
a[1] = 20;
a[2] = 90;
a[3] = 45;
a[4] = 5;
// 把数组中的所有数据输出一下
int i;
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
printf("\n");
int res;
for(i=0;i<5;i++)
{
res = res + a[i];
}
printf("数据之和为:%d\n",res);
return 0;
}
2.4、数组初始化
初始化就是定义时候给值
int a[5] = {1,7,9,10,20};
int b[5] = {1,2,3}; // {1,2,3,0,0}初始化的时候没有赋值的空间补0
int c[5] = {1,2,3,4,5,6,7}; // {1,2,3,4,5} 初始化超出部分舍弃
// 省略个数的初始化,后面{}有几个值就开几个空间
int d[] = {1,2,3}; //int d[3] = {1,2,3};
错误:不要写 不要写 不要写!!!!
int e[]; //定义的时候不能省略,不然不知道开多少空间
int f[] = {}; // 不会开空间
int t[] = {0}; // 开1个空间 ,没有必要用数组了
注意:数组只能在初始化的时候整体赋值。
int a[5];
a = {1,2,3,4,5}; // 错误的,数组名是一个常量 0x0062fe50
练习:
对初始化的数组进行访问
#include<stdio.h>
int main(void)
{
int a[5] = {1,7,9,10,20};
// 0 1 2 3 4
int i; // 下标
for(i=0;i<5;i++)
{
// i
printf("%d ",a[i]);
}
return 0;
}
2.5、数组要素分析
数组中数据的类型(元素类型):除了数组名[数据个数] 剩下的就是里面存放的数据的类型
数组的类型: 除了 数组名 剩下的就是数组的类型
数组名: 数组名称[]前面的
3、二维数组
可以理解为存放多个同种类型的一维数组,理解按照行和列来理解二维数组
先定义再使用的原则
3.1、二维数组定义
数据类型 数组名[总行数][总列数];
例:
a、定义一个二维数组,用来存放2个int [5]的数据
int arr[2][5];
b、定义一个二维数组,用来存储5个人名
分析:
1个人名是1个字符串 -- 1个字符数组,假设人名最多占20个字符
5个人名是5个字符串 --5个字符数组,可以理解为开5行字符串空间,每行20个字符
char names[5][20];
3.2、二维数组使用
行下标:0 ~ 总行数-1
列下表:0 ~ 总列数-1
数据名称:数组名[行下标][列下标]
数据地址:&数组名[行下标][列下标]
例:
定义一个2行5列存储int型数据的二维数据,对数组中的int型空间进行读写操作。
#include<stdio.h>
int main(void)
{
int arr[2][5];
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 60;
arr[0][3] = 40;
arr[0][4] = 90;
arr[1][0] = 100;
arr[1][1] = 7;
arr[1][2] = 39;
arr[1][3] = 50;
arr[1][4] = 89;
printf("第0行数据:");
printf("%d ",arr[0][0]);
printf("%d ",arr[0][1]);
printf("%d ",arr[0][2]);
printf("%d ",arr[0][3]);
printf("%d ",arr[0][4]);
printf("\n");
printf("第1行数据:");
printf("%d ",arr[1][0]);
printf("%d ",arr[1][1]);
printf("%d ",arr[1][2]);
printf("%d ",arr[1][3]);
printf("%d ",arr[1][4]);
printf("\n");
return 0;
}
改进:使用循环操作二维数组的读写操作。
#include<stdio.h>
int main(void)
{
int arr[2][5];
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 60;
arr[0][3] = 40;
arr[0][4] = 90;
arr[1][0] = 100;
arr[1][1] = 7;
arr[1][2] = 39;
arr[1][3] = 50;
arr[1][4] = 89;
int i,j;
for(i=0;i<2;i++)
{
printf("第%d行数据:",i);
for(j=0;j<5;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
4、数组名是数组首元素的地址
数组名是数组首元素的地址,说的是数组名在使用的时候某些情况下可以当做它首元素的地址来看,他们类型一致,数值也一致。如果实二维数组需要分层来看。
#include<stdio.h>
int main(void)
{
int a1[5];
printf("%p %p\n",a1,&a1[0]); // 0062FE8C 0062FE8C
int a2[2][5];
printf("%p %p\n",a2,&a2[0]); // 0062FE64 0062FE64
printf("%p %p\n",a2[0],&a2[0][0]); // 0062FE64 0062FE64
printf("%p %p\n",a2[1],&a2[1][0]); // 0062FE78 0062FE78
return 0;
}