跳到主要内容 C++ 入门:一维数组基础与实战 | 极客日志
C++ 算法
C++ 入门:一维数组基础与实战 介绍 C++ 一维数组的概念、定义与初始化语法,讲解下标访问规则及内存连续存储特性。通过 sizeof 计算数组长度,并包含数组逆置、元素翻倍、二分查找及冒泡排序等实战练习,帮助初学者掌握数组核心用法。
黑客 发布于 2026/3/21 更新于 2026/4/18 2 浏览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 };
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,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
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
下标是从 0 开始的
数组长度是 10,最后一个数据的下标是 9
数据 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 (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}
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 到位了。
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 ;
}
}
for (int i = 0 ; i < len; i++)
{
printf ("%d " , arr[i]);
}
printf ("\n" );
return 0 ;
}