数组
什么是数组:变量的组合,是一种批量定义变量的方式
定义:类型 数组名[数量];
int arr [5]
使用:数组名[下标];
下标:从零开始 范围:0~数量-1
遍历:与for循环配合,使用循环变量i当做数组的下标
初始化: 类型 数组名[数量] = {1,2,3,4...};
1、数组与普通变量一样,默认值是随机的,因此为了安全要对数组初始化
2、这种初始化只能在定义数组的时候使用,并且只能逐个赋值,不能整体赋值
3、如果初始化的数据过多,编译器会产生警告并丢弃多余的数据,前列的数据依旧会赋值
4、如果初始化的数据不足,编译器会自动补0
5、初始化的数据可以省略,只写大括号相当于给所有数组成员赋0 如 int arr[5] = {} 全部补0
6、初始化数组时,长度可以省略,编译器会自动统计数据的个数然后告诉数组
数组的长度 = sizeof(arr)/sizeof(arr[0])
[]和{}必须得有一个有 有效 输入
练习1:定义一个长度为10的数组并初始化,计算出该数组的最大值、最小值、平均值。
int arr[] = {8,6,4,7,2,5,9,4,5,8};
int max,min,sum = 0;
max = min = arr[0];
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]);i++)
{
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
sum += arr[i];
}
printf("max = %d,min = %d,ave = %.2f",max,min,sum/10.0);
练习2:定义一个长度为10的数组并初始化,进行升序排序
int min,tmp = 0,arr[] = {8,6,4,7,2,5,9,4,5,8};
for(int i = 0;i < sizeof(arr)/sizeof(arr[0])-1;i++)
{
min = i;
for(int j = i+1; j < sizeof(arr)/sizeof(arr[0]); j++)
{
if(arr[j] < arr[min]) min = j;
}
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d",arr[i]);
}
数组越界:为了程序的运行效率考虑不会检查数组的下标
数组越界的后果:
1、一切正常
2、段错误(非法使用内存)
3、脏数据(根据编译器不同,i很有可能被污染,进入死循环)
int arr[10];
for(int i = 0; i <= 10; i++)
{
arr[i] = 1;
printf("%d\n",arr[i]);
// arr[10] 会修改i的内容,导致脏数据
}
练习3:定义一个长度为10的数组并初始化,找出数组中第二大的值,不允许排序
int a[] = {0,1,2,3,4,5,6,7,8,9};
int max1 = a[0] > a[1]?a[0]:a[1];
int max2 = a[0] > a[1]?a[1]:a[0];
for(int i = 2; i <sizeof(a)/sizeof(a[0]); i++)
{
if(a[i]>max1)
{
max2 = max1;
max1 = a[i];
}
else if(a[i]>max2)
{
max2 = a[i];
}
}
printf("第二大:%d",max2);