大家好!今天我们要聊的是编程中的“数据仓库”——数组。掌握了数组,你就能轻松应对大量数据的处理,再也不用一个一个变量地存储信息了!
那么数组是什么呢?举个简单的例子:数组就像一个货架,上面摆放了很多相同类型的“商品”,我们只要根据“编号”(下标)就能找到这些商品。
再想象一下,你要存储班级里每个同学的成绩,难道是一个个创建变量吗?10个可以,100个呢?10000个呢?再多呢?这时候数组就派上用场了。
1. 什么是数组?
数组就是一个可以存放多个相同类型数据的集合。你可以把它想象成一个连续的储物柜,每个格子里都装着一个数据,格子是有编号的(下标),从0开始。
数组的定义
在C语言中,数组的定义语法是这样的:
type_t arr_name[const_n];
type_t
:数组里存放的数据类型,比如int
、char
、float
等。arr_name
:数组的名字,咱们可以随意起名(别和C语言保留字冲突就行)。const_n
:数组的大小,注意这个数必须是常量,也就是事先固定的,不是动态变化的。接下来我们来创建一个简单的数组
#include <stdio.h>
int main() {
int scores[5]; // 创建一个包含5个整数的数组
return 0;
}
这里我们创建了一个名为 scores
的数组,它可以存放5个整数。
2. 数组的初始化
如果我们不想让数组里装的都是“空格子”,可以在创建数组的时候直接给每个格子“装货”(初始化)。这就好像在开超市的时候,货架上先摆上几箱矿泉水,供大家取用。
完全初始化
你可以全部摆上,直接上代码!
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5}; // 初始化数组
return 0;
}
int numbers[5] = {1, 2, 3, 4, 5};
:这里我们创建了一个数组,并且直接给它的5个格子分别装上了1到5的数。
不完全初始化
也可以只初始化部分元素,剩下的格子自动装上0(免费赠送!)。
#include <stdio.h>
int main() {
int numbers[5] = {1, 2}; // 只给前两个格子赋值,其他自动填充0
return 0;
}
数组的前两个格子装上了1和2,其余的自动补上0。这对于大数组特别方便,不用一个一个写0。
3. 一维数组的使用
数组的强大之处就在于你可以通过下标轻松访问每个元素。下标就像钥匙,通过它可以打开数组里的任何一个格子。我们来写个简单的场景代码:用数组存储学生的成绩。
#include <stdio.h>
int main() {
int scores[5] = {80, 90, 75, 85, 95}; // 5个学生的成绩
// 使用下标访问数组元素
printf("第一个学生的成绩是:%d\n", scores[0]);
printf("最后一个学生的成绩是:%d\n", scores[4]);
return 0;
}
什么意思呢?我们一个个来看~
scores[0]
:下标为0的元素就是第一个学生的成绩,结果是80。
scores[4]
:下标为4的元素是第五个学生的成绩,结果是95。
注意:C语言的数组下标是从0开始的,一定记住!别忘了!
数组的注意事项
- 下标越界:千万不要访问不存在的格子!如果你试图访问
scores[5]
,程序可能会崩溃,因为我们只给数组分配了5个格子。
4. 数组在内存中的存储
C语言中,数组是连续存储的,意思就是数组的每个元素在内存里是紧挨着的。我们可以打印数组元素的地址来验证这一点。
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("numbers[%d] 的地址是:%p\n", i, &numbers[i]);
}
return 0;
}
&numbers[i]
:&
是取地址符号,&numbers[i]
就是获取 numbers
数组中第 i
个元素的内存地址。
从打印的结果中你可以看到,数组元素的地址是依次递增的,表明数组在内存中是连续存储的。
5. 数组作为函数参数
在C语言中,数组可以作为参数传递给函数。不过要注意,当你将数组作为参数传递时,传递的其实是数组的首元素地址,而不是整个数组。也就是说,函数无法直接获取数组的大小。
#include <stdio.h>
// 定义一个计算数组元素和的函数
int sum(int arr[], int size) {
int total = 0;
for (int i = 0; i < size; i++) {
total += arr[i];
}
return total;
}
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
int result = sum(numbers, 5); // 将数组和大小传递给函数
printf("数组元素的总和是:%d\n", result);
return 0;
}
int sum(int arr[], int size)
:这个函数接收一个数组和数组的大小 size
,通过循环遍历数组,计算所有元素的总和。
sum(numbers, 5)
:在调用 sum
函数时,我们传递了数组 numbers
的首元素地址,以及数组的大小。
这里有个很重要的点:总结一下就是,数组名表示数组首元素的地址。
6. 二维数组:当货架升级为货仓
如果你想管理更复杂的数据,比如一个3x4的矩阵,那就得用到二维数组了!二维数组是一个“数组的数组”,非常适合用来表示表格数据。
#include <stdio.h>
int main() {
int matrix[3][4] = { // 创建一个3行4列的二维数组
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 输出二维数组的元素
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n"); // 每输出一行后换行
}
return 0;
}
matrix[3][4]
:这是一个3行4列的二维数组,其中每一行都是一个一维数组。
通过两个嵌套的 for
循环,我们可以访问每一行、每一列的元素,并将其输出。
当然,有同学就会问有二维数组,会不会有三维呢,有三维会不会有四维呢?有,但是这些在我们日常工作中几乎不会出现,但是如果有同学好奇的话可以评论区留言,人数多的话我会满足大家的好奇心哦~
7. 总结
最后我们总结一下:通过这篇文章,我们从一维数组到二维数组,循序渐进地讲解了数组的概念、创建、初始化以及它在内存中的存储方式。数组是C语言中非常基础的结构,它能帮助你轻松管理大量数据,让代码更加简洁高效。
接下来,你可以尝试自己编写一些小程序来巩固今天学到的知识。比如,试试用二维数组来存储班级里每个同学的成绩,再计算出每个同学的平均分。动手才能更好地掌握这些知识哦!
记得给自己多点耐心,编程就是不断试错和总结的过程,祝你编程之旅顺利,越来越6!
最后,大家觉得有收获的话记得点个赞哦~~~你们的支持是我持续更新的动力~