一.数组的定义
数组就是在内存中连续的相同类型的变量空间。
二.数组在内存中的存储方式
同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中首元素的地址。
三.数组的初始化
3.1 一维数组初始化
int a[10] = { 1, 2, 3 }; int a[10] = { 0 }; int a[10] = {1,2,3,4,5,6,7,8,9,10}; int a[] = {1,2,3,4,5,6,7,8,9,10}; // 此写法与上面的写法是等价的
注意:
在C语言中,数组未初始化就使用是极其危险的,系统会为数组中的每一个元素指定一个随机的值,因此在使用数组之前最好先初始化。
练习1:将指定数组反转
定义下列数组
int a[10] = {0,1,2,3,4,5,6,7,8,9};
将该数组中的元素进行反转(最大值在前,最小值在后)。
#include <stdio.h> void main() { int a[10] = {0,1,2,3,4,5,6,7,8,9}; // int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for (int i = 0; i < 10;i++) { printf("a[%d]=%d ",i,a[i]); } printf("------------------ 将数组反转 ------------------ "); int min = 0; // 记录当前数组的最小下标 int max = 9; // 记录当前数组的最大下标 while (min < max) { int tmp = a[min]; // 记录当前较小下标的值 a[min] = a[max]; // 将较大下标值赋值给较小下标的值 a[max] = tmp; // 将较小下标的值赋值给较大下标的值 min++; max--; } for (int i = 0; i < 10; i++) { printf("a[%d]=%d ",i,a[i]); } system("pause"); }
运行结果:
练习2:遍历数组
上面的遍历方式虽然可以使用,但是相对死板,假如数组a变为了:
int a[10] = {0,1,2,3,4,5,6,7,8,9,10,11,12};
则for循环中i的值也应做相应的修改。推荐写法:
void main() { int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 }; for (int i = 0; i < sizeof(a) / sizeof(int); i++) { // int 类型占4个字节,sizeof(a)一共占40个字节,求得一共有10个元素 printf("a[%d]=%d ",i,a[i]); } system("pause"); }
可以利用sizeof来妥善解决上面的问题。
练习3:求一个数组中的最大值和最小值的下标
已知一个数组为
int a[] = {32,232,324,121,434,4343,34,2121,10,5,686866,4,77777777};
求其最大值和最小值的下标
void main() { // 找出该数组中最大值和最小值元素的下标 int a[] = {32,232,324,121,434,4343,34,2121,10,5,686866,4,77777777}; int min = a[0]; // 最小值 int max = a[0]; // 最大值 int min_loc = 0; // 最小值下标 int max_loc = 0; // 最大值下标 for (int i = 0; i < sizeof(a) / sizeof(int); i++) { if (a[i] > max) { max = a[i]; max_loc = i; } if (a[i] < min) { min = a[i]; min_loc = i; } } printf("最大值:%d,最小值:%d ",max,min); printf("最大值的下标为:%d,最小值的下标为%d ",max_loc,min_loc); system("pause"); }
练习4:查找数组中大于平均值的元素
已知一个数组为:
int a[] = { 32, 232, 324, 121, 434, 4343, 34, 2121, 10, 5, 686, 4,777};
查找该数组中大于平均值的元素
void main() { /* 查找数组中大于平均值的元素 */ int a[] = { 32, 232, 324, 121, 434, 4343, 34, 2121, 10, 5, 686, 4,777}; int num = sizeof(a) / sizeof(int); // 计算当前元素个数 int total = 0; // 计算当前元素总和 for (int i = 0; i < num; i++) { total += a[i]; } int avg = total / num; // 计算当前数组平均值 for (int i = 0; i < num; i++) { if (a[i] > avg) { printf("%d ",a[i]); } } system("pause"); }
执行结果:
四.二维数组的定义及初始化
// 二维数组的定义 int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; // int a[3][4] = { {1,2,3,4}, {5,6,7,8} }; // 正确,只初始化前两个维度 // int a[][4] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 正确 // int a[2][] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 这种写法是不对的 // int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }; 这种写法是不对的
练习1:遍历二维数组
void main() { // 二维数组的定义 int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; // int a[3][4] = { {1,2,3,4}, {5,6,7,8} }; // 正确,只初始化前两个维度 // int a[][4] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 正确 // int a[2][] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 这种写法是不对的 // int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }; 这种写法是不对的 // 遍历当前二维数组 int num_1 = sizeof(a) / sizeof(a[0]); // 一维数组元素个数 int num_2 = sizeof(a[0]) / sizeof(a[0][0]); // 二维数组元素个数 for (int i = 0; i < num_1; i++) { for (int j = 0; j < num_2; j++) { printf("a[%d][%d]=%d ",i,j,a[i][j]); } printf(" "); } system("pause"); }
执行结果: