c语言的数组
1、 数组的基本概念
一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
1. 什么是数组
数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的
2. 数组的特点
● 只能存放一种类型的数据,比如int类型的数组、float类型的数组
● 里面存放的数据称为“元素”
2、 数组的定义
1. 定义
● 声明数组的类型
● 声明数组的元素个数(需要多少存储空间)
2. 格式
元素类型 数组名[元素个数];
比如:int ages[3];
3. 简单使用
● 简单初始化:int ages[5] = {19, 19, 20, 21, 25};
● 元素有顺序之分,每个元素都有一个唯一的下标(索引),从0开始
● 数组元素的访问:a[i]
4. 初始化
● 初始化方式
◆ int a[3] = {10, 9, 6};
◆ int a[3] = {10,9};
◆ int a[] = {11, 7, 6};
◆ int a[4] = {[1]=11,[0] = 7};
● 常见错误
◆ int a[];
◆ int[4] a;
◆ int a[b];
◆ a = {10, 11};
◆ a[4] = {10,9,8,5};
// 错误写法
/* 只能在定义数组的同时进行初始化
int ages[5];
ages = {10, 11, 12, 14};
*/
// 正确写法
// int ages['A'-50] = {10, 11, 12, 14, 16};
//int size = sizeof(ages);
//printf("%d\n", size);
// 正确写法
/*
int count = 5;
int ages[count];
ages[0] = 10;
ages[1] = 11;
ages[2] = 18;
*/
// 错误写法
// 如果想再定义数组的同事进行初始化,数组元素个数必须是常量,或者不写
//int ages[count] = {10, 11, 12};
5. 内存分析
● 数组存储空间的大小
● 存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)
● 数组名的作用,查看元素地址
● 数组越界的注意
6. 其他使用
● 数组与函数参数
◆ 数组元素作为函数参数
◆ 数组作为函数参数(sizeof注意)
● 遍历数组元素:
遍历:按顺序查看数组的每一个元素
◆ 两种方式遍历(while循环和for循环)
◆ 遍历元素值和元素地址
1 #include <stdio.h> 2 int main() 3 { 4 int ages[] = {10, 11, 12, 78}; 5 6 // 计算数组元素的个数 7 int count = sizeof(ages)/sizeof(int); 8 9 for (int i = 0; i<count; i++) 10 { 11 printf("ages[%d]=%d\n", i, ages[i]); 12 } 13 14 return 0; 15 }
◆ 字符数组的使用
7. 习题
1> 提示输入5个学生的成绩,算出平均分(最高分、最低分),然后输出
1 #include <stdio.h> 2 int main() 3 { 4 // 1.定义一个数组来存储成绩 5 int scores[5]; 6 7 // 2.提示输入成绩 8 // 用来存储总分 9 int sum = 0; 10 for (int i = 0; i<5; i++) { 11 // 2.1 提示输入某个学生的成绩 12 printf("请输入第%d个学生的成绩:\n", i + 1); 13 // 2.2 存储当前学生的成绩 14 scanf("%d", &scores[i]); 15 // 2.3 累加成绩 16 sum += scores[i]; 17 } 18 19 // 3.计算平均分,并且输出 20 printf("平均分是%f\n", sum/5.0); 21 return 0; 22 }
1 #include <stdio.h> 2 3 int arrayMax(int a[], int count) 4 { // 数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节 5 6 //int size = sizeof(a); 7 //printf("a=%d\n", size); 8 9 //sizeof(a); 10 11 // 1.定义一个变量存储最大值(默认就是首元素) 12 int max = a[0]; 13 14 // 2.遍历所有元素,找出最大值 15 for (int i = 1; i<count; i++) 16 { 17 // 如果当前元素大于max,就用当前元素覆盖max 18 if (a[i] > max) 19 { 20 max = a[i]; 21 } 22 } 23 24 return max; 25 } 26 27 int main() 28 { 29 int ages[] = {11, 90, 67, 151, 78, 60, 70, 89, 100}; 30 31 int ages2[] = {11, 90, 67, 150, 78, 60, 70, 89, 100}; 32 33 //int size = sizeof(ages); 34 35 //printf("ages=%d\n", size); 36 int max = arrayMax(ages, sizeof(ages)/sizeof(int)); 37 38 printf("%d\n", max); 39 return 0; 40 }
3> 设计一个函数:int arraySum(int a[], int n),求一维数组a前n个数的和
4> 设计一个函数:将一维整型数组中的元素逆序存放。比如本来是1,3,4,2,逆序存放就变成了:2,4,3,1
3、 二维数组
1. 什么是二维数组
● 一个数组能表示一个班人的年龄,如果想表示很多班呢?
● 什么是二维数组?int ages[3][10]; 三个班,每个班10个人
● 相当于3行10列
● 相当于装着3个一维数组
● 二维数组是一个特殊的一维数组:它的元素是一维数组。例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素
2. 存储
● 存储大小
● 存储结构和顺序
● 存储地址问题
3. 初始化
● int a[3][4] = {1,2,3,4,5,6};
● int a[3][4] = {{},{},{}};
● 数组元素简单访问
● int a[][5] = {3,21,31,2,32,1};
● 注意错误:
int a[3][4];
a[3] = {};
4. 遍历
● 遍历所有的元素
● 遍历地址
● 使用场合:五子棋、俄罗斯方块