一维数组概念
一维数组用来存放一组同类型数据,在内存中是一块连续的空间
数组创建
语法:
type arr_name[常量值];
1)type:数组元素类型,char/short/int/float等
2)arr_name:数组名,自定义
3)[]内必须是常量 ,代表数组大小
4)可以用const int N = 100;定义常量,再写int arr[N];
int math[20]; // const int N = 20; int math1[N]; char ch[8]; double score[10];数组初始化
用大括号
{}给数组赋初始值
//完全初始化,数据依次填入数组 int arr1[5] = { 1,2,3,4,5 }; //不完全初始化,第一个元素是1,剩下自动补0 int arr2[6] = { 1 }; // 错误,初始化元素数量超过数组大小 int arr3[3] = { 1,2,3,4,5,6 }; //编译报错
数组元素访问
数组下标从 0 开始
如果数组有n个元素,下标范围:0 ~ n-1
使用数组名下标访问元素,\[\]叫下标引用操作符
越界访问:下标小于 0 或者 >= 数组长度,编译不会报错,但运行时会出错
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << arr[7] << endl; //8 cout << arr[3] << endl; //4
数组和 sizeof
sizeof(数组名):得到数组总字节大小
sizeof(数组名)/sizeof(数组0):计算数组元素个数
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << sizeof(arr) << endl; // int占4个字节,10个元素=40个字节 cout << sizeof(arr) / sizeof(int) << endl; // // 总的字节数除以一个元素的字节数等于元素个数 40/4=10
循环打印全部数组元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //循环遍历所有下标 for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { cout << arr[i] << " "; } cout << endl; //1 2 3 4 5 6 7 8 9 10
范围 for(C++11)
遍历数组更简便的写法,自动获取数组每个元素,不用管理下标
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //范围 for for (auto x : arr) { cout << x << " "; } cout << endl; //1 2 3 4 5 6 7 8 9 10
总结
- 数组内存连续,下标从 0 开始
- 定义数组方括号内必须是常量
- 不完全初始化,未赋值元素默认是 0
- 不能越界访问数组
sizeof(arr)/sizeof(arr[0])求数组长度- 遍历数组两种方式:普通 for 循环(按下标)、范围 for 循环
一维数组进阶
知识点:范围 for、auto、memset、memcpy
范围 for(C++11 新特性)
作用:自动遍历数组全部元素 ,无需手动管理下标,代码更加简洁。
只能从头到尾完整遍历,无法只遍历其中一部分。
需要编译器开启 C++11 支持。
语法
for(类型 变量名 : 数组名) { //语句;多条语句加大括号 }
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //范围 for for (auto e : arr) { cout << e << " "; } cout << endl; //1 2 3 4 5 6 7 8 9 101)注意:这里的 e 是数组元素的副本,修改 e 不会改变原数组。
auto 关键字
- auto:让编译器自动推导变量类型,无需手动指定类型。
auto a = 3.14; auto b = 100; auto c = 'x'; cout << typeid(a).name() << endl; //double cout << typeid(b).name() << endl; //int cout << typeid(c).name() << endl; //char1)需要头文件 <typeinfo>。
memset 设置数组内容
头文件:#include <cstring>
函数原型:
void * memset ( void * ptr, int value, size_t num );参数说明:
1)ptr:要设置的内存起始地址
2)value:要填充的值(按字节填充)
3)num:一共填充多少个字节
char str[] = "hello world"; memset(str, 'x', 6); cout << str << endl; //xxxxxxworld cout << "-------------------" << endl; int arr[] = { 1,2,3,4,5,6 }; memset(arr, 0, sizeof(arr)); //全部置0 for (auto e : arr) { cout << e << " "; } cout << endl; //0 0 0 0 0 0
memset 适合 :char 数组、int 数组清 0、置 - 1
不适合给 int 数组赋值普通正数错误用法:想用 memset 把 int 数组全部设为 1
错误用法:想用 memset 把 int 数组全部设为 1原理:memset 是逐字节赋值
int 占 4 字节,每个字节写 0x01,最终一个 int 值变成
0x01010101,十进制是 16843009,不是 1!
memcpy 拷贝数组内容
头文件:#include <cstring>
作用:内存拷贝,把一块内存原样复制到另一块内存
不能直接写 b = a; 拷贝数组!数组名不能直接赋值函数原型:
void * memcpy ( void * destination, const void * source, size_t num );参数说明:
1)destination:目标内存起始地址
2)source:源内存起始地址
3)num:拷贝多少字节
int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int b[10] = { 0 }; memcpy(b, a, sizeof(a)); for (auto e : b) { cout << e << " "; } cout << endl; //1,2,3,4,5,6,7,8,9,10a)注意:拷贝字节数,要匹配数组类型,double 数组就用sizeof(double)计算
总结
- 易错点:
1)数组不能直接b=a复制;要用 memcpy 或者循环逐个赋值
2)memset 是字节级别操作 ,这是竞赛高频坑点
3)范围 for 不能只遍历数组前 n 个元素,这种场景要用普通 for
[c++]数组
Yyyyyy~2026-09-29 13:51
相关推荐
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)2601_962218611 小时前
c++中多重继承与虚继承的实现沫璃染墨1 小时前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》2601_962218612 小时前
C++中分配器allocator的实现单片机设计·······2 小时前
【dz-1162】汽车前玻璃雨刮器设计AI智讯中枢3 小时前
高性能 C++ 实战 (五):perf+FlameGraph 火焰图生产实战,精准定位 CPU / 缓存 / 锁瓶颈,避坑 + 完整实操案例繁华的地方不一定留下你的脚印3 小时前
C++ 算法与 ranges:用 find_if、transform 写清数据处理意图张小姐的猫3 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展AC赳赳老秦3 小时前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度