数组
数组是变量的集合,是一种批量定义变量的方法。
一维数组:
定义:类型 名字[数量];//[]里的整数表示变量的数量
int arr[5] <=> int num1,num2,num3,num4,num5;
与普通变量一样,默认值不确定,为了安全需要初始化。
使用:名字[编号];//[]里的整数表示编号
arr[0] arr[1] arr[2] arr[3] arr[4]
编号也叫下标,范围是:0 ~ 数量-1。
遍历:C语言中没有提供遍历数组的语句,只能与for循环配合。
使用循环变量当前数组的下标。
for(int i=0; i<5; i++)
{
printf("%d\n",arr[i]);
}
初始化:类型 名字[数量] = {1,2,3,4};
1、初始化数据多于数组的数量,多余的会丢弃,但也会产生警告。
2、初始化数据少于数组的数量,不够则补零。
3、在初始数据的情况下数组数量可以省略,编译器会计算出数据的数量然后告诉数组有多长。
sizeof(arr)计算出数组的总字节数
sizeof(arr[0])计算出其中一个变量的字节数
sizeof(arr)/sizeof(arr[0])
练习:输入一个正整数,分解显示。
1234 1 2 3 4
#include <stdio.h>
int main()
{
int arr[10] = {};
int num = 0 , cnt = 0;
printf("请输入一个正整数:");
scanf("%d",&num);
while(num)
{
arr[cnt++] = num % 10;
num /= 10;
}
for(int i=cnt-1; i>=0; i--)
{
printf("%d ",arr[i]);
}
}
数组越界:
1、C语言中数组可以越界,没有语法错误(不能检查,也不想检查)。
2、数组越界使用时访问的是它之后的内存(可能是其他变量,也可能是其他数组,也有可能无主的,也有可能属于操作系统)。
数组越界的后果:
1、产生脏数据
2、一切正常
3、段错误(核心已转储)
二维数组:把变量排成一个方阵。
定义:类型 数组名[行数][列数];
int arr[2][2];
[][]
[][]
使用:数组名[行编号][列编号]。
编号从零开始。
arr[0][0],arr[0][1]
arr[1][0],arr[1][1]
遍历:配合双层for,外层循环负责遍历行,内层循环负责遍历列。
for(int i=0; i<2; i++)
{
for(int j=0;j<2;j++)
{
printf("%d “,arr[i][j]);
}
printf(”\n");
}
初始化:数组名[行编号][列编号] ={{v0,v1,v2},{v0,v1,v2},{v0,v1,v2}};
练习:定义一个5*5的二维数组并初始化,找出最大值的下标。
#include <stdio.h>
int main()
{
int arr[5][5]={{1,3,2,4,6},{5,4,9,2,3},{4,6,3,5,8},{2,5,3,7,6},{6,5,2,1,3}};
int max = arr[0][0],x=0,y=0;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(arr[i][j]>max)
{
x=i;
y=j;
max=arr[i][j];
}
}
}
printf("%d %d %d\n",max,x,y);
}
变长数组:数组的长度在编译时可以先不确定,在运行期间根据实际情况进行计算,当执行到数组定义语句时,就必须确定下来,才能在改变。
优点:可根据实际情况确定数组的长度,达到节约内存的目的。
缺点:不能初始化。