NO.21十六届蓝桥杯备战|一维数组|范围for|memset|memcpy(C++)

server/2025/3/6 2:12:33/

数组是⼀组相同类型元素的集合

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
  • 数组中存放的多个数据,类型是相同的
    数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组

一维数组

⼀维数组是最常⻅的,通常⽤来存放⼀组数据,⼀维数组是⼀块连续的空间
![[Pasted image 20250228163202.png]]

数组创建
type arr_name[常量值];

存放在数组的值被称为数组的元素,数组在创建的时候需要指定数组的⼤⼩和数组的元素类型
• type 指定的是数组中存放数据的类型,可以是:char、short、int、float 等,也可以⾃
定义的类型
• arr_name 是数组的名字,这个名字可以⾃定义,根据实际情况,起的有意义就⾏。
[]中的常量值是⽤来指定数组的⼤⼩的,数组的⼤⼩是根据实际的需求指定就⾏。在算法竞赛中为了为了保证不越界访问,往往会多开辟⼀些空间。
• 可以使⽤ const int N = 100 的⽅式定义常量,来指定数组的⼤⼩。

数组的初始化

有时候,数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化

//完全初始化,数据会依次放⼊数组  
int arr[5] = {1,2,3,4,5};  
//不完全初始化  
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0  
//错误的初始化 - 初始化项太多  
int arr3[3] = {1, 2, 3, 4};
数组元素访问

数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1 ,下标就相当于数组元素的编号

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

![[Pasted image 20250228181254.png]]

数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,⽐如我们访问下标为7的元素,我们就可以使⽤ arr[7] ,想要访问下标是3的元素,就可以使⽤ arr[3]

数组元素的打印

想要访问整个数组的内容,只要我们产⽣数组所有元素的下标就可以了,那我们使⽤ for 循环产⽣所有的下标,接下来使⽤下标访问就⾏了

如果产⽣的下标超出了有效下标的范围,⽐如,使⽤负数作为下标,或者超出了下标
的最⼤值,再使⽤这个下标访问元素就会造成:越界访问。越界访问访问的时候,代码编译
时语法没报错,但是运⾏时⼀定会出问题的

数组和sizeof
  • sizeof(数组名) ,计算的是数组的总⼤⼩,单位是字节
  • sizeof(数组名)/sizeof(第⼀个元素) ,计算的是数组的元素个数
数组元素的打印
#include <iostream>  
using namespace std;  int main()  
{  int arr[10] = {1,2,3,4,5,6,7,8,9,10};  int i = 0;  for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)  {  cout << arr[i] << " ";  }  return 0;  
}

![[Pasted image 20250228181549.png]]

范围for

打印数组元素除了可以使⽤之前讲过的三种循环外,还有⼀个更⽅便的⽅式,使⽤范围 for 。范围for是在 C++11 这个标准中引⼊的,如果你使⽤的编译器默认不⽀持 C++11 ,可能需要配置才能使⽤

范围for语法
for ( 类型 变量名 : 数组名 )  语句 //多条语句需要加⼤括号
#include <iostream>  
using namespace std;  int main()  
{  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  for (int e : arr)  {  cout << e << " ";  }  return 0;  
}

上⾯代码中的 for 就是 范围for ,代码的意思是将 arr 数组中的元素,依次放在 e 变量中,然后
打印 e ,直到遍历完整个数组的元素。这⾥的 e 是⼀个单独的变量,不是数组的元素,所以对 e 的修改,不会影响数组。
但是对于范围 for 要慎重使⽤!范围 for 是对数组中所有元素进⾏遍历的,但是实际在做题的过程中,可能只需要遍历数组中指定个数的元素,这样范围 for 就不合适了。

auto关键字

auto 的主要⽤途是让编译器⾃动推导出变量的类型的

#include <iostream>  
using namespace std;  int main()  
{auto a = 3.14;  auto b = 100;  auto c = 'x';  return 0;  
}

![[Pasted image 20250228182030.png]]

#include <iostream>  
using namespace std;  int main()  
{  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  for (auto e : arr)//auto能够⾃动推导数组中每个元素的数据类型,在数组范围内遍历打印元素{  cout << e << " ";  }  return 0;  
}

范围 for 中 e 前⾯的类型可以可以是 auto 关键字,当不知道数组中放什么类型的时候,可以使⽤ auto 作为类型, auto 在范围 for 中很常⽤。如果明确的知道数组元素的数据类型,也可以将auto 换成对应的数据类型

memset设置数组内容
void * memset ( void * ptr, int value, size_t num );
  • ptr – 指针:指向了要设置的内存块的起始位置
  • value – 要设置的值
  • num – 设置的字节个数
    memset 是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容,需要头⽂件<cstring>
#include <iostream>  
#include <cstring>  
using namespace std;  int main ()  
{  char str[] = "hello world";  memset(str, 'x', 6);  cout << str << endl;  int arr[] = {1,2,3,4,5};  memset(arr, 0, sizeof(arr));//这⾥数组的⼤⼩也可以⾃⼰计算  for(auto i : arr)  {  cout << i << " ";}  cout << endl;  return 0;  
}

![[Pasted image 20250228184921.png]]

![[Pasted image 20250228184942.png]]

错误使⽤
#include <iostream>  
using namespace std; int main ()  
{  int arr[] = {1,2,3,4,5};  memset(arr, 1, 4 * sizeof(int));  for(auto e : arr)  {  cout << e << " ";  }  cout << endl;  return 0;  
}

![[Pasted image 20250228201247.png]]

当value设置为1或者其他⾮0的数字时,打印结果不符合预期
主要原因是 memset 函数是给每个字节设置 value 值,⽽⼀个整型元素占⽤4个字节,⼀个整型的每个字节都被设置为1,⼆进制就是: 00000001000000010000000100000001 ,转换成⼗进制就是: 16843009 ,因此结果是不符合预期的。

memcpy拷⻉数组内容

在使⽤数组的时候,有时候我们需要将数组a的内容给数组b
![[Pasted image 20250228201556.png]]

C++中有⼀个库函数 memcpy 可以做数组内容的拷⻉,当然 memcpy 其实是⽤来做内存块的拷⻉的,当然⽤来做数组内容的拷⻉也是没问题的

void * memcpy ( void * destination, const void * source, size_t num );
  • destination – ⽬标空间的起始地址
  • source – 源数据空间的起始地址
  • num – 拷⻉的数据的字节个数
#include <iostream>  
#include <cstring>  
using namespace std;  int main()  
{  int a[10] = {1,2,3,4,5,6,7,8,9,10};  int b[10] = {0};  memcpy(b, a, 10 * sizeof(int));  for(int e: b)  {  cout << e << " ";  }  return 0;  
}

当然如果拷⻉ double 类型的数组时,计算时应该使⽤ sizeof(double) ,要灵活变化


http://www.ppmy.cn/server/171891.html

相关文章

Template Method 设计模式

模板方法模式&#xff08;Template Method Pattern&#xff09; 是一种 行为型设计模式&#xff0c;用于定义 算法的骨架&#xff0c;并允许子类在不改变算法结构的情况下 重新定义 其中的某些步骤。 核心思想&#xff1a; 在 基类 中定义 算法的整体流程&#xff08;骨架&am…

Lua的table(表)

Lua表的基本概念 Lua中的表&#xff08;table&#xff09;是一种多功能数据结构&#xff0c;可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制&#xff0c;其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成&#xff1a; 数组部分…

塔能科技:工厂智慧照明,从底层科技实现照明系统的智能化控制

在全球节能减碳和智慧生活需求激增的背景下&#xff0c;基于“用软件定义硬件&#xff0c;让物联运维更简捷更节能”的产品理念&#xff0c;塔能科技的智慧照明一体化方案如新星般崛起&#xff0c;引领照明行业新方向。现在&#xff0c;我们来深入探究其背后的创新技术。该方案…

应对现代生活的健康养生指南

在科技飞速发展的现代社会&#xff0c;人们的生活方式发生了巨大改变&#xff0c;随之而来的是一系列健康问题。快节奏的生活、高强度的工作以及电子产品的过度使用&#xff0c;让我们的身体承受着前所未有的压力。因此&#xff0c;掌握正确的健康养生方法迫在眉睫。 针对久坐不…

服务器间免密登录

1. 生成SSH密钥对 在本地客户端生成SSH密钥对。生成密钥对命令为&#xff1a; ssh-keygen -t rsa 按回车键确认默认设置&#xff0c;生成的密钥对将保存在 ~/.ssh/id_rsa&#xff08;私钥&#xff09;和 ~/.ssh/id_rsa.pub&#xff08;公钥&#xff09;。 2. 上传密钥对至需…

从入门到精通:Linux 权限管理(rwx/chmod/chown)

目录 1. 引言&#xff1a;为什么需要文件权限&#xff1f; 2. 基础概念&#xff1a;理解 rwx 权限 &#xff08;1&#xff09;权限的三种角色 &#xff08;2&#xff09;权限的三种类型 &#xff08;3&#xff09;权限的两种表示法 &#xff08;4&#xff09; 目录的 rwx…

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点&#xff1a; 能更容易地对其进行归档和备份.打印时可以选择双面打印&#xff0c;减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf&#xff0c;双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客户端与 RabbitMQ 服务器通信的虚拟会话通道&#xff0c;其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析&#xff1a; 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…