C语言基础(10)-数组

时间:2021-08-12 09:39:50

一.数组的定义

数组就是在内存中连续的相同类型的变量空间。

二.数组在内存中的存储方式

同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中首元素的地址。

三.数组的初始化

3.1 一维数组初始化

int a[] = { , ,  };
int a[] = { };
int a[] = {,,,,,,,,,};
int a[] = {,,,,,,,,,}; // 此写法与上面的写法是等价的

注意:

在C语言中,数组未初始化就使用是极其危险的,系统会为数组中的每一个元素指定一个随机的值,因此在使用数组之前最好先初始化。

练习1:将指定数组反转

定义下列数组

int a[10] = {0,1,2,3,4,5,6,7,8,9};

将该数组中的元素进行反转(最大值在前,最小值在后)。

#include <stdio.h>

void main() {

    int a[] = {,,,,,,,,,};

    // int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for (int i = ; i < ;i++) {

        printf("a[%d]=%d\n",i,a[i]);
} printf("------------------ 将数组反转 ------------------\n"); int min = ; // 记录当前数组的最小下标
int max = ; // 记录当前数组的最大下标 while (min < max) {
int tmp = a[min]; // 记录当前较小下标的值
a[min] = a[max]; // 将较大下标值赋值给较小下标的值
a[max] = tmp; // 将较小下标的值赋值给较大下标的值
min++;
max--;
} for (int i = ; i < ; i++) {
printf("a[%d]=%d\n",i,a[i]);
} system("pause"); }

运行结果:

C语言基础(10)-数组

 练习2:遍历数组

上面的遍历方式虽然可以使用,但是相对死板,假如数组a变为了:

int a[] = {,,,,,,,,,9,10,11,12};

则for循环中i的值也应做相应的修改。推荐写法:

void main() {

    int a[] = { , , , , , , , , , 9,10,11 };

    for (int i = ; i < sizeof(a) / sizeof(int); i++) { // int 类型占4个字节,sizeof(a)一共占40个字节,求得一共有10个元素
printf("a[%d]=%d\n",i,a[i]);
} system("pause");
}

可以利用sizeof来妥善解决上面的问题。

练习3:求一个数组中的最大值和最小值的下标

已知一个数组为

int a[] = {,,,,,,,,,,,,};

求其最大值和最小值的下标

void main() {

    // 找出该数组中最大值和最小值元素的下标
int a[] = {,,,,,,,,,,,,};
int min = a[]; // 最小值
int max = a[]; // 最大值
int min_loc = ; // 最小值下标
int max_loc = ; // 最大值下标 for (int i = ; 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\n",max,min);
printf("最大值的下标为:%d,最小值的下标为%d\n",max_loc,min_loc); system("pause"); }

C语言基础(10)-数组

练习4:查找数组中大于平均值的元素

已知一个数组为:

int a[] = { , , , , , , , , , , , ,};

查找该数组中大于平均值的元素

void main() {

    /* 查找数组中大于平均值的元素 */
int a[] = { , , , , , , , , , , , ,}; int num = sizeof(a) / sizeof(int); // 计算当前元素个数
int total = ; // 计算当前元素总和
for (int i = ; i < num; i++) {
total += a[i];
}
int avg = total / num; // 计算当前数组平均值
for (int i = ; i < num; i++) {
if (a[i] > avg) {
printf("%d\n",a[i]);
}
}
system("pause"); }

执行结果:

C语言基础(10)-数组

四.二维数组的定义及初始化

// 二维数组的定义
int a[][] = { {,,,}, {,,,}, {,,,} };
// 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[][] = { {,,,}, {,,,}, {,,,} };
// 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[]); // 一维数组元素个数
int num_2 = sizeof(a[]) / sizeof(a[][]); // 二维数组元素个数 for (int i = ; i < num_1; i++) { for (int j = ; j < num_2; j++) {
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
}
printf("\n");
} system("pause");
}

执行结果:

C语言基础(10)-数组