[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
相关推荐
一晌小贪欢23 分钟前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚1 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·1 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
旖旎夜光2 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青4 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
旖旎夜光5 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
apcipot_rain6 小时前
C++转Java日记(05)
java·开发语言·c++
apcipot_rain15 小时前
C++转Java日记(04)
java·开发语言·c++