C语言,数组

为什么需要数组

一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg, 3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请你编一个程序。

传统解决:

  1. 定义 6 个 double 变量
  2. 统计他们和,并求出平均值
  3. 传统的方案,不灵活,不能够完成数量大的需求
  4. 引出数组

数组介绍

数组可以存放多个同一类型数据。数组也是一种数据类型,是构造类型。传递是以引用的方式传递(即传递的 是地址)。

数组快速入门

比如,我们可以用数组来解决上一个问题

#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);

}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值