跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 入门:一维数组基础与实战

介绍 C++ 一维数组的概念、定义与初始化语法,讲解下标访问规则及内存连续存储特性。通过 sizeof 计算数组长度,并包含数组逆置、元素翻倍、二分查找及冒泡排序等实战练习,帮助初学者掌握数组核心用法。

黑客发布于 2026/3/21更新于 2026/10/23131 浏览
C++ 入门:一维数组基础与实战

1. 一维数组概念

数组的定义

数组:是相同类型元素的一个集合。在内存中是一段连续的空间。

可以将 C/C++ 中的一维数组通俗地理解为'一排储物柜'。每个储物柜(数组元素)可以存放一件物品(数据),且所有储物柜的格子大小相同(数据类型一致),并通过编号(索引)快速找到对应位置。

2. 一维数组创建和初始化

一维数组创建的基本语法如下:

type arr_name[常量值];

根据该语法我们可以创建出这样的数组:

示例

int arr[5];

表示创建了一个长度为 5 的整型数组。

巧记:数组 arr 是一个有五个格子的存储柜,每个格子都可以存储 int 类型的数据,且每个格子都有四个字节大小。

如何对该数组进行初始化呢?

数组初始化示意图

3. 一维数组使用

3.1 数组下标

数组下标规则

C/C++ 规定数组是有下标的,下标是从 0 开始的。假设数组有 n 个元素,最后一个元素的下标是 n-1。下标就相当于数组元素的编号。

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
数据12345678910
下标012345
6
7
8
9

观察上图我们可以观察到:

  1. 下标是从 0 开始的
  2. 数组长度是 10,最后一个数据的下标是 9
  3. 数据 3 的下标是 2,数据 8 的下标是 7

3.2 通过数组下标访问元素

访问元素的方式为:数组名 [下标]

3.2.1 访问单独数据

访问单独数据

3.2.2 访问数组当中的所有数据

访问所有数据

求数据之和

求和数据

3.2.3 给数组输入元素
#include <stdio.h>

int main() {
    int arr[5];
    int i = 0;
    for (i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

4. 一维数组在内存当中的存储

数组的内存特性

我们知道数组的定义是相同类型元素的一个集合(例如 int 类型不能定义 float 元素)。在内存中是一段连续的空间。

意味着每个元素与每个元素之间内存是连续的。

通过程序打印数组中每个元素的地址:

#include <stdio.h>

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i = 0;
    for (i = 0; i < 10; i++) {
        printf("&arr[%d] = %d\n", i, &arr[i]);
    }
    return 0;
}

输出结果:

&arr[0] = 844954664 &arr[1] = 844954668 &arr[2] = 844954672 &arr[3] = 844954676 &arr[4] = 844954680 &arr[5] = 844954684 &arr[6] = 844954688 &arr[7] = 844954692 &arr[8] = 844954696 &arr[9] = 844954700

观察输出结果我们发现,由于是整型数组,每个元素是 4 个字节,所以地址间隔也是 4,即是一段连续的空间。

5. sizeof 与数组

sizeof 计算数组大小

我们可以通过 sizeof(数组名) 来计算整个数组的字节大小。

#include <stdio.h>

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    printf("%d\n", sizeof(arr));
    return 0;
}

此时输出结果是 40,表示整个数组此时所占内存空间的大小为 40 字节。

我们已知整个数组的字节大小为 40 字节,每个元素的大小为 4 个字节。此时就可以计算出数组的长度。

即如果不知道数组内元素的个数情况下,可以用

sizeof(arr) / sizeof(arr[0])

计算出数组的元素个数。

例如以下代码:

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int len = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

6. 一维数组习题练习

6.1 数组的逆置

把数组当中的元素进行逆置输出。

数组逆置

6.2 数组元素扩大 2 倍

给定指定数组,将原数组当中的每个元素扩大 2 倍,输出最后数组的元素。

元素翻倍

6.3 二分查找

题目:给定一个升序的整型数组,在这个数组中查找到指定的值 n,找到了就打印 n 的下标,找不到就打印:'找不到'。

提示:在一个升序的数组中查找指定的数字 n,很容易想到的方法就是遍历数组,但是这种方法效率比较低。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int len = sizeof(arr) / sizeof(arr[0]);
    int left = 0;
    int right = len - 1;
    int n = 3; // 要找的数
    int mid = -1; // 定义中间值
    int e = 0; // 该值未改变表示最后没有进入 while 循环即一直没有达到 else 情况但已经 left>right
    while (left <= right) // 当 left>=right 时说明要找的数不在数组里
    {
        mid = left + (right - left) / 2; /*求中间元素的下标,使用 mid = (left + right) / 2,如果 left 和 right 值非常大时,它们的和可能会超出整型范围导致溢出。更稳妥的写法是:mid = left + (right - left) / 2;*/
        if (arr[mid] < n)
        {
            left = mid + 1;
        }
        else if (arr[mid] > n)
        {
            right = mid - 1;
        }
        else
        {
            e = 1;
            break;
        }
    }
    if (e == 1)
    {
        printf("找到了,下标是:%d\n", mid);
    }
    else
    {
        printf("没有找到\n");
    }
    return 0;
}

【拓展】因为二分查找需要数组是升序的,若数组是乱序的怎样改成升序的呢?

先用冒泡排序讲解,后面会有排序专题。

冒泡排序就是多趟比较,每一趟都从数组开头往后走:

  • 拿当前数和下一个数比
  • 前面比后面大,就交换
  • 前面比后面小,就不动
  • 每走完一趟,最大的数会沉到最后

例如有一个数组 arr[]={12, 7, 6, 9, 3}

第 1 趟

12 和 7 比 → 交换 → 7, 12, 6, 9, 3 12 和 6 比 → 交换 → 7, 6, 12, 9, 3 12 和 9 比 → 交换 → 7, 6, 9, 12, 3 12 和 3 比 → 交换 → 7, 6, 9, 3, 12 一趟走完,最大的 12 到位了。

第 2 趟

7 和 6 比 → 交换 → 6, 7, 9, 3, 12 7 和 9 比 → 不动 9 和 3 比 → 交换 → 6, 7, 3, 9, 12 二趟走完,第二大的 9 也到位了。

后面几趟同理,每趟确定一个大数的位置,直到整个数组从小到大排好。

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int arr[] = {7, 12, 9, 6, 3};
    int len = sizeof(arr) / sizeof(arr[0]);
    printf("排序之前:\n");
    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    printf("排序之后:\n");
    for (int i = 0; i < len - 1; i++)
    {
        int r = 0; // 假设本趟没有交换
        for (int j = 0; j < len - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int a = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = a;
                r = 1; // 发生交换
            }
        }
        if (r == 0)
        {
            break; /*如果 r=0 说明数组中数据在这一趟中没有发生调换 数组本身就是有序的就不用进行后续循环了*/
        }
    }
    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

目录

  1. 1. 一维数组概念
  2. 数组的定义
  3. 2. 一维数组创建和初始化
  4. 一维数组创建的基本语法如下:
  5. 示例
  6. 3. 一维数组使用
  7. 3.1 数组下标
  8. 数组下标规则
  9. 3.2 通过数组下标访问元素
  10. 3.2.1 访问单独数据
  11. 3.2.2 访问数组当中的所有数据
  12. 求数据之和
  13. 3.2.3 给数组输入元素
  14. 4. 一维数组在内存当中的存储
  15. 数组的内存特性
  16. 5. sizeof 与数组
  17. sizeof 计算数组大小
  18. 6. 一维数组习题练习
  19. 6.1 数组的逆置
  20. 6.2 数组元素扩大 2 倍
  21. 6.3 二分查找

更多推荐文章

查看全部
  • Git 原理与使用进阶:远程协作、标签管理及企业级开发模型
  • Python AI 大模型部署指南:本地运行、API 服务及 Docker 封装
  • 无人机远程身份识别:开源 RemoteID 部署实战
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调实战
  • Java 动态代理核心原理与实战对比
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署与微调实践
  • AI 核心概念解析:Skill、MCP 与 Function Call
  • Java 基础实训:HelloWorld 输出与命令行参数处理
  • 滑动窗口算法详解:高效解决子数组与子串问题
  • OpenVLA 模型微调与机器人平台部署实战
  • 前端国际化最佳实践指南
  • Ubuntu 磁盘空间与分区查看命令整理
  • 高校计算机课程改革:引入 AIGC 实操教学
  • 特斯联获 20 亿融资,聚焦 AI+IoT 与模型系统落地路径
  • 大模型数据建设:工程化视角与策略实践
  • Apache SeaTunnel Web 可视化数据集成平台搭建指南
  • C 语言常用算法与数据结构基础
  • JDK 17 安装与环境配置实战指南
  • 预训练语言模型与 BERT 实战应用
  • Redis String 类型深度解析与 C++ 实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online