文章目录
为什么需要数组
一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg, 3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请你编一个程序。
传统解决:
- 定义 6 个 double 变量
- 统计他们和,并求出平均值
- 传统的方案,不灵活,不能够完成数量大的需求
- 引出数组
数组介绍
数组可以存放多个同一类型数据。数组也是一种数据类型,是构造类型。传递是以引用的方式传递(即传递的 是地址)。
数组快速入门
比如,我们可以用数组来解决上一个问题
#include<stdio.h>
void main(){
/*
一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg, 3.4kg,2kg,50kg 。
请问这六只鸡的总体重是多少?平 均体重是多少? 请你编一个程序。
*/
//定义数组
double hern[6];
int i,arrLen;
double totalWeight = 0.0;
double avgWeight = 0.0;
//初始化数组的每一个元素
hern[0] = 3;
hern[1] = 5;
hern[2] = 1;
hern[3] = 3.4;
hern[4] = 2;
hern[5] = 50;
//数组长度
arrLen = sizeof(hern) / sizeof(double);
// sizeof(hern) 数组的总的大小
// 6 * 8 = 48 有6个数组,每个数组都是double类型,占8个字节。
// sizeof(double) 返回 一个 double 占用的字节数
//printf("sizeof(hens)=%d", sizeof(hens));
for(i = 0; i < arrLen; i++) {
totalWeight += hern[i]; // 累计每只鸡体重
}
avgWeight = totalWeight / 6;
printf("总体重 totalWeight=%.2f 平均体重 avgWeight=%.2f", totalWeight, avgWeight);
}
数组定义和内存布局
数组的定义
数据类型 数组名 [数组大小]; 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 i;
double arrLen = sizeof(arr) / sizeof(double);
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 ", i, arr[i]);
}
}
3 种初始化数组的方式:
方式一:
double hern[6];
//初始化数组的每一个元素
hern[0] = 3;
hern[1] = 5;
hern[2] = 1;
hern[3] = 3.4;
hern[4] = 2;
hern[5] = 50;
方式二:
//定义数组和初始化数组的方式
int arr2[3] = {10, 20, 80};
方式三:
//如果在定义时,直接就指定值,可以省略数组大小
int arr3[] = {110, 220, 800};
数组使用注意事项和细节
1)数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的, 不能动态变化。
2)数组创建后,如果没有赋值,则遵守如下规则 全局数组默认值 0 非全局数组初值是机器垃圾值(即:原来系统分配给这块空间的值)
3)使用数组的步骤 1. 定义数组 2 给数组各个元素赋值 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;
}
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 ", i , arr[i]); // 4,4,5
}
}
数组应用案例
创建一个 char 类型的 26 个元素的数组,分别 放置’A’-'Z‘。使用 for 循环访问所有元素并打印出来。提示:字符数据运算 ‘A’+1 -> 'B
#include<stdio.h>
/*
创建一个 char 类型的 26 个元素的数组,分别 放置'A'-'Z‘。
使用 for 循环访问所有元素并打印出来。提示:字符数据运算 'A'+1 -> 'B'
*/
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]);
}
}
请求出一个数组的最大值,并得到对应的下标。
#include<stdio.h>
/*
1,请求出一个数组的最大值,并得到对应的下标 分析1. 定义数组 大小 5
2,假定 max = arr[0] 就是最大值,然后我们依次和数组后面的数进行比较,
如果发现比 有比 max 更大数,就相应的变化(把更大数赋给 max),
当我们遍历完整个数组,max 就是最大数
*/
void main() {
int arr[] = {1,55,22,66,44,256,1456,2599,2467,3487,32115,68721,871,8454,8668,7687,6};
int i;
int max = arr[0];
//定义数组长度
int arrLen = sizeof(arr) / sizeof(int);
//定义数组索引
int maxIndex = 0;
for(i = 0; i<arrLen; i++) {
if(arr[i] > max){
max = arr[i];
maxIndex = i;
}
}
printf("max=%d maxIndex=%d", max, maxIndex);
}