数组介绍
数组可以存放多个同一类型数据。数组也是一种数据类型,是构造类型。传递是以引用的方式传递(即传递的是地址)。
案例:
一个养鸡场有6只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平均体重是多少?
#include<stdio.h>
void main(){
double a[6];//定义数组
a[0] = 3;
a[1] = 5;
a[2] = 1;
a[3] = 3.4;
a[4] = 2;
a[5] = 50;
double sum =0.0;
double avg =0.0;
//遍历数组
int i;
for(i=0;i<=5;i++){
sum +=a[i];// 累加
}
avg = sum / 6;
printf("总体重=%.2f 平均体重=%.2f",sum,avg);
}
数组的大小
#include<stdio.h>
void main(){
double a[6];//定义数组
printf("数组大小=%d\n",sizeof(a)); //一个 double 占用8个字节,6*8
int aSize = sizeof(a) / sizeof(double);
printf("数组包含double的数量=%d",aSize);
}
用程序计算数组的大小的作用:便于维护。
一个养鸡场有6只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平均体重是多少?
#include<stdio.h>
void main(){
double a[6];//定义数组
a[0] = 3;
a[1] = 5;
a[2] = 1;
a[3] = 3.4;
a[4] = 2;
a[5] = 50;
double sum =0.0;
double avg =0.0;
//遍历数组
int i,arrLen;
arrLen = sizeof(a) / sizeof(double);
for(i=0;i<=arrLen;i++){//当前面数组元素变动时,这里不用改动
sum +=a[i];// 累加
}
avg = sum / 6;
printf("总体重=%.2f 平均体重=%.2f",sum,avg);
}
数组定义和内存布局
数组的定义
数据类型 数组名 [数组大小];
int a [5]; // a数组名,类型int,[5]大小,即a数组最多存放5个int数据赋初值 a[0]= 1 ; a[1]= 30; ......
说明:
(1)数组名就代表该数组的首地址,即a[0]地址。
(2)数组的各个元素是连续分布的,假如 a[0]地址0x1122,a[1]地址= a[0]的地址+int字节数(4)=0x1122+4=0x1126,后面a[2]地址 =a[1]地址+ int字节数(4)=0x1126+4=0x112A,依次类推。
访问数组元素
数组名[下标]比如:你要使用a数组的第三个元素a[2],下标是从0开始计算。
案例
从终端循环输入5个成绩,保存到double数组,并输出。
#include<stdio.h>
void main(){
double arr[5];
int arrLen =sizeof(arr)/sizeof(double);
int i;
for(i=0;i<arrLen;i++){
printf("\n 请输入一个小数:");
scanf("%lf",&arr[i]);
}
//输出整个数组
printf("\n==================\n");
for(i=0;i<arrLen;i++){
printf("arr[%d] = %.2f\n",i,arr[i]);
}
}
3种初始化方法
//第一种
int arr1[3];
arr1[0]=100;
arr1[1]=200;
arr1[2]=300;
//第二种
int arr2[3]={4,5,6};
//第三种
int arr3[]={7,8,9};//直接给值可以不用给定数组的大小,系统可以自动识别
数组使用注意事项和细节
(1)数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
(2)数组创建后,如果没有赋值,则遵守如下规则
全局数组默认值О
非全局数组初值是机器垃圾值(即:原来系统分配给这块空间的值)
(3)使用数组的步骤1.定义数组﹖给数组各个元素赋值3使用数组,也可以一步到位。
(4)数组的下标是从0开始的,不是从1开始。
(5)数组下标必须在指定范围内使用,编译通过,在运行时会因为数组越界而异常中断:比如int arr [5]有效下标为0-4。
(6)C的数组属构造类型,是引用传递(传递的是地址),因此当把一个数组传递给一个函数时/或者变量,函数/变量操作数组会影响到原数组。
#include<stdio.h>
void f1(int arr[]){
printf("\nf1中arr的地址=%p",arr);
arr[0]=arr[0]+1;//第一个数加了1
}
void main(){
int arr[3]={3,4,5};
int i;
printf("\nmain中arr的地址=%p",arr);
//数组默认是以地址传递(传递指针)
f1(arr);
//遍历 main 函数中的 arr
for(i=0;i<3;i++){
printf("\narr[%d]=%d\n",i,arr[i]);//4 4 5
}
}
数组应用案例
(1)创建一个char类型的26个元素的数组,分别放置’A-Z‘。使用for循环访问所有元素并打印出来。提示:字符数据运算’A’+1 ->‘B’。
#include<stdio.h>
void main(){
char arr[26];
int i;
for(i=0;i<26;i++){
arr[i] = 'A' +i;
}
for(i=0;i<26;i++){
printf("%c",arr[i]);
}
}
(2)请求出一个数组的最大值,并得到对应的下标。
#include<stdio.h>
void main(){
int arr[] = {0,5,10,8,9,100};
int arrLen =sizeof(arr) / sizeof(int);
int max =arr[0];
int maxIndex =0;
int i;
for(i=1;i<arrLen;i++){
//如果发现比 max 大的数 ,就把大的数赋值给 max
if(arr[i] > max){
max = arr[1];
maxIndex = i;
}
}
printf("max = %d maxIndex = %d",max,maxIndex);
}