C++ 常见面试题(二)

11 一个参数可以既是const又是volatile吗

可 以 , 用 c o n s t 和 v o l a t i l e 同 时 修 饰 变 量 , 表 示 这 个 变 量 在 程 序 内 部 是 只 读 的 , 不 能 改 变 的 , 只 在 程 序 外 部 条 件 变 化 下 改 变 , 并 且 编 译 器 不 会 优 化 这 个 变 量 。 每 次 使 用 这 个 变 量 时 , 都 要 小 心 地 去 内 存 读 取 这 个 变 量 的 值 , 而 不 是 去 寄 存 器 读 取 它 的 备 份 。

注 意 : 在 此 一 定 要 注 意 c o n s t 的 意 思 , c o n s t 只 是 不 允 许 程 序 中 的 代 码 改 变 某 一 变 量 , 其 在 编 译 期 发 挥 作 用 , 它 并 没 有 实 际 地 禁 止 某 段 内 存 的 读 写 特 性 。

12 a 和&a 有什么区别 

& a : 其 含 义 就 是 “ 变 量 a 的 地 址 ” 。

  • * a : 用 在 不 同 的 地 方 , 含 义 也 不 一 样 。
  • 在声明语句中,*a只说明a是一个指针变量,如int *a;
  • 在其他语句中,*a前面没有操作数且a是一个指针时,*a代表指针a指向的地址内存放的数据,如b=*a;
  • *a前面有操作数且a是一个普通变量时,a 代 表 乘 以 a , 如 c = b a。 

13 用C 编写一个死循环程序 

while(1)
{ } 

注 意 : 很 多 种 途 径 都 可 实 现 同 一 种 功 能 , 但 是 不 同 的 方 法 时 间 和 空 间 占 用 度 不 同 , 特 别 是 对 于 嵌 入 式 软 件 , 处 理 器 速 度 比 较 慢 , 存 储 空 间 较 小 , 所 以 时 间 和 空 间 优 势 是 选 择 各 种 方 法 的 首 要 考 虑 条 件 。

14 结构体内存对齐问题

请 写 出 以 下 代 码 的 输 出 结 果 :

#include<stdio.h>
struct S1
{int i:8;char j:4;int a:4;double b;
};
struct S2
{int i:8;char j:4;double b;int a:4;
}
struct S3
{int i;char j;double b;int a;
};
int main()
{printf("%d\n",sizeof(S1)); // 输出8printf("%d\n",sizeof(S1); // 输出12printf("%d\n",sizeof(Test3)); // 输出8return 0;
}

 sizeof(S1)=16

sizeof(S2)=24

sizeof(S3)=32

说 明 : 结 构 体 作 为 一 种 复 合 数 据 类 型 , 其 构 成 元 素 既 可 以 是 基 本 数 据 类 型 的 变 量 , 也 可 以 是 一 些 复 合 型 类 型 数 据 。 对 此 , 编 译 器 会 自 动 进 行 成 员 变 量 的 对 齐 以 提 高 运 算 效 率 。 默 认 情 况 下 , 按 自 然 对 齐 条 件 分 配 空 间 。 各 个 成 员 按 照 它 们 被 声 明 的 顺 序 在 内 存 中 顺 序 存 储 , 第 一 个 成 员 的 地 址 和 整 个 结 构 的 地 址 相 同 , 向 结 构 体 成 员 中 s i z e 最 大 的 成 员 对 齐 。 许 多 实 际 的 计 算 机 系 统 对 基 本 类 型 数 据 在 内 存 中 存 放 的 位 置 有 限 制 , 它 们 会 要 求 这 些 数 据 的 首 地 址 的 值 是 某 个 数 k ( 通 常 它 为 4 或 8 ) 的 倍 数 , 而 这 个 k 则 被 称 为 该 数 据 类 型 的 对 齐 模 数 。

15 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎 么知道的? 

  • 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占 内存释放);
  • 而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束 (函数调用完毕),局部变量消失,所占据的内存释放。
  • 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行 的时候被加载.局部变量则分配在堆栈里面。 

16 简述C、C++程序编译的内存分配情况 

  • 从静态存储区域分配: 内 存 在 程 序 编 译 时 就 已 经 分 配 好 , 这 块 内 存 在 程 序 的 整 个 运 行 期 间 都 存 在 。 速 度 快 、 不 容 易 出 错 , 因 为 有 系 统 会 善 后 。 例 如 全 局 变 量 , s t a t i c 变 量 , 常 量 字 符 串 等 。
  • 在栈上分配: 在 执 行 函 数 时 , 函 数 内 局 部 变 量 的 存 储 单 元 都 在 栈 上 创 建 , 函 数 执 行 结 束 时 这 些 存 储 单 元 自 动 被 释 放 。 栈 内 存 分 配 运 算 内 置 于 处 理 器 的 指 令 集 中 , 效 率 很 高 , 但 是 分 配 的 内 存 容 量 有 限 。 大 小 为 2 M 。
  • 从堆上分配: 即 动 态 内 存 分 配 。 程 序 在 运 行 的 时 候 用 m a l l o c 或 n e w 申 请 任 意 大 小 的 内 存 , 程 序 员 自 己 负 责 在 何 时 用 f r e e 或 d e l e t e 释 放 内 存 。 动 态 内 存 的 生 存 期 由 程 序 员 决 定 , 使 用 非 常 灵 活 。 如 果 在 堆 上 分 配 了 空 间 , 就 有 责 任 回 收 它 , 否 则 运 行 的 程 序 会 出 现 内 存 泄 漏 , 另 外 频 繁 地 分 配 和 释 放 不 同 大 小 的 堆 空 间 将 会 产 生 堆 内 碎 块 。 

一 个 C 、 C + + 程 序 编 译 时 内 存 分 为 5 大 存 储 区 : 堆 区 、 栈 区 、 全 局 区 、 文 字 常 量 区 、 程 序 代 码 区 。

17 简述strcpy、sprintf 与memcpy 的区别 

  • 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型, 目的操作 对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。
  • 执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。
  • 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字 符串的转 化,memcpy 主要是内存块间的拷贝。

注 意 : s t r c p y 、 s p r i n t f 与 m e m c p y 都 可 以 实 现 拷 贝 的 功 能 , 但 是 针 对 的 对 象 不 同 , 根 据 实 际 需 求 , 来 选 择 合 适 的 函 数 实 现 拷 贝 功 能 。 

18 请解析(*(void (*)( ) )0)( )的含义 

  • void (*0)( ) : 是一个返回值为void,参数为空的函数指针0。
  • (void (*)( ))0: 把0转变成一个返回值为void,参数为空的函数指针。
  • *(void (*)( ))0: 在上句的基础上加*表示整个是一个返回值为void,无参数,并且起始地址为0的函 数的名字。
  • (*(void (*)( ))0)( ): 这就是上句的函数名所对应的函数的调用。

19 C语言的指针和引用和c++的有什么区别? 

  • 指针有自己的一块空间,而引用只是一个别名;
  • 使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
  • 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对 象;
  • 可以有const指针,但是没有const引用;
  • 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;
  • 指针可以有多级指针(**p),而引用止于一级;
  • 指针和引用使用++运算符的意义不一样;
  •  如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

20 typedef 和define 有什么区别 

  • 用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义 常量,以及 书写复杂使用频繁的宏。
  • 执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其 发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
  • 作用域不同:typedef 有作用域限定。define 不受作用域约束,只要是在define 声明后的引用 都是正确 的。
  • 对指针的操作不同:typedef 和define 定义的指针时有很大的区别。

注 意 : t y p e d e f 定 义 是 语 句 , 因 为 句 尾 要 加 上 分 号 。 而 d e f i n e 不 是 语 句 , 千 万 不 能 在 句 尾 加 分 号 。 

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

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

相关文章

《零基础Go语言算法实战》【题目 1-14】字符串的替换

《零基础Go语言算法实战》 【题目 1-14】字符串的替换 请编写一个函数&#xff0c;将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存 放新增的字符&#xff0c;并且知道字符串的真实长度&#xff08;≤ 1000&#xff09;&#xff0c;同时保证字符串由大小写的…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议&#xff0c;可以做到数据的实时推送&#xff0c;可适用于广泛的工作环境&#xff0c;例如客服系统、物联网数据传输系统&#xff0c; 基础介绍 我们平常接触最多的是 http 协议的接口&#xff0c;http 协议是请求与响应的模式&…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

代码随想录算法训练营day27

代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 贪心算法理论基础 ● 455.…

idea全局替换显示不全(ctrl+shift+R)

修改一下idea的配置就行 idea的默认显示条数为100&#xff0c;可以修改成10000

新版2024AndroidStudio项目目录结构拆分

如题 下载了最新版的android studio 发现目录结构和以前不一样 自动帮你合并了 如何层层抽丝剥茧呢 按照一下步骤即可解决问题&#xff01;

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

一.MySQL程序简介

整体介绍 1.服务端mysqld(可执行文件) mysqld --verbose --help 2.客户端mysql(可执行文件) 3.其它工具包程序

Jenkins-持续集成、交付、构建、部署、测试

Jenkins-持续集成、交付、构建、部署、测试 一: Jenkins 介绍1> Jenkins 概念2> Jenkins 目的3> Jenkins 特性4> Jenkins 作用 二&#xff1a;Jenkins 版本三&#xff1a;DevOps流程简述1> 持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff0…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

socket网络编程-TC/IP方式

网络编程 1.概念&#xff1a;两台设备之间通过网络数据传输。 2.网络通信&#xff1a;将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口&#xff0c;提供程序员使用&#xff0c;完成网络通信。 TCP和UDP TCP协议&#xff1a; 1.使用TCP协…

G1原理—2.G1是如何提升分配对象效率

大纲 1.G1的对象分配原理是怎样的 2.深入分析TLAB机制原理 3.借助TLAB分配对象的实现原理是什么 4.什么是快速分配 什么是慢速分配 5.大对象分配的过程 与TLAB的关系 6.救命的稻草—JVM的最终分配尝试 G1如何分配对象TLAB机制分区协调机制 G1设计了一套TLAB机制快速分…

Wsl报 不存在具有提供的名称的分布

在使用wsl --set-version Ubuntu 2命令升级WSL2时&#xff0c; 不存在具有提供的名称的分布&#xff0c;如下图。 图片 解决的办法也很简单&#xff0c;只需要把该命令的 Ubuntu 改为具体使用的发行版全称即可。此处&#xff0c;使用“wsl -l -v”命令显示安装的Ubuntu 版本。 …

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

计算机网络例题

IP地址分类&#xff1a; A类&#xff1a;网络号范围&#xff1a; 1~126 &#xff08;0000 0001 ~ 0111 1110&#xff09; B类&#xff1a;网络号范围&#xff1a;128.1 ~ 191.255 &#xff08;可用范围&#xff09; C类&#xff1a;网络号段范围&#xff1a;192.0.1 ~ 223.2…

【大数据基础】大数据概述

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识&#xff0c;分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数…

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介&#xff1a;系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a;系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…

C#中的常用集合

目录 一、动态数组ArrayList 二、List 三、栈&#xff08;Stack&#xff09; 四、队列&#xff08;Queue&#xff09; 五、字典&#xff08;Dictionary&#xff09;,int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类&#xff0c;位于命名空间 Syste…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…