[c++]数组

一维数组概念


一维数组用来存放一组同类型数据,在内存中是一块连续的空间

数组创建

  • 语法:

    复制代码
    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];

数组初始化

  1. 用大括号{}给数组赋初始值

复制代码
   	//完全初始化,数据依次填入数组
   	int arr1[5] = { 1,2,3,4,5 };

   	//不完全初始化,第一个元素是1,剩下自动补0
   	int arr2[6] = { 1 };

   	// 错误,初始化元素数量超过数组大小
   	int arr3[3] = { 1,2,3,4,5,6 };  //编译报错

数组元素访问

  1. 数组下标从 0 开始

  2. 如果数组有n个元素,下标范围:0 ~ n-1

  3. 使用数组名下标访问元素,\[\]叫下标引用操作符

  4. 越界访问:下标小于 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

  1. sizeof(数组名):得到数组总字节大小

  2. 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
  1. 循环打印全部数组元素

    复制代码
    	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)

  1. 遍历数组更简便的写法,自动获取数组每个元素,不用管理下标

复制代码
   	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 新特性)

  1. 作用:自动遍历数组全部元素 ,无需手动管理下标,代码更加简洁。

    只能从头到尾完整遍历,无法只遍历其中一部分。

  2. 需要编译器开启 C++11 支持。

  3. 语法

    复制代码
    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 10

1)注意:这里的 e 是数组元素的副本,修改 e 不会改变原数组。


auto 关键字
  1. 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;   //char

1)需要头文件 <typeinfo>。


memset 设置数组内容

  1. 头文件:#include <cstring>

  2. 函数原型:

    复制代码
    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 
  1. memset 适合 :char 数组、int 数组清 0、置 - 1
    不适合给 int 数组赋值普通正数

  2. 错误用法:想用 memset 把 int 数组全部设为 1

    复制代码
    错误用法:想用 memset 把 int 数组全部设为 1

    原理:memset 是逐字节赋值

    int 占 4 字节,每个字节写 0x01,最终一个 int 值变成0x01010101,

    十进制是 16843009,不是 1!


memcpy 拷贝数组内容

  1. 头文件:#include <cstring>

  2. 作用:内存拷贝,把一块内存原样复制到另一块内存
    不能直接写 b = a; 拷贝数组!数组名不能直接赋值

  3. 函数原型:

    复制代码
    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,10

a)注意:拷贝字节数,要匹配数组类型,double 数组就用sizeof(double)计算


总结

  1. 易错点:
    1)数组不能直接b=a复制;要用 memcpy 或者循环逐个赋值
    2)memset 是字节级别操作 ,这是竞赛高频坑点
    3)范围 for 不能只遍历数组前 n 个元素,这种场景要用普通 for
相关推荐
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
2601_962218611 小时前
c++中多重继承与虚继承的实现
开发语言·c++
沫璃染墨1 小时前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
2601_962218612 小时前
C++中分配器allocator的实现
开发语言·c++
单片机设计·······2 小时前
【dz-1162】汽车前玻璃雨刮器设计
c++·单片机·嵌入式硬件
AI智讯中枢3 小时前
高性能 C++ 实战 (五):perf+FlameGraph 火焰图生产实战,精准定位 CPU / 缓存 / 锁瓶颈,避坑 + 完整实操案例
linux·c++·性能调优·性能分析·perf·flamegraph·火焰图
繁华的地方不一定留下你的脚印3 小时前
C++ 算法与 ranges:用 find_if、transform 写清数据处理意图
开发语言·c++·算法
张小姐的猫3 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
AC赳赳老秦3 小时前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw