突破编程_C++_面试(数组(1))

面试题1:详细说明一下数组名是什么?

在 C++ 中,数组名代表数组首元素的地址。更具体地说,数组名是一个指向数组第一个元素的常量指针。这意味着,当使用数组名时,实际上是在使用指向数组第一个元素的指针。
例如,如果你有一个整数数组 int vals[5]; ,那么 vals 就是一个指向 int 类型的指针,它指向 vals[0] 的地址。因此, vals 和 &vals[0] 是等价的。
虽然数组名可以像指针一样使用,但它并不是真正的指针。它不能被重新赋值指向数组的其他位置,也不能被递增或递减。尝试这样做会导致编译错误。
这里有一些重要的点需要注意:
(1)数组名不是指针:尽管数组名可以像指针一样使用,但它本身不是一个指针变量。数组名是一个常量表达式,它不能被修改。
(2)数组名转换为指针:当数组名作为函数参数传递时,或者当它被用在需要指针的上下文中时,它会被隐式地转换为指向数组第一个元素的指针。
(3)数组名和指针的不同:可以改变一个指针变量的值让它指向不同的内存位置,但不能改变数组名让它指向数组中的其他元素或不同的数组。
下面是一个简单的示例,展示了数组名如何被用作指针:

#include <iostream>int main()
{int vals[5] = { 1, 2, 3, 4, 5 };// 使用数组名作为指针int* ptr = vals; // ptr 指向 vals[0] 的地址// 输出数组的第一个元素std::cout << "vals[0] = " << *vals << std::endl; // 输出 1std::cout << "ptr[0] = " << *ptr << std::endl; // 输出 1std::cout << "vals == &vals[0] = " << (vals == &vals[0]) << std::endl; // 输出 1(true)// 数组名不能被修改// vals = &vals[1]; // 这是非法的,会导致编译错误return 0;
}

在上面代码中,vals、 &vals[0] 和 ptr 都指向相同的内存地址,即数组的第一个元素的地址。然而,只有 ptr 可以被重新赋值指向其他位置,而 vals 则始终保持不变,指向数组的第一个元素。

面试题2:数组是一块连续的内存么?

是的, C++ 中的数组是一块连续的内存区域。当声明一个数组时, C++ 会在内存中为数组分配一块连续的空间,这块空间的大小是数组元素类型的大小乘以数组的大小(元素个数)。
数组元素在内存中是紧密排列的,这意味着每个元素都紧挨着前一个元素存储。这种连续的内存布局有几个重要的特点:
高效访问
由于数组元素是连续存储的,所以可以通过简单的偏移量快速访问任何元素。例如,如果有一个整数数组 int vals[10]; ,那么 vals[2] 就是 vals[0] 之后的第 2 个整数,可以直接通过 vals + 2 或者 &vals[0] + 2 * sizeof(int) 来访问。
快速遍历
连续的内存布局使得遍历数组变得非常高效。可以使用指针或迭代器轻松地遍历数组的所有元素。
空间局部性
由于数组元素是连续存储的,它们通常会被加载到缓存中,这有助于减少 CPU 访问内存的次数,从而提高程序的性能。
限制
数组的大小在编译时确定,并且一旦分配了内存,就不能改变数组的大小。这种连续内存分配方式要求数组的大小是固定的。
自动管理
在 C++ 中,当你声明一个局部变量数组时,数组的内存会在进入作用域时自动分配,并在离开作用域时自动释放。这种自动内存管理可以避免内存泄漏和其他与手动内存管理相关的问题。
需要注意的是,如果动态地分配数组(例如使用 new 关键字),那么你需要自己负责在不再需要数组时释放内存(使用 delete[] )。否则,可能会导致内存泄漏。

面试题3:多维数组如何声明和初始化?

在 C++ 中,多维数组可以通过在数组类型后面跟随多个方括号和大小来声明。多维数组的初始化可以通过在声明时提供初始化列表来完成,其中每个内部列表对应数组的一个维度。
下面是一个二维数组(也称为矩阵)的声明和初始化的例子:

// 声明一个3x3的二维数组
int matrix[3][3];// 初始化一个3x3的二维数组
int matrix[3][3] = 
{{1, 2, 3},{4, 5, 6},{7, 8, 9}
};

在这个例子中, matrix 是一个 3x3 的整数数组,每个元素都被初始化为 0 (如果没有显式初始化)。初始化列表为数组的每个元素提供了具体的值。
对于更高维度的数组,可以继续添加更多的方括号和大小。例如,一个三维数组可以这样声明和初始化:

// 声明一个2x3x4的三维数组
int cube[2][3][4];// 初始化一个2x3x4的三维数组
int cube[2][3][4] = 
{{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}},{{13, 14, 15, 16},{17, 18, 19, 20},{21, 22, 23, 24}}
};

在多维数组的初始化中,可以省略内部维度的大小,让编译器自动计算它们。但是,第一个维度的大小必须明确指定。例如:

// 声明并初始化一个3x自动计算大小的二维数组
int arr[3][] = 
{{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 编译器会自动计算内部维度的大小,这里是3

面试题4:如何比较两个数组是否相等?

在C++中,比较两个数组是否相等通常涉及检查两个数组的每个元素是否都相同。这可以通过编写一个函数或使用标准库算法来完成。以下是几种比较两个数组是否相等的方法:
方法1:使用循环遍历数组
可以通过编写一个函数来遍历两个数组,并逐个比较它们的元素。

#include <iostream>bool isArraysEqual(const int* arr1, const int* arr2, size_t size) 
{for (size_t i = 0; i < size; ++i) {if (arr1[i] != arr2[i]) {return false;}}return true;
}int main() 
{int arr1[3] = {1, 2, 3};int arr2[3] = {1, 2, 3};bool equalFlag = isArraysEqual(arr1, arr2, 3);return 0;
}

方法2:使用 std::equal 算法

C++标准库提供了 std::equal 算法,它可以比较两个范围是否相等。要使用它,需要包含 <algorithm> 头文件,并确保数组是 C 风格的数组或者是可以通过迭代器访问的容器(如 std::vector )。

#include <iostream>
#include <algorithm>int main() 
{int arr1[3] = {1, 2, 3};int arr2[3] = {1, 2, 3};bool equalFlag = std::equal(std::begin(arr1), std::end(arr1), std::begin(arr2));return 0;
}

在这个例子中, std::begin 和 std::end 分别用于获取数组的开始和结束迭代器。如果两个数组相等, std::equal 将返回 true ;否则返回 false 。
注意事项
(1)当使用 std::equal 时,确保两个数组的大小相同,否则比较可能会产生未定义的行为。
(2)如果数组中的元素是对象而不是基本类型,可能需要自定义比较函数或操作符来比较对象。
(3)上述示例中的数组大小是硬编码的。在实际应用中,你可能需要传递数组的大小作为参数,或者使用容器(如 std::vector )来动态管理数组的大小。
(4)如果数组元素是基本类型,且数组大小已知,可以直接使用 memcmp 函数进行比较,但这通常只适用于 C 风格的数组。

面试题5:数组和指针有什么区别?

数组和指针的区别如下:
定义和存储
数组是一个用于存储多个相同类型数据的有序集合,它在内存中占据一块连续的空间。数组的大小在编译时确定,并且在整个生命周期内保持不变。而指针是一个变量,它存储的是另一个变量在内存中的地址。指针可以随时指向任意内存地址,因此它的特征是可变。
赋值和访问
数组的元素赋值或拷贝需要逐个进行。例如, arr[0] = value; 将会把 value 赋值给数组 arr 的第一个元素。而指针变量可以相互赋值,如 ptr1 = ptr2; 。在访问数据时,数组名使用下标来引用元素,如 arr[i] 。指针则需要通过解引用操作符 * 来访问它所指向的值,如 *ptr 。
表示范围
数组的有效范围就是其空间的范围,数组名使用下标引用元素,不能指向别的数组。指针可以指向任何地址,但是不能随意访问,必须依附在变量的有效范围之内。
内存大小
数组所占的存储空间大小可以通过 sizeof(数组名) 得到,而数组的大小(即元素个数)可以通过 sizeof(数组名) / sizeof(数据类型) 计算。指针的大小则是由指针类型决定的,例如,在 32 位系统中,指针的大小通常为 4 字节;在 64 位系统中,指针的大小通常为8字节。
函数参数传递
当数组作为函数的参数进行传递时,数组将自动退化为同类型的指针。因此,传入数组做参数时一般需要将其长度也作为参数传入,因为函数内部无法直接获取数组的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux环境下JPS命令未找到

说明 根据小编blog安装JDK后&#xff0c;无使用JPS命令&#xff0c;是因为缺少openjdk-devel包 Linux 上安装及卸载JDK&#xff08;包含yum方式&#xff09;-CSDN博客 安装devel [rootnamenode ~]# jps bash: jps: command not found...查看devel版本 [rootnamenode ~]# yu…

【深度学习:对象跟踪】对象跟踪完整指南 [教程]

【深度学习&#xff1a;对象跟踪】对象跟踪完整指南 [教程] 什么是计算机视觉中的对象跟踪&#xff1f;对象跟踪有哪些不同类型&#xff1f;图像跟踪视频跟踪单目标跟踪多对象跟踪 计算机视觉中对象跟踪的用例监测零售自动驾驶汽车医疗保健 对象跟踪方法步骤 1&#xff1a;目标…

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node&#xff0c;npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代&#xff0c;安卓与iOS系统犹如两位王者&#xff0c;各自拥有庞大的用户群体。有人钟情于安卓的开放与多样&#xff0c;有人偏爱iOS的流畅与稳定。甚至&#xff0c;有些人为了满足不同需求&#xff0c;同时使用着两个系统的手机。我就是其中的一员。 工作中…

STM32H7 系列 MCU 内部 SRAM

通过参看《STM32H7 参考手册》“2.4 Embedded SRAM”章节知道 The STM32H743/53xx and STM32H750xB 内存特性: Up to 864 Kbytes of System SRAM 128 Kbytes of data TCM RAM 64 Kbytes of instruction TCM RAM 4 Kbytes of backup SRAM 1.1 TCM SRAM TCM : Tightly-Coupled …

利用Python将文件夹下多个txt文本写入到同一个excel中(每一个文件占一行)

1、 将文件夹下多个txt文本写入到同一个excel中&#xff08;每一个文件占一行&#xff09;: # -*- coding: utf-8 -*- import os import pandas as pd# 获取文件夹中的所有txt文件 folder_path rG:\Cygwin\ txt_files [f for f in os.listdir(folder_path) if f.endswith(.t…

攻防世界-web-Training-WWW-Robots

题目信息 In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it. Sometimes these files rev…

你正在读的书,暴露了你的阶层!丰富自己吧!——早读

明天大概率可以看鸽子了 引言Python代码第一篇 人民日报 全网等的图来了&#xff01;当故宫“遇上”龙年初雪第二篇 人民日报【夜读】一个人最好的生活方式&#xff0c;是丰富自己第三篇&#xff08;跳&#xff09; 洞见 你正在读的书&#xff0c;暴露了你的阶层第四篇&#xf…

Maven私服搭建Nexus3

第一部分&#xff1a;仓库部署 下载地址&#xff1a;https://help.sonatype.com/en/download.html 备用下载链接&#xff0c;部分已经失效了 解压后会有两个文件夹&#xff1a; nexus-3.20.1-01 sonatype-work 访问地址配置路径 \nexus-3.20.1-01\bin\nexus.vmoptions -Xms1…

喀秋莎画中画怎么设置 喀秋莎画中画视频怎么导出 喀秋莎什么意思 camtasia studio下载

画中画视频&#xff0c;顾名思义&#xff0c;就是在一个视频中有两个画面&#xff0c;游戏解说、微课等类型的视频常常就以画中画的形式出现。作为一款专业的视频编辑软件&#xff0c;使用camtasia可以轻松地制作画中画视频并导出。接下来我将为大家介绍&#xff1a;喀秋莎画中…

每日coding 337打家劫舍III

337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。…

【Linux】日志命令行练习(持续更新)

文章目录 前言环境情景1. 获取实时日志2. 关键字定位3. 关键字取并集4. 关键字取交集5. 关键字取差集6. 关键字实时日志捕获7. 关键词上下文打印8. 关键词滚动搜索9. 看最早的日志信息 前言 公司生产问题需要登录堡垒机排查。 没有日志平台的情况下&#xff0c;生产问题同样要…

网络设备产业链中万兆电口模块的生产、销售与市场布局

随着网络通信技术的快速发展&#xff0c;万兆电口模块作为新一代的高速网络连接解决方案&#xff0c;在网络设备产业链中占据着重要的地位。本文将深入探讨万兆电口模块的生产、销售与市场布局&#xff0c;以揭示其在网络设备产业链中的地位和影响。 一、万兆电口模块的生产 生…

【Linux】自主WEB服务器实现

自主web服务器实现 1️⃣构建TcpServer2️⃣构建HttpServer3️⃣构建HttpRequest和HttpResponseHttp请求报文格式Http相应报文读取、处理请求&构建响应读取请求中的一行读取请求中需要注意的点 4️⃣CGI模式判断是否需要用CGI处理请求构建任务&线程池管理 5️⃣实验结果…

路由器配置DMZ主机映射

路由器配置DMZ主机映射 光猫路由模式配置方法 光猫路由模式是用光猫进行拨号连接&#xff0c;所有设备通过光猫访问互联网&#xff0c;只需要设置光猫的DMZ主机映射地址为局域网主机即可 光猫桥接模式配置方法 光猫桥接模式&#xff0c;是穿透光猫&#xff0c;通过路由器拨…

《图解设计模式》笔记(二)交给子类

三、Template Method模式&#xff1a;将具体处理交给子类 示例程序类图 public static void main(String[] args) {// 生成一个持有H的CharDisplay类的实例AbstractDisplay d1 new CharDisplay(H);// 生成一个持有"Hello, world."的StringDisplay类的实例AbstractD…

C++ Linux多线程

1. C语言线程安全问题 1.1 线程安全问题 #include <stdio.h> #include <tinycthread.h> #include <io_utils.h>int count 0; int Counter(void*arg) {for(int i 0;i<100000;i){count;/** int temp count;* counttemp1;* return temp;* */}return 0; …

大模型训练流程(三)奖励模型

为什么需要奖励模型 因为指令微调后的模型输出可能不符合人类偏好&#xff0c;所以需要利用强化学习优化模型&#xff0c;而奖励模型是强化学习的关键一步&#xff0c;所以需要训练奖励模型。 1.模型输出可能不符合人类偏好 上一篇讲的SFT只是将预训练模型中的知识给引导出来…

python3 中的@dataclass

dataclass 是 Python 3.7 引入的一个装饰器&#xff0c;用于方便地定义符合数据类协议的类。数据类是一种只包含数据的简单类&#xff0c;通常用于存储数据而不包含任何业务逻辑。 使用 dataclass 装饰器可以自动为类生成各种方法&#xff0c;例如 __init__()、__repr__()、__…

Vue+SpringBoot打造大学兼职教师管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0c;旨…