为什么价值观不同? C++ 指针

2023-11-22

我正在谷歌搜索一个解决方案来找出 C++ 中数组的长度。我发现的解决方案之一是这样的

int arr[] = {1,2,3,4,5,6};
int size = *(&arr+1)-arr; //size is the length of the array

我很困惑&arr and arr因为两者都给出了数组的基地址。再次Google了一下,发现&arr + 1给出不属于数组的下一个内存块的地址,其中arr + 1给出数组中下一个元素的地址。

我编写了以下代码来测试之间的区别&arr and arr:

int arr[] = {1,2,3,4,5,6};
printf("value of &arr + 1 - &arr = %d\n", &arr + 1 - &arr);
printf("value of *(&arr + 1) - arr = %d\n", *(&arr + 1) - arr);

第一个的答案printf is 1作为第二个printf gives 6。这是让我困惑的部分:因为&arr and arr保存同一个数组的基地址,为什么结果不同?


既然“&arr”和“arr”保存的是同一个数组的基地址,为什么结果不同呢?

因为type是不同的。指针运算受指针类型的影响,更具体地说,受所指向对象的类型的影响。

&arr是一个指向 6 int 数组的指针。加 1 会增加下一个 6 个整数的数组(如果它是数组数组的元素)。

arr,虽然是一个数组,但在使用其值时(例如在指针算术表达式中),会衰减为指向数组第一个元素的指针。衰减值是一个指向 int 的指针,加 1 会将指针移动到下一个整数。

附:您可以使用std::size反而。或者std::extentC++17 之前的版本。或者sizeof arr / sizeof *arrC++11 之前的版本。

*(&arr + 1) - arr可能有效,但从技术上讲,通过后尾指针(指向不存在的对象)间接进行,这通常是未定义的行为。我不确定该规则是否存在一些例外,因为该值仅用于衰减为指针。

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

为什么价值观不同? C++ 指针 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • webdriver.get() 和 webdriver.navigate() 之间的区别

    有什么区别get and navigate 方法 此方法或其他方法是否等待页面内容加载 我真正需要的是像 Selenium 1 0 这样的东西WaitForPageToLoad但对于使用viawebdriver 有什么建议么 导航 使用 W
  • 如何以编程方式重命名Google存储中的文件夹?

    我有一个谷歌存储java客户端 我想重命名云端的文件夹 有办法做到吗 我看到了更新帖子但我不知道如何更改名称元数据 这是我的尝试 但我不知道该填写什么 entity 并且没有oac setName public void renameDir
  • Access-Control-Allow-Headers 列表中不存在请求标头

    在我的 API 中 我有以下代码 public class CustomOAuthProvider OAuthAuthorizationServerProvider public override Task MatchEndpoint OA
  • SKSpriteNode,添加到父挂钩/从父挂钩中删除

    当 SKSpriteNode 或 SKNode 添加到父节点或从父节点中删除时 类中是否有任何 最佳实践 方法来挂钩事件 无需 Kobold Kit 您可以对 SKSpriteNode 或任何 SKNode 事实上 进行子类化并扩展remo
  • 从链表中有效地选择一组随机元素

    假设我有一个长度为数字的链表N N非常大 我事先不知道确切的值N 我怎样才能最有效地编写一个将返回的函数k完全地随机数从列表中 有一个非常好的且有效的算法 使用称为水库取样 让我首先给你它history Knuth在 p 上调用该算法 R
  • TPL Dataflow,替代 JoinBlock 限制?

    我寻找 JoinBlock 的替代方案 它可以通过 n TransformBlocks 链接到 并将所有 TransformBlock 源块的消息连接 合并在一起 以便将此类集合传递到另一个数据流块 JoinBlock 可以很好地完成这项工
  • 禁用 MacVim 键盘快捷键

    有什么方法可以禁用 MacVim 中的键盘快捷键吗 我的意思是像这样的快捷方式Cmd s例如 我想说服自己使用类似的东西 w 但如果我可以使用保存文件 我就不能这样做Cmd s 你懂我的意思吗 但我当然仍然想使用 GUI 那么有什么方法可以
  • 如何绘制带有排序水平误差线的图表(带有错误标记的排序条形图)?

    我想将平均值和标准误差绘制为水平条形图 并且我希望对平均值进行排序 我找到了使用格子绘制水平排序条形图的方法 但我不知道如何添加错误标记 以下是我的数据和我想出的 R 代码 data lt structure c 0 67 0 67 0 7
  • 无需克隆即可计算 GitHub 存储库中的行数

    有类似的问题 但所有这些问题都需要您克隆存储库 然后在其上运行一些实用程序 我需要一个可以给我这些统计数据的网络服务 比如使用 URL 例如http my sloc counter com project1从 GitHub 获取项目 1 的
  • 如何将对象序列化为JSON?

    我需要将一些对象序列化为 JSON 并发送到 WebService 如何使用 org json 库来做到这一点 或者我必须使用另一台 这是我需要序列化的类 public class PontosUsuario public int idUs
  • 原生 Java 字节码检测

    对于 Java 中的字节码检测 有 asm 框架以及 bcel 和 javaassist 库 但是 我需要在本机代码中进行检测 因为在 javaagent 运行时已经加载了一些 java 类 例如 java lang Thread java
  • 编辑按钮未显示在 UITabBarController 的 MoreNavigationController 中

    A UITabBarController被压入堆栈 let presenter presentingViewController as UINavigationController let tabvc UITabBarController
  • WCF客户端代理初始化

    我正在使用 WCF 服务并使用 VS 2008 服务引用创建其代理 我正在寻找调用 WCF 服务方法的最佳模式 我是否应该在每次调用服务方法时创建客户端代理实例并在完成后立即关闭客户端 当我分析我的客户端应用程序时 我可以看到在初始化代理客
  • Google SDTT 中的错误:“为 url 提供的所有值必须指向同一页面。”

    我正在尝试为 ecom 网站上的产品列表创建一些 JSON LD 结构化数据 但在使用 Google 的结构化数据测试工具时遇到错误 到目前为止 我有这个 context http schema org type OfferCatalog
  • NSXML解析器错误域 111

    下面的代码打印以下消息 Error Domain NSXMLParserErrorDomain Code 111 The operation couldn t be completed NSXMLParserErrorDomain erro
  • 如何向变成 iBeacon 的 iPhone 发送数据?

    如何将数据发送到充当 iBeacon 的 iPhone 我正在寻找如下流程 搜索附近的 iBeacons 连接到一些 iBeacon 在设备之间交换数据 有谁知道如何将不同的蓝牙功能组合在一起 这可能吗 提前谢谢 标准iBeacons 是仅
  • 更新flutter后启动黑屏

    我最近更新了颤振 为了运行 flutter 项目 我通过 USB 使用 android 更新后 每个项目在启动时都会显示黑屏 以前的版本运行良好 我尝试更改启动画面 drawable launch background xml 在andro
  • 如何检查 uiimage 是否为空? (空、透明)

    这是检查是否存在的最佳方法UIImage是空白的 我有这个绘画编辑器 它返回一个UIImage 如果这张图片上没有任何内容 我不想保存它 试试这个代码 BOOL isImageFlag self checkIfImage image 和 c
  • 可以阻止 Enter 仅从某些输入字段在 JavaScript 中提交表单 [重复]

    这个问题在这里已经有答案了 我有一个表格onkeyup触发为某些字段创建建议框 我能够捕获向上箭头 向下箭头和转义的击键 并相应地使用它们在建议框中移动或关闭它 我想使用 Enter 将他们的选择移动到触发建议的输入字段中 但是 我似乎无法
  • 为什么价值观不同? C++ 指针

    我正在谷歌搜索一个解决方案来找出 C 中数组的长度 我发现的解决方案之一是这样的 int arr 1 2 3 4 5 6 int size arr 1 arr size is the length of the array 我很困惑 arr