c入门第十一篇——物以类聚(数组)

我:"师弟,看你在发呆,怎么了?"

师弟:"师兄,我喜欢的那个女生给我出了一道题。题目是输入班上学生的成绩,并对学生成绩排序,我在想怎么做。"

我:"哦?这个女生有意思。你觉得难点是什么呢?"

师弟:"我觉得有2个地方需要解决,一个是成绩的存储,另一个是成绩的排序。"

数组

何为数组?数组是一种数据结构,可以存储一组具有相同数据类型的元素。

数组中的每个元素都可以通过其索引(或位置)来访问,索引通常是从0开始的整数。

如师弟所困惑的学生成绩存储,就可以用一个int型的一维数组来存储(为了简单,假设所有学生成绩都是整型的)。

定义为: int student[64]; //假设1个班上的学生不到64个

那如何给数组赋值呢?直接通过索引来赋值。比如1号学生 student[0] = 90, 2号学生 student[1] = 90,以此类推,完成赋值。具体实现代码如下:

c 复制代码
#include <stdio.h>

int main()
{
    int student[64], i = 0, j;

    printf("please input grade for student, -1 is the end!\n");
    while (1) {
        scanf("%d", &student[i]);
        if (student[i] == -1) {
            break;
        }

        i++; //i作为索引去访问数组,当读取1个成绩,并赋给数组的一个元素,i就加1
    }

    for(j=0; j<i; j++) { //通过索引访问数组
        printf("%d ", student[j]); //输出学生成绩,检查输入是否符合预期
    }

    return 0;
}

当然,上面的写法很死,最多只支持64个学生,如果想支持更多的学生怎么办?可以根据学生数,动态申请内存,支持动态的数组大小,这个时候指针就发挥作用了。

c 复制代码
#include <stdio.h>
#include <stdlib.h> //支持malloc函数的使用

int main()
{
    int stu_num, *student, i;
    printf("please input the num of students:\n");
    scanf("%d", &stu_num);

    student = malloc(stu_num * sizeof(int)); //malloc动态申请内存大小
    if (student == NULL) {
        printf("malloc student failed!\n");
        return -1;
    }

    printf("please input grade for student, total %d:\n", stu_num);
    for (i=0; i<stu_num; i++) {
        scanf("%d", &student[i]);
    }

    for(i=0; i<stu_num; i++) {
        printf("%d ", student[i]); //通过索引打印
    }

    printf("\n");

    for(i=0; i<stu_num; i++) {
        printf("%d ", *(student + i)); //通过基地址偏移打印
    }
    printf("\n");

    return 0;
}

这里先总结一下数组的特点:
1. 固定大小 :数组在声明时其大小必须是固定的。
2. 连续内存:数组的元素在内存中连续存储。这意味着数组中第一个元素的内存地址是基地址(可以通过数组名获取基地址),后面每个元素的地址都是基地址加上其偏移量,如下所示。

c 复制代码
    for(i=0; i<stu_num; i++) {
        printf("%d ", *(student + i)); //通过基地址偏移打印
    }

3. 数组名和索引访问元素:可以通过数组名称和索引来访问数组中的任何元素。

c 复制代码
    for(i=0; i<stu_num; i++) {
        printf("%d ", student[i]); //通过索引打印
    }

4. 初始化 :在声明数组时,可以同时初始化数组中的元素。例如 int student[5] = {1, 2, 3, 4, 5};。
5. 类型 :所有数组中的元素都必须是同一数据类型。如果你声明了一个整数数组,那么你只能在这个数组中存储整数。
6. 索引越界:C语言不检查数组索引的边界,如果你尝试访问超出其定义大小的数组元素,你可能会访问到临近内存地址的数据,这可能导致数据损坏或程序崩溃,因此程序员必须确保他们不会越界。

在编程中,情况下会使用数组呢?

1. 处理数据集合 :当需要储存和操作一组具有相同数据类型的元素时,数组是一个良好的选择。比如,储存一组学生的成绩、一列商品的价格等。
2. 固定大小的数据结构 :当你在程序中需要一个固定大小的集合时,数组很有用。如果你知道需要存储的元素的数量,就可以直接使用数组。
3. 缓冲区或临时存储:在进行文件处理或网络通信时,数组常被用作缓冲区,临时保存数据块,直到数据被处理完毕。

数组因为在内存上是连续的,它的性能比较好。但是它也存在缺点,就是长度是固定的,在动态插入和删除元素时不够灵活,这种就需要链表来支持了,这个自然是后话。

这里也只是简单介绍了一维数组的使用,数组可以支持二位数组,三维数组或者更高维的数组,不过原理基本类似。当后面用到的时候,再逐步展开详述。

相关推荐
星空下的曙光1 分钟前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
Algo-hx1 分钟前
数据结构入门 (七):从“链接”到“分支” —— 初探树与二叉树
数据结构
qq_49244844633 分钟前
Jmeter设置负载阶梯式压测场景(详解教程)
开发语言·python·jmeter
小贾要学习1 小时前
【数据结构】C++实现红黑树
数据结构·c++
ID_180079054731 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
StarPrayers.2 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
qiuiuiu4132 小时前
正点原子RK3568学习日志-编译第一个驱动程序helloworld
linux·c语言·开发语言·单片机
爱吃橘的橘猫2 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式
235162 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
molong9312 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin