c++的char[]和char*的区别

2023-11-18

大家先来看这道测试题:

 

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl; 
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
cout << (str7 == str8) << endl;

如果大家对于这样的输出结果已经心知肚明,那么对于后面的说明,可以当作是帮小弟来查错了。

 

现在来分析一下所以数据的内存分布:

char str1[] = "abc":

      这里的"abc"是一个常量,首先会在常量存储区里存储"abc"这个常量,然后会因为"abc"被赋值给str1[],所以在栈中开辟一段内存,内存大小为4个节点(char数组后会自动加一个'\0'),然后又有一个"abc"被保存在栈中。

      同理,str2[]中的"abc"也是保存在栈中,地址不同。

      到此,有三个"abc"被保存起来,一个在常量存储区,另外两个在栈中。

      此外,插一句,c++内存被分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

const char str3[] = "abc":

      对于这种被const修饰起来的变量,一般也是被保存在常量存储区,但是,但是对于const数组来讲,系统不确定符号表是否有足够的空间来存放const数组,所以还是为const数组分配内存的。所以str3指向的是栈上的"abc"。

      同理,str4[]也是保存在栈中,地址不同。

const char *str5 = "abc":

      因为"abc"在常量存储区中保存有一份(即使没保存,这样的操作也会新建一份),这里str5定义的时候,嘿,我见过这个,str5就可以开心的直接指向"abc"所在的常量区的地址。

      同理str6,str7,str8。与const没有半毛钱关系,const只是使得str5和str6无法指向新的字符串常量(也就是新的地址)。

 

这道题的输出结果是:

 

最后,还是一个小测试:

 

 

char ch1 = 'a';
char ch2 = 'a';
const char ch3 = 'a';
const char ch4 = 'a';

cout << (ch1 == ch2) << endl;
cout << (ch3 == ch4) << endl;

大家可以思考一下结果是什么...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++的char[]和char*的区别 的相关文章

  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • 找不到 HttpContextBase 命名空间

    public string GetCartId HttpContextBase context if context Session CartSessionKey null if string IsNullOrWhiteSpace cont
  • stl 集的 C# 等效项是什么?

    我想使用 C 将一些值存储在平衡二叉搜索树中 我查看了泛型命名空间中的集合 但没有找到与 stl 集合等效的集合 我可以使用什么通用集合 我不想存储键 值对 只是值 你可以使用HashSet http msdn microsoft com
  • 运行 C# exe 文件

    复制 为什么我的 NET 应用程序在从网络驱动器运行时会崩溃 https stackoverflow com questions 148879 why does my net application crash when run from
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>

    从 App Store 更新到 Command Line Tools 6 3 后 程序包括
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录?

    有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录 我们正在使用我们自己的抽象 我不希望在使用 Serilog 时来自 Hangfire 记录器的所有额外噪音 INIT call under web project na
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 使用 unrar 库 - 将文件提取到文件流缓冲区中

    我需要的是能够将 rar 文件中的文件提取到流中 我正在创建一个测试用例来了解如何使用解压源文件 http www rarlab com rar unrarsrc 3 9 9 tar gz 我已经搜索和修补了一段时间 但我不知道如何使用该库
  • 如何修改 edmx 的默认代码生成策略?

    我想修改默认的代码生成策略 该怎么做 我只是想修改类名 lt code Escape container gt to Entities并将默认连接字符串更改为name Default 我不想为该项目创建模板文件 我想编辑它以便它可以在全球范
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 恐怖分子已弃用

    正在接听另一个问题 https stackoverflow com q 11830514 1468366 我偶然发现了man page http linux die net man 3 herror一个名为的函数herror 看起来很像pe
  • 返回右值 - 这段代码有什么问题? [复制]

    这个问题在这里已经有答案了 我遇到了以下代码片段 std string test std string m Hello return std move m int main std string m test 我知道上面的代码是不正确且不安

随机推荐

  • 在Linux上面进行远程git的数据拉取与上传

    1 安装git sudo apt get update sudo apt get install git 2 查看本地git信息 git version 3 在当前路径下创建一个本地git仓库 sudo git init 4 上传当前的文件
  • TIM输出比较

    以下内容均来自 bilibili江协科技 OC输出比较 输出比较可以通过CNT与CCR寄存器值的关系 来对输出电平进行置1 置0或翻转的操作 用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器
  • 正负号 substr java_实战LeetCode 系列(一) (题目+解析)

    1 反转字符串 编写一个函数 其作用是将输入的字符串反转过来 示例 1 输入 hello 输出 olleh 示例 2 输入 A man a plan a canal Panama 输出 amanaP lanac a nalp a nam A
  • 8.性能测试流程及策略

    8 性能测试流程及策略 一 准备工作 1 系统基础功能验证 性能测试在什么阶段适合实施 切入点很重要 一般而言 只有在系统基础功能测试验证完成 系统区域稳定的情况下 才会进行性能测试 否则性能测试是无意义的 2 测试团队组建 根据项目的具体
  • 高防cdn有什么优势?

    CDN即内容分发网络 通过在网络上各处放置节点服务器 来协助网站进行缓存 当用户访问网站时 就近分配节点为用户提供服务 从而加快访问速度 提升用户体验 但是普通的cdn并没有防御能力 那么这时就需要用到高防cdn来应对网络上的攻击 下面为大
  • Matlab:从文本文件中读取数值数据到矩阵

    Matlab 从文本文件中读取数值数据到矩阵 在Matlab中 我们常常需要将保存在文本文件中的数值数据读取到程序中 以便进行数据处理和分析 本文将介绍如何使用Matlab将文本文件中的数值数据导入到矩阵中 首先 我们需要创建一个文本文件
  • pandas-新手使用教程

    Pandas 是 Python 语言的一个扩展程序库 用于数据分析 下面将针对该模块进行讲解 一 导入模块 导入pandas模块 import pandas as pd 二 导入数据 常见用法 创建数据框 pd DataFrame 从CSV
  • C# --- Case Study

    C Case Study C Mongo数据库事务的应用 C 如何解析Json文件并注入MongoDB C MongoDB如何安全的替换Collection C netcore MVC项目框架结构 with MongoDB
  • 积分获取方式的两点优化建议

    积分获取是积分体系运营中的一个重要环节 也是针对用户运营的一个开端 如果积分获取做的不到位 那么商家就没法对用户的行为进行引导 也就没法实现商家的预期目标 整个积分体系就相当于白忙活了 这一点商家要特别的注意 在积分体系运营中 商家对于积分
  • 网课-cnn

    图像识别中遇到的问题可能有图片特征的纬度过高 1000 1000像素的图片 特征维度是1000 1000 3 如果你要输入3百万的数据量就意味着特征向量的维度高达三百万 也许有1000个隐藏单元 而所有的权值组成的矩阵W 1 如果使用标准的
  • git第一次配置ssh key,clone代码出错解决方法

    错误 The authenticity of host can t be established ED25519 key fingerprint is SHA256 k4ViHJBFryacGI BqHphyjDBaRLwt5eSGRMJG
  • vue table合并行 动态列名

    需求 1 合并行 相同数据合并 2 根据后端返回数据动态显示列名 我这个业务需求是 每年增加一列 也就是列名不是固定的 后端返回数据每年会多一条数据 根据返回数据显示列名 实现 html
  • 论文阅读 StyleCLIP:《StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery》

    论文地址 https arxiv org pdf 2103 17249 pdf 文章目录 摘要 1 介绍 2 相关工作 2 1 视觉与语言 2 2 潜空间图像处理 3 StyleCLIP文本驱动操作 4 潜在优化 5 潜在映射 6 全局方向
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络 友谊篇 低功耗蓝牙 Bluetooth Low Energy 是全球最具节能性的短距离无线通信技术之一 其低功耗的特性广受开发者和消费者赞誉 随着蓝牙mesh网络的推出 开发者可能想知道蓝牙mesh网
  • Python3 如何优雅地使用正则表达式(详解五)

    非捕获组命名组 精心设计的正则表达式可能会划分很多组 这些组不仅可以匹配相关的子串 还能够对正则表达式本身进行分组和结构化 在复杂的正则表达式中 由于有太多的组 因此通过组的序号来跟踪和使用会变得困难 有两个新的功能可以帮你解决这个问题 非
  • 线性稳压器基础知识

    1 1 什么是线性稳压器 线性稳压器的工作原理是 采用一个压控电流源以强制在稳压器输出端上产生一个固定 电压 控制电路连续监视 检测 输出电压 并调节电流源 根据负载的需求 以把输 出电压保持在期望的数值 电流源的设计极限限定了稳压器在仍然
  • C++输入输出(一)

    C 并没有专门的输入输出函数 他们都存在于库中 如果要使用cout cin和getline 需要导入iostream库 如果要是用其他的输入输出方式 需要导入cstdio库 一 cout流输出 这个输出方式我们很早就学过了 他的使用方式如下
  • Home Assistant 南方电网 计算电费

    目录 1 China Southern Power Grid Statistics集成 2 获取当月用电情况 3 计算电费然后在UI上显示 3 效果 1 China Southern Power Grid Statistics集成 链接 2
  • ANSYS WORKBENCH 后处理 之 提取截面查看云图

    这是一个结果的云图 现在想要查看管道某横截面的云图 步骤1右键coordinate systems 创建一个坐标系步骤2更改新建坐标轴属性 步骤3新建一个surface 定义中选择刚才创建的坐标系步骤4右键solution 选择刚才创建的面
  • c++的char[]和char*的区别

    大家先来看这道测试题 char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc c